版权声明:本文由 Micheal 超 博客 创作,转载请附带链接,有问题欢迎交流。 https://blog.csdn.net/qq_42887760/article/details/84039135
牛顿迭代法求方程的根
1. 牛顿迭代法的几何解释
- 注解: 设
是
的根,选取
作为
的初始近似值,过点
做曲线
的切线
,
,则
与
轴交点的横坐标
,称
为
的一次近似值。过点
做曲线
的切线,并求该切线与
轴交点的横坐标
,称
为
的二次近似值。重复以上过程,得
的近似值序列,其中,
n+1
称为
的
次近似值,上式称为牛顿迭代公式。
以下是部分图片(本人选自百度图片),帮助理解:
2. 案例
题目:用牛顿迭代法求根。方程为 ,系数 的值依次为 1,2,3,4,由主函数输入。求 在 1 附近的一个实根。求出根后由主函数输出。
3. 案例分析
牛顿迭代公式为:
n+1
其中,
是上一次求出的近似根,在开始是根据题设
(题目希望求x在1附近的一个实根,因此第一次的近似值可以设定为1)。
。
是
的导数,所以
第一次迭代,
;第二次迭代 。。。依次类推;
一直迭代到
-3时结束。
4.代码实现
#include <stdio.h>
#include <math.h>
float solution(float a,float b,float c,float d);
int main()
{
float a,b,c,d;
printf("请输入系数a,b,c,d: ");
scanf("%f%f%f%f",&a,&b,&c,&d);
printf("x=%10.7f\n",solution(a,b,c,d));
return 0;
}
float solution(float a, float b, float c,float d)
{
float x = 1;
float x0, f, f1;
do
{
x0 = x;
f = ((a * x0 + b)* x0 +c) * x0 + d;
f1 = (3 * a * x0 + 2 * b) * x0 +c;
x = x0 - f / f1;
}while(fabs(x - x0)>= 1e-3);
return x;
}