张瑞
中国科学技术大学数学科学学院
rui@ustc.edu.cn |
若函数在上连续,且,则在内至少有一个零点。
利用这个定理,可以给出二分法求函数的根。
输入区间a,b,函数f(x),及误差控制e
while (|a-b|>e) do
x=(a+b)/2
if (|f(x)|<e) return x; // 找到根为x
else if (f(a)*f(x)<0) b=x; // 根在区间[a,(a+b)/2]
else if (f(b)*f(x)<0) a=x; // 根在区间[(a+b)/2,b]
end while
return (a+b)/2 // 还没有找到根,但b-a已经足够小了
例 1. 求函数在之间的根
解. 用Python计算,得到
root = 0.5671432822942734
Total 25 steps
1 0.65 0.15000000000000002
2 0.575 0.07500000000000001
3 0.5375 0.03749999999999998
4 0.5562499999999999 0.01874999999999999
5 0.5656249999999999 0.009375000000000022
6 0.5703125 0.004687500000000011
7 0.5679687499999999 0.0023437500000000333
8 0.5667968749999999 0.001171874999999989
9 0.5673828124999999 0.0005859375000000222
10 0.5670898437499998 0.0002929687500000111
11 0.5672363281249999 0.0001464843750000333
12 0.5671630859374999 7.324218750004441e-05
13 0.5671264648437498 3.6621093750022204e-05
14 0.5671447753906249 1.8310546875011102e-05
15 0.5671356201171873 9.155273437533307e-06
16 0.5671401977539061 4.577636718794409e-06
17 0.5671424865722655 2.2888183593972045e-06
18 0.5671436309814453 1.1444091796986022e-06
19 0.5671430587768553 5.722045898770567e-07
20 0.5671433448791503 2.861022949662839e-07
21 0.5671432018280028 1.4305114748314196e-07
22 0.5671432733535766 7.152557374157098e-08
23 0.5671433091163635 3.5762786843029915e-08
24 0.5671432912349701 1.7881393421514957e-08
25 0.5671432822942734 8.940696738513054e-09
~~
函数的等价形态有很多种,如
其中是一个非零常数。
可以看到
因而,取合适的使得在的根附近满足
则迭代格式收敛。
特别,若有,则
此时,格式达到2阶收敛。
但这种情况很难发生,在实际应用中,可以取
函数在处做Taylor展开,
取线性部分近似为,然后求根
得到
取这个值为下一个迭代值,得到
定义 1.
Newton迭代格式为
|
可以看到,直线 是在处的切线,与轴的交点就是下一步迭代的值。 因而,Newton迭代又称为切线法。 |
由Newton迭代格式,可以得到迭代格式对应的等价方程是
记
则有
设。若,则有
因而有
定理 1.
Newton迭代格式在的单根附近收敛,且至少2阶收敛。
利用前面的定理即可
或者
证明. 在处Taylor展开
其中在与之间。移项,可得
进而
注意到
因此,若是的单根,
可以看到,若是的单根,则格式至少2阶收敛。
定理 2.
若是的重根,则Newton迭代
是1阶收敛的。而格式
至少2阶收敛。
此时,可以写成
其中。
则Newton迭代表达为
因而
得到
即,此时Newton迭代1阶收敛。
若函数的根的重数未知,不防设为,则
令
则是的一重根。
可以构造的Newton迭代格式。
若是函数重根,则解方程的格式
具有至少2阶精度。
设置f(x)
计算函数值,df(x)
计算导数值,tol
为精度控制,maxiter
为最大迭代步数,
m
为预设的重根数,缺省为1
,
while k <= maxiter and abs( x - x0 ) >= tol:
x2, x1, x0 = ( x1, x0, x )
fx = f(x)
dfx = df(x)
x = x - m * fx / dfx
k = k + 1
if k > maxiter:
return (x,float('inf'),stepinfo,k)
例 2. Newton迭代求的根。
解. 可以看到且。因而,是一个二重根。
以初值开始计算,误差控制。
使用Newton迭代计算
Root is 5.424952541628956e-06
Total steps: 18
Rate: 1.000010240574523
以同样的初值,设置重根阶
Root is 1.0864531688955798e-11
Total steps: 4
Rate: 2.0147483986450294
未知根重数的Newton迭代
取初值 1
Root is -4.218590698935789e-11
Total steps: 5
Rate: math domain error
1 -0.23421061355351425
2 -0.00845827991076109
3 -1.1890183808588653e-05
4 -4.218590698935789e-11
5 -4.218590698935789e-11
Newton迭代的中间结果
1 0.5819767068693265
2 0.31905504091081843
3 0.16799617288577048
4 0.08634887374778137
5 0.04379570367371408
6 0.022057685365768236
7 0.0110693874777393
8 0.005544904662931229
9 0.0027750144941372577
10 0.0013881489723892668
11 0.0006942350659796617
12 0.0003471576966651309
13 0.00017358889159729097
14 8.679695657422037e-05
15 4.339910703392076e-05
16 2.1699709854160184e-05
17 1.0849887297322925e-05
18 5.424952541628956e-06
重根Newton迭代中间结果
1 0.1639534137386529
2 0.0044781144487033575
3 3.342250383920123e-06
4 1.0864531688955798e-11
例 3. 用Newton迭代求根
解. 用初值,结果为
Root is 0.0
Total steps: 5
Rate: 2.9936674514109285
1 -0.5707963267948966
2 0.1168599039989131
3 -0.001061022117044716
4 7.963096044106416e-10
5 0.0
作业: 结果中,可以看到3阶收敛,试分析原因。
证明: 求解方程的Newton迭代格式具有至少3阶精度。
用初值,结果为
Root is nan
Total steps: 11
Rate: nan
1 -3.535743588970452
2 13.95095908692749
3 -279.3440665336173
4 122016.99891795448
5 -23386004197.933853
6 8.590766671950354e+20
7 -1.1592676698907246e+42
8 2.110995587610979e+84
9 -6.9999433953175654e+168
10 inf
11 nan
是一个发散到的序列。
例 4. 用Newton迭代法解方程
解. 构造Newton迭代格式为
取初值,则有
迭代序列在中循环取值,永远不会收敛。
例 5. Newton迭代求根
解. 用不同的初值,得到结果为
取初值 2.35283735
Root is 4.000000000000001
Total steps: 25
Rate: 2.001075621801667
取初值 2.352836327
Root is -3.0000000000000004
Total steps: 25
Rate: 2.000886478517893
取初值 2.352836323
Root is 0.9999999999999925
Total steps: 16
Rate: 1.89270344136726
取初值 2.35283735
Root is 4.000000000000001
Total steps: 25
Rate: 2.001075621801667
1 -0.7829479432088857
2 2.3528750599018755
3 -0.7832624903449901
4 2.3542988581341184
5 -0.7951930373389495
6 2.4096178613487207
7 -1.357025522098792
8 436.8325543155845
9 291.450201808276
10 194.53176652201245
11 129.92416933967377
12 86.85946275830207
13 58.160163230315774
14 39.04298283697368
15 26.32157018154881
16 17.8753619404899
17 12.295986835648872
18 8.652254263160414
19 6.334490245199713
20 4.951264807478875
21 4.252004042721794
22 4.025430907342878
23 4.0003021866887325
24 4.000000043474304
25 4.000000000000001
取初值 2.352836327
Root is -3.0000000000000004
Total steps: 25
Rate: 2.000886478517893
1 -0.7829394111557035
2 2.3528364638374564
3 -0.7829405524081285
4 2.352841626395325
5 -0.7829836099095435
6 2.3530364176331253
7 -0.78460924829194
8 2.3604147342051243
9 -0.8476711759310573
10 2.6872287516836755
11 -144.9559225012978
12 -96.43394799584374
13 -64.09545863227268
14 -42.550769282273606
15 -28.209243369124543
16 -18.680961503769232
17 -12.37865102649303
18 -8.253684045483189
19 -5.62221452244607
20 -4.050604387537867
21 -3.2657018020731914
22 -3.0239035181209393
23 -3.0002212761583498
24 -3.0000000192329486
25 -3.0000000000000004
取初值 2.352836323
Root is 0.9999999999999925
Total steps: 16
Rate: 1.89270344136726
1 -0.7829393777949023
2 2.3528363129272205
3 -0.7829392937858954
4 2.352835932905887
5 -0.7829361243354871
6 2.352821595739119
7 -0.7828165551125976
8 2.3522808476279304
9 -0.7783146062709512
10 2.3321026642860514
11 -0.6205467552357247
12 1.7993798401408654
13 0.8042684705782203
14 0.9981009654022841
15 0.9999997007081824
16 0.9999999999999925
在Newton迭代中,的计算需要解析求解,有时候不是很方便。
使用差商来近似,得到弦截法
节点正好是连接和的弦 与轴的交点。
1.618
。从插值近似的角度来看,Newton迭代和弦截法都是用一个近似多项式的根来作为函数的根的估计
问题. 可以用3个点,如 , , 做2次插值多项式来近似吗?
可以。这样的格式称为抛物线法。
例 6. 求根
解. 取误差控制,
二分法, 取初始区间为
root = 0.5671432837843895
Estimated Convergence Rate = 1.00
Total 28 steps
Newton 迭代,取初值
root = 0.567143290409784
Estimated Convergence Rate = 2.00
Total 5 steps
弦截法
root = 0.5671432904097838
Estimated Convergence Rate = 1.60
Total 7 steps
简单迭代,初值
root = 0.5671432904097838
Estimated Convergence Rate = 2.00
Total 6 steps
用Newton迭代和弦截法求根,
误差控制为。
输出示例:
Newton迭代,初值、根和迭代步数:
初值 0.1 , XXXXXXXXXXXXXXXXX , xxxxx
初值 0.2 , XXXXXXXXXXXXXXXXX , xxxxx
初值 0.9 , XXXXXXXXXXXXXXXXX , xxxxx
初值 9.0 , XXXXXXXXXXXXXXXXX , xxxxx
弦截法,初值、根和迭代步数:
初值 0.1,0.2 , XXXXXXXXXXXXXXXXX , xxxxx
初值 0.2,0.9 , XXXXXXXXXXXXXXXXX , xxxxx
初值 8.0,9.0 , XXXXXXXXXXXXXXXXX , xxxxx
简记线性方程组
为,其中
则有
其中的矩阵为Jacobi矩阵。
因而,函数的在点处的线性近似为
把线性近似的根作为下一个迭代值,就得到了
定义 2.
记解非线性方程组的迭代序列为,
则Newton迭代格式为
为避免求解Jacobi矩阵的逆矩阵,通常将格式改为
例 7. 解非线性方程组
解. Jacobi矩阵为
取初值,则
解线性方程组
得到
因而,下一个迭代值为
例 8.
8.
************************************************************
Finding root of f(x) = 1 - x * exp(x) on [0.000000,2.000000]
************************************************************
-------- Bisection Method ---------------------------
root = 0.5671432837843895
Estimated Convergence Rate = 1.00
Total 28 steps
-------- Newton's Method ----------------------------
root = 0.567143290409784
Estimated Convergence Rate = 2.00
Total 5 steps
-------- Secant Method ------------------------------
root = 0.5671432904097838
Estimated Convergence Rate = 1.60
Total 7 steps
-------- Fixed-Point Method -------------------------
root = 0.5671432904097838
Estimated Convergence Rate = 2.00
Total 6 steps
左边 |
右边 |