一元三次方程求解:解题方法与C语言实现
一元三次方程求解:解题方法与C语言实现
本文将介绍如何求解形如'ax³ + bx² + cx + d = 0'的一元三次方程的实根,并提供一个C语言程序实现。
问题描述
给出一个一元三次方程 ax³ + bx² + cx + d = 0,其中a, b, c, d均为实数。假设该方程存在三个不同的实根,且根的范围在-100至100之间,根与根之差的绝对值 ≥ 1。要求由小到大依次输出这三个实根,精确到小数点后两位。
解题方法
一元三次方程的求解方法有很多,本文采用 判别式法 来求解实根。
判别式法 的核心是利用判别式 Δ 的值来判断方程根的类型:
- Δ > 0:方程有一个实根和一对共轭复根
- Δ = 0:方程有一个实根和两个重根
- Δ < 0:方程有三个不同的实根
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;
}
代码解释
-
输入系数: 程序首先读取四个实数 a, b, c, d,分别表示一元三次方程的系数。
-
计算判别式: 程序根据系数计算判别式 Δ,并根据 Δ 的值判断根的类型。
-
求解实根: 根据判别式 Δ 的值,程序分别计算三种情况下方程的实根。
- Δ > 0: 程序计算实根 x1,并利用复数运算求解复根 x2 和 x3。
- Δ = 0: 程序计算两个相同的实根 x1 和 x2。
- Δ < 0: 程序利用三角函数计算三个不同的实根 x1, x2, x3。
-
输出结果: 程序按照从小到大的顺序输出三个实根,精确到小数点后两位。
总结
本文介绍了如何利用判别式法求解一元三次方程的实根,并给出了C语言实现代码。希望本文能帮助你更好地理解一元三次方程的求解方法。
原文地址: https://www.cveoy.top/t/topic/oUV 著作权归作者所有。请勿转载和采集!