1.5牛顿迭代法

发布时间 2023-04-17 21:52:59作者: 啵菠菜

1.题目

编写用牛顿迭代法求方程根的函数。方程为ax^3+bx^2+cx+d=0,系数a,b,c,d由主函数输入。求x在1附近的一个实根。求出根后,由主函数输出。
牛顿迭代法的公式是:x=x-f(xo),设迭代到|x-xal≤10-5时结束。
2.问题分析
f'(x)
牛顿迭代法是取x之后,在这个基础上,找到比x更接近的方程的根,一步一步迭代,从而找到更接近方程根的近似根。

3.算法设计
程序流程分析:
(1)在1附近找任一实数作为xo的初值,我们取1.5,即xo=1.5.
(2)用初值xo代入方程中计算此时的f(xo)及f(x2);程序中用变量f描述方程的值,
用 fd描述方程求导之后的值.
(3)计算增量h=f/fd。
(4)计算下一个x:x=x0-h。
(5)用新产生的x替换原来的xo,为下一次迭代做好准备。
(6)若|x-xo/>=1e-5,则转到第(3)步继续执行,否则转到步骤(7)。
(7)所求x就是方程ax+bx²+cx+d=0的根,将其输出。

4.代码

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
double root(double n, double p, double q, double r, double t); 
int main()
{
double x, a, b, c, d;
printf("Please enter coefficient of equation: ");
scanf("%lf %lf %lf %lf %lf", &x, &a, &b, &c, &d);
printf("Root=%lf\n", root(x, a, b, c, d)); 
system("pause");
return 0;
}

double root(double n, double p, double q, double r, double t)
{
double f;
f=(p*pow(n, 3)+q*pow(n, 2)+r*n+t)/(3*p*pow(n, 2)+2*q*n+r);
for (int i=0; fabs(f)>1e-5; i++){
f=(p*pow(n, 3)+q*pow(n, 2)+r*n+t)/(3*p*pow(n, 2)+2*q*n+r);
n-=f;
}
return n;
}