一元三次方程求解 - C语言实现
"一元三次方程求解 - C语言实现"\n\n本文介绍如何使用二分法在C语言中求解一元三次方程的实根。该方法利用二分法的原理,通过不断缩小区间,逼近方程的根,最终得到精确到小数点后两位的三个不同实根。\n\n问题描述\n\n有形如:ax^3+bx^2+cx+d=0 这样的一个一元三次方程。给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的绝对值> =1。要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位。\n\n提示:记方程f(x)=0,若存在2个数x1和x2,且x1< x2,f(x1)*(x2)< 0,则在(x1,x2)之间一定有一个根。\n\n代码实现\n\nc\n#include <stdio.h>\n#include <math.h>\n\n#define EPSILON 0.01\n\ndouble f(double x, double a, double b, double c, double d) {\n return a * pow(x, 3) + b * pow(x, 2) + c * x + d;\n}\n\ndouble find_root(double a, double b, double c, double d) {\n double left = a, right = b;\n double mid, fmid;\n \n while (right - left > EPSILON) {\n mid = (left + right) / 2;\n fmid = f(mid, a, b, c, d);\n \n if (fabs(fmid) < EPSILON) {\n return mid;\n }\n \n if (fmid * f(left, a, b, c, d) < 0) {\n right = mid;\n } else {\n left = mid;\n }\n }\n \n return (left + right) / 2;\n}\n\nint main() {\n double a, b, c, d;\n scanf("%lf %lf %lf %lf", &a, &b, &c, &d);\n \n double root1 = find_root(-100, 100, a, b, c, d);\n double root2 = find_root(root1 + 1, 100, a, b, c, d);\n double root3 = find_root(root2 + 1, 100, a, b, c, d);\n \n printf("%0.2lf %0.2lf %0.2lf\n", root1, root2, root3);\n \n return 0;\n}\n\n\n复杂度分析\n\n每次二分法的迭代都可以将区间的长度减少一半,因此总共需要迭代log(n)次,其中n为根的范围内的数的个数。每次迭代中计算f(x)的值需要O(1)时间,因此总的时间复杂度为O(log(n))。
原文地址: https://www.cveoy.top/t/topic/pDRv 著作权归作者所有。请勿转载和采集!