在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式,以r为参数:

复制代码
p[z_, r_] := z^3 + (r - 1) z - r;
roots[r_] := z /. Solve[p[z, r] == 0, z];

此多项式的根为:

尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式的。此时的Newton-Raphson映射为:

此时,可以编写带有参数r的收敛速度计数函数:

复制代码
NewNewtonCounter = 
  Compile[{{z, _Complex}, {r, _Real}, {otherroot, _Complex}},
   Module[{counter = 0, zold = N[z] + 1, znew = N[z]},
    If[Abs[znew] < 10^(-9), znew = 10^(-9) + 0.0 I,
     znew = znew];
    For[counter = 0,
     (Abs[zold - znew] > 10^(-6)) && (counter < 85), counter++,
     (zold = znew; znew = (r + 2*zold^3)/(-1 + r + 3*zold^2))];
    Which[Abs[znew - 1] < 10^(-4), counter,
     Abs[znew - otherroot] < 10^(-4), 85 + counter,
     Abs[znew - Conjugate[otherroot]] < 10^(-4), 170 + counter,
     True, 255
     ]
    ]
   ];
 
   (*返回给定区域中的每个点相应的收敛计数*)  
 NewNewtonArray[r_, {{remin_, remax_}, {immin_, immax_}}, steps_] :=
 Module[{croot = -N[(1 + Sqrt[1 - 4 r])/2]},
  Table[NewNewtonCounter[x + y I, r, croot],
   {y, immin, immax, (immax - immin)/steps},
   {x, remin, remax, (remax - remin)/steps}
   ]
  ]

region = NewNewtonArray[2, {{-2, 2}, {-2, 2}}, 1000];
NewtonPlot1[{{-2, 2}, {-2, 2}}, region, NewtonColorRGB]
复制代码
region = NewNewtonArray[0.05, {{-2, 2}, {-2, 2}}, 1000];
NewtonPlot1[{{-2, 2}, {-2, 2}}, region, NewtonColorRGB]
相关推荐
我搞slam4 小时前
快乐数--leetcode
算法·leetcode·哈希算法
WWZZ20254 小时前
快速上手大模型:机器学习3(多元线性回归及梯度、向量化、正规方程)
人工智能·算法·机器学习·机器人·slam·具身感知
东方佑5 小时前
从字符串中提取重复子串的Python算法解析
windows·python·算法
西阳未落6 小时前
LeetCode——二分(进阶)
算法·leetcode·职场和发展
通信小呆呆6 小时前
以矩阵视角统一理解:外积、Kronecker 积与 Khatri–Rao 积(含MATLAB可视化)
线性代数·算法·matlab·矩阵·信号处理
CoderCodingNo7 小时前
【GESP】C++四级真题 luogu-B4068 [GESP202412 四级] Recamán
开发语言·c++·算法
一个不知名程序员www7 小时前
算法学习入门---双指针(C++)
c++·算法
Shilong Wang8 小时前
MLE, MAP, Full Bayes
人工智能·算法·机器学习
Theodore_10228 小时前
机器学习(6)特征工程与多项式回归
深度学习·算法·机器学习·数据分析·多项式回归
知花实央l8 小时前
【算法与数据结构】拓扑排序实战(栈+邻接表+环判断,附可运行代码)
数据结构·算法