用Mathematica实现牛顿拉斐森算法

  • 使用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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值