用Mathematica实现牛顿拉斐森算法

该博客介绍了如何运用牛顿迭代法寻找函数的实数根,通过Mathematica进行编程实现。首先定义了函数及其导数,然后利用NSolve求解出函数的根,并绘制了函数图形。接着,展示了牛顿算法的迭代过程,用图形直观地表示出每次迭代的切线及逼近点。通过多次迭代,结果逐步接近NSolve的解。此外,还探讨了从不同起点开始迭代,如何逐步接近根的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 使用NSolve方法解出函数根
    F[x_] = 8 x^5 - 3 x^4 + 2 x^3 + 9 x - 5;
    DF[x_] = D[F[x], x];
    RootsF = NSolve[F[x] == 0, x]
  • 画出函数图形
    PlotF = Plot[F[x], {x, -3, 7}, PlotStyle -> {Blue, Thickness[0.007]}];
    Show[PlotF, PlotRange -> {{-3, 7}, {-1000, 1000}}]

  • 画图形象展示牛顿算法的求根原理。此处展示为如何求解实数根。(因为坐纵坐标范围过大,箭头纵坐标差值给的适当大些才能显示箭头尾部)

首先我们确定一个与实数较近的点,此处选取1,由公式xi+1=xi-f(x)/f’(x)求解出x1,并且切线公式为y=(DF[xi])x+F[xi]-xi*DF[xi]。

x0 = SetPrecision[1, 10];
x1 = (x0 - F[x0]/DF[x0])
F[x0]
DF[x0]
F[x0] - x0 DF[x0]
F[x1]
DF[x1]
F[x1] - x1 DF[x1]
ArrowPlots = 
 Graphics[{Arrowheads[.05], Thickness[.010], Yellow, 
   Arrow[{{1, -25}, {1, -4.5}}],(*前一个坐标箭头尾巴,后一个坐标箭头脑袋*)Black, 
   Arrow[{{0.7441, -25}, {0.7441, -4.5}}], Red, 
   Arrow[{{0.516, 30}, {0.516, 2}}]}]; TangentF = 
 Plot[43 x - 32, {x, -1, 3}, PlotStyle -> {Black, Thickness[0.007]}];
Show[ArrowPlots, PlotF, TangentF, PlotRange -> {{-1, 3}, {-40, 100}}, 
 Axes -> True, AspectRatio -> 2/3]

      求出数据后,进行图形的绘制,黑线表示切线,黑色箭头表示切线与横轴交点,以此作为下一次逼近的依据点。

      再进行一次迭代,此时蓝色箭头指向红色切线与横轴交点,以此作为下一次逼近的依据点,我们可以看出,蓝色箭头和红色箭头已经距离很近。

  • 利用循环进行八次迭代,观察结果,此时已经和NSolve的结果很相近。
    
    x[0] = N[0, 30];
    For[k = 1, k <= 8, k++, x[k] = (x[k - 1] - F[x[k - 1]]/DF[x[k - 1]]);]
    Table[{"x", k, "=", N[x[k], 12]}, {k, 1, 8}] // MatrixForm

  • 通过牛顿算法分别从-1+i,-1-i,0.5,1+i,1-i开始对方程的根进行十次迭代,由结果可以看出,根的值逐渐接近NSlove求出的结果。
    x[0] = N[{-1 + I, -1 - I, 0.5, 1 + I, 1 - I}, 30];
    Newt[x_] = x - F[x]/DF[x]
    N[NestList[Newt[#] &, x[0], 10], 12] // MatrixForm

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值