C语言求解一元三次方程实根代码
C语言求解一元三次方程实根代码
本文提供用C语言编写的求解一元三次方程实根的代码,并详细解释了程序的原理和使用方法。
#include <stdio.h>
#include <math.h>
int main() {
double a, b, c, d;
double x1, x2, x3;
double delta, p, q;
scanf("%lf %lf %lf %lf", &a, &b, &c, &d);
p = (3 * a * c - b * b) / (3 * a * a);
q = (2 * pow(b, 3) - 9 * a * b * c + 27 * a * a * d) / (27 * a * a * a);
delta = pow(q / 2, 2) + pow(p / 3, 3);
if (delta > 0) {
double sqrt_delta = sqrt(delta);
double u = cbrt(-q / 2 + sqrt_delta);
double v = cbrt(-q / 2 - sqrt_delta);
x1 = u + v - b / (3 * a);
printf("%.2lf ", x1);
double real_part = -(u + v) / 2 - b / (3 * a);
double imaginary_part = sqrt(3) * (u - v) / 2;
x2 = real_part + imaginary_part * I;
x3 = real_part - imaginary_part * I;
printf("%.2lf %.2lf\n", creal(x2), creal(x3));
} else if (delta == 0) {
double u = cbrt(-q / 2);
x1 = 2 * u - b / (3 * a);
x2 = -u - b / (3 * a);
printf("%.2lf %.2lf %.2lf\n", x1, x2, x2);
} else {
double u = cbrt(sqrt(-delta));
double v = acos(-q / (2 * u));
x1 = 2 * u * cos(v / 3) - b / (3 * a);
x2 = 2 * u * cos((v + 2 * M_PI) / 3) - b / (3 * a);
x3 = 2 * u * cos((v + 4 * M_PI) / 3) - b / (3 * a);
printf("%.2lf %.2lf %.2lf\n", x1, x2, x3);
}
return 0;
}
程序解释:
该程序基于卡尔丹公式,利用C语言中的数学函数求解一元三次方程的实根。具体步骤如下:
- 输入一元三次方程的系数a, b, c, d。
- 计算判别式delta的值。
- 根据delta的值进行判断:
- 如果delta > 0,则方程有三个实根,分别为x1,x2,x3。
- 如果delta == 0,则方程有两个实根,分别为x1,x2,其中x2为重根。
- 如果delta < 0,则方程只有一个实根x1,另外两个根为虚根。
- 输出实根的值。
程序中使用了以下数学函数:
pow(x, y):返回x的y次方。sqrt(x):返回x的平方根。cbrt(x):返回x的立方根。acos(x):返回x的反余弦值。cos(x):返回x的余弦值。
注意:
- 程序中的
I是复数单位,用于表示虚数部分。 - 程序中的
M_PI是圆周率π的值,定义在<math.h>头文件中。
希望本文能帮助你理解C语言求解一元三次方程实根的代码。如有问题,请随时提问。
原文地址: https://www.cveoy.top/t/topic/oW0 著作权归作者所有。请勿转载和采集!