问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

C语言求解三次方程的三种方法

创作时间:
作者:
@小白创作中心

C语言求解三次方程的三种方法

引用
1
来源
1.
https://docs.pingcode.com/baike/1055066


在C语言中求解三次方程的方法包括使用数值方法、迭代方法和库函数。其中,数值方法最为常见,包含使用三次方程求根公式、牛顿迭代法和分段法。本文将详细介绍这些方法,并提供代码示例和相关注意事项。

一、三次方程的基本知识

三次方程的一般形式为:

[ ax^3 + bx^2 + cx + d = 0 ]

其中,( a, b, c, ) 和 ( d ) 为常数,( x ) 为未知数。三次方程最多有三个实根,可能为实数或复数。

二、使用三次方程求根公式

三次方程求根公式是解析方法之一,能够直接求出三次方程的根。公式较为复杂,但其准确性较高。

1.1 三次方程求根公式

三次方程 ( ax^3 + bx^2 + cx + d = 0 ) 的求根公式如下:

[ Delta_0 = b^2 – 3ac ]

[ Delta_1 = 2b^3 – 9abc + 27a^2d ]

其中,( omega = e^{2pi i / 3} ) 为复数单位根,( k = 0, 1, 2 )。

1.2 代码实现

以下是使用三次方程求根公式的C语言实现:

#include <stdio.h>
#include <math.h>  
#include <complex.h>  
void solveCubicEquation(double a, double b, double c, double d) {  
    double delta0 = b * b - 3 * a * c;  
    double delta1 = 2 * b * b * b - 9 * a * b * c + 27 * a * a * d;  
    double complex C = cpow((delta1 + csqrt(delta1 * delta1 - 4 * delta0 * delta0 * delta0)) / 2.0, 1.0 / 3.0);  
    double complex omega = -0.5 + 0.5 * I * sqrt(3);  // e^(2*pi*i/3)  
    for (int k = 0; k < 3; k++) {  
        double complex x = -1.0 / (3 * a) * (b + cpow(omega, k) * C + delta0 / (cpow(omega, k) * C));  
        printf("Root %d: %.2f + %.2fin", k + 1, creal(x), cimag(x));  
    }  
}  
int main() {  
    double a, b, c, d;  
    printf("Enter coefficients a, b, c, d: ");  
    scanf("%lf %lf %lf %lf", &a, &b, &c, &d);  
    solveCubicEquation(a, b, c, d);  
    return 0;  
}  

三、使用牛顿迭代法

牛顿迭代法是一种数值求解方法,通过迭代逼近方程的根,适用于复杂方程。

2.1 牛顿迭代法原理

牛顿迭代法的基本公式为:

[ x_{n+1} = x_n – frac{f(x_n)}{f'(x_n)} ]

其中,( f(x) ) 为目标方程,( f'(x) ) 为其导数。

2.2 代码实现

以下是使用牛顿迭代法求解三次方程的C语言实现:

#include <stdio.h>
#include <math.h>  
double f(double x, double a, double b, double c, double d) {  
    return a * x * x * x + b * x * x + c * x + d;  
}  
double f_prime(double x, double a, double b, double c) {  
    return 3 * a * x * x + 2 * b * x + c;  
}  
void solveCubicNewton(double a, double b, double c, double d) {  
    double x = 0;  // Initial guess  
    double tolerance = 1e-7;  
    int maxIterations = 1000;  
    for (int i = 0; i < maxIterations; i++) {  
        double fx = f(x, a, b, c, d);  
        double fx_prime = f_prime(x, a, b, c);  
        double x_new = x - fx / fx_prime;  
        if (fabs(x_new - x) < tolerance) {  
            printf("Root found: %.7fn", x_new);  
            return;  
        }  
        x = x_new;  
    }  
    printf("Root not found within the tolerance.n");  
}  
int main() {  
    double a, b, c, d;  
    printf("Enter coefficients a, b, c, d: ");  
    scanf("%lf %lf %lf %lf", &a, &b, &c, &d);  
    solveCubicNewton(a, b, c, d);  
    return 0;  
}  

四、使用分段法

分段法是一种简单的数值求解方法,通过不断缩小区间来逼近方程的根。

3.1 分段法原理

分段法的基本步骤如下:

  1. 选择一个初始区间 ([a, b]),确保 ( f(a) ) 和 ( f(b) ) 具有相反符号。

  2. 计算中点 ( c = frac{a + b}{2} )。

  3. 如果 ( f(c) ) 足够接近零,则 ( c ) 为根。

  4. 否则,根据 ( f(a) ) 和 ( f(c) ) 的符号关系,选择新的区间。

  5. 重复步骤2-4,直到找到根。

3.2 代码实现

以下是使用分段法求解三次方程的C语言实现:

#include <stdio.h>
#include <math.h>  
double f(double x, double a, double b, double c, double d) {  
    return a * x * x * x + b * x * x + c * x + d;  
}  
void solveCubicBisection(double a, double b, double c, double d, double left, double right) {  
    double tolerance = 1e-7;  
    int maxIterations = 1000;  
    for (int i = 0; i < maxIterations; i++) {  
        double mid = (left + right) / 2;  
        double f_mid = f(mid, a, b, c, d);  
        if (fabs(f_mid) < tolerance) {  
            printf("Root found: %.7fn", mid);  
            return;  
        }  
        if (f(left, a, b, c, d) * f_mid < 0) {  
            right = mid;  
        } else {  
            left = mid;  
        }  
    }  
    printf("Root not found within the tolerance.n");  
}  
int main() {  
    double a, b, c, d;  
    printf("Enter coefficients a, b, c, d: ");  
    scanf("%lf %lf %lf %lf", &a, &b, &c, &d);  
    double left = -100, right = 100;  
    solveCubicBisection(a, b, c, d, left, right);  
    return 0;  
}  

五、总结与注意事项

求解三次方程的方法多种多样,可以根据具体需求选择合适的方法。使用解析方法如三次方程求根公式可以直接得到精确解,但公式复杂;使用数值方法如牛顿迭代法和分段法,可以通过迭代逼近根,适用于复杂方程。在编写代码时,需要注意初值选择、收敛条件和数值稳定性

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号