#include <stdio.h>
#include <stdlib.h>
#include <math.h>
// 定义函数f(x),即一元三次方程的左侧表达式
double f(double a, double b, double c, double d, double x) {
return a * x * x * x + b * x * x + c * x + d;
}
// 定义函数f'(x),即一元三次方程的导数
double diff_f(double a, double b, double c, double x) {
return 3 * a * x * x + 2 * b * x + c;
}
// 使用牛顿迭代法求解方程的根
int solve_equation(double a, double b, double c, double d, double x0, double epsilon, double **roots) {
int numRoots = 0; // 根的个数
double x = x0;
double delta;
do {
delta = f(a, b, c, d, x) / diff_f(a, b, c, x);
x -= delta;
// 当根的改变量足够小时认为找到了一个根
if (fabs(delta) < epsilon) {
numRoots++;
*roots = (double*)realloc(*roots, numRoots * sizeof(double));
(*roots)[numRoots - 1] = x;
}
} while (fabs(f(a, b, c, d, x)) > epsilon);
return numRoots;
}
int main() {
double a, b, c, d; // 方程的系数
double x0; // 初始解
double epsilon; // 精度要求
printf("请输入方程的系数 a, b, c, d: ");
scanf("%lf %lf %lf %lf", &a, &b, &c, &d);
getchar(); // 消耗掉回车键之后的换行符或空格
printf("请输入初始解 x0: ");
scanf("%lf", &x0);
getchar(); // 消耗掉回车键之后的换行符或空格
printf("请输入精度要求 epsilon(e.g. 1e-10): ");
scanf("%lf", &epsilon);
double *roots = NULL; // 存储根的数组
int numRoots = solve_equation(a, b, c, d, x0, epsilon, &roots);
printf("方程的根为:");
for (int i = 0; i < numRoots; i++) {
printf("%lf ", roots[i]);
}
printf("\n");
free(roots);
return 0;
}