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语言中的数学函数求解一元三次方程的实根。具体步骤如下:

  1. 输入一元三次方程的系数a, b, c, d。
  2. 计算判别式delta的值。
  3. 根据delta的值进行判断:
    • 如果delta > 0,则方程有三个实根,分别为x1,x2,x3。
    • 如果delta == 0,则方程有两个实根,分别为x1,x2,其中x2为重根。
    • 如果delta < 0,则方程只有一个实根x1,另外两个根为虚根。
  4. 输出实根的值。

程序中使用了以下数学函数:

  • 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 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录