【问题描述】
用牛顿迭代法和二分法,分别求解同一个三次方程的根,要求精度为 e。
牛顿迭代法的公式如下:
,精度e是指
二分法的原理可以参考:https://zhuanlan.zhihu.com/p/95708908
二分法的精度为 e 是指查找区间 [a,b] 满足 b - a < e
【输入形式】
【输出形式】
输出分4行。
第一行输出一个浮点数 x0,表示牛顿迭代法的解为 x0
第二行输出一个整数 c0, 表示牛顿迭代法的迭代次数为 c0
第三行输出一个浮点数 x1, 表示二分查找法的解为 x1
第四行输出一个整数 c1, 表示二分查找法的迭代次数为 c1
【样例输入】
3 -3 1 -6
1e-6
1.5
-3 3
【样例输出】
1.585429
4
1.585429
23
【样例说明】
对于二分查找法,最后输出区间右侧的值为近似解。例如若最后的区间为 [0.01,0.02],则输出 0.02 作为其近似解。
【代码展示】
//用牛顿迭代法和二分法来求三次方程的解
#include<stdio.h>
#include<math.h>
void newton(double a, double b, double c,
double d, double e, double x);
void halfcut(double low, double high, double a, double b,
double c, double d, double e);
int main(void)
{
double a, b, c, d, e, x, low, high;
double solution;
scanf("%lf %lf %lf %lf",&a,&b,&c,&d);
scanf("%lf",&e);
scanf("%lf",&x);
scanf("%lf %lf",&low,&high);
newton(a, b, c, d, e, x);
halfcut(low, high, a, b, c, d, e);
return 0;
}
void newton(double a, double b, double c, //牛顿迭代法的函数
double d, double e, double x)
{
int k=0; double y, m;
do
{
m = x;
y = x-(a*pow(x,3)+b*pow(x,2)+c*x+d)/(3*a*pow(x,2)+2*b*x+c);
x = y;
k+=1;
}while (fabs(x-m)>=e);
printf("%lf\n%d\n",x,k);
return;
}
void halfcut(double low,double high,double a,double b,
double c,double d,double e) //二分法的函数
{
int k = 0;
double n=(low+high)/2;
while ((high-low)>=e)
{
if ((a*pow(n,3)+b*pow(n,2)+c*n+d)*(a*pow(low,3)+b*pow(low,2)+c*low+d)<0)
{
high = n;
n = (low+high)/2;
}
else
{
low = n;
n = (low+high)/2;
}
k+=1;
}
printf("%lf\n%d",high, k);
return;
}
【代码解释】
本代码主要实现利用牛顿法与二分法分别尽可能的求出一个三次方程的近似解。同样是利用两个函数模块,使程序更具有模块化,更易于理解。