发布于  更新于 

数值分析作业 - 非线性求解方程

数值分析

Problem 1

20230318170803
20230318170803

分析收敛阶:

  1. 二分法每步将误差缩小 , 线性收敛, 收敛阶为 ,
  2. 割线法收敛阶为
  3. 不动点迭代 , 收敛阶为 ,
  4. 不动点迭代 , 收敛阶为 ,
  5. 牛顿法收敛阶为

先比较收敛阶大小, 收敛阶为 时比较 的大小, 可以判断收敛速度:

Problem 2

20230318173349
20230318173349

则牛顿法对应的不动点迭代 阶收敛, 误差满足

Problem 3

20230318185137
20230318185137

局部收敛

不收敛

Problem 4

20230318185502
20230318185502

是三重根, 牛顿法不二次收敛,

Problem 5

20230318192743
20230318192743

则牛顿法局部二次收敛, 有

估计

的结论

估计

Problem 6

20230318205332
20230318205332

Problem 7

20230318211206
20230318211206

二分法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
precision = 10;
binarySearch[fun_, var_, l0_, r0_, delta_] :=
Module[{f, a, b, fa, fb, l, r, \[Rho],
n}, (f[x_] = N[fun /. var -> x, precision];
\[Rho] = 1/2;
l[1] = l0;
r[1] = r0;
n = 1;
While[r[n] - l[n] > delta,
mid = (l[n] + r[n])/2;
If[f[mid] > 0, (
l[n + 1] = l[n];
r[n + 1] = mid;
), (
l[n + 1] = mid;
r[n + 1] = r[n];
)];
n++;];
Print[
TableForm[
Table[NumberForm[#, precision] & /@ {l[i], r[i],
f[(l[i] + r[i])/2]}, {i, 1, n - 1}],
TableHeadings -> {Range[n - 1], {"l", "r", "f(mid)"}}]];
Return[{l[n], r[n]}];)];
binarySearch[E^x + x - 7, x, 0., 3., 1.*^-8]
20230318213719
20230318213719

不动点迭代

构造一种可行的不动点迭代形式

1
NestList[Log[7 - #] &, 0., 20] // InputForm
1
2
3
4
5
6
7
{0., 1.9459101490553132, 1.6201977869925166, 1.6826516101163946, 
1.6709747561453339, 1.673168340375046, 1.6727566260886084,
1.6728339137527832, 1.6728194056442924, 1.6728221290601764,
1.6728216178297926, 1.6728217137962444, 1.672821695781745,
1.6728216991633662, 1.6728216985285795, 1.6728216986477396,
1.6728216986253712, 1.67282169862957, 1.672821698628782,
1.67282169862893, 1.6728216986289022}

牛顿法

1
NestList[# - (E^# + # - 7)/(E^# + 1) &, 0., 20] // InputForm
1
2
3
4
5
6
7
{0., 3., 2.2371293658878337, 1.7930473102816238, 1.6787764832017877, 
1.6728366106108064, 1.6728216987225175, 1.6728216986289066,
1.6728216986289064, 1.6728216986289066, 1.6728216986289064,
1.6728216986289066, 1.6728216986289064, 1.6728216986289066,
1.6728216986289064, 1.6728216986289066, 1.6728216986289064,
1.6728216986289066, 1.6728216986289064, 1.6728216986289066,
1.6728216986289064}

试位法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
tryPosition[fun_, var_, l0_, r0_, it_] := Module[{f, l, r, c, n}, (
f[x_] = N[fun /. var -> x, precision];
l[1] = l0;
r[1] = r0;
n = 1;
Do[
c[n] = (r[n] f[l[n]] - l[n] f[r[n]])/(f[l[n]] - f[r[n]]);
If[f[l[n]] f[c[n]] > 0, (
l[n + 1] = l[n];
r[n + 1] = c[n];
), (
l[n + 1] = c[n];
r[n + 1] = r[n];
)];
n++;, it];
Print[
TableForm[
Table[NumberForm[#, precision] & /@ {l[i], r[i], c[i],
f[c[i]]}, {i, 1, n - 1}],
TableHeadings -> {Range[n - 1], {"a", "b", "c", "f(c)"}}]];
Return[{l[n], r[n]}];)];
tryPosition[E^x + x - 7, x, 0., 3., 20]
20230318221639
20230318221639

关于收敛性的比较: 运行结果表明所有的方法都能收敛到唯一的零点. 与 NSolveValue 直接求解的结果作比较, 绘制绝对误差的绝对值 (对数尺度纵坐标):

20230322102542
20230322102542

可以看出不同算法的收敛速度, 从快到慢排序:

  1. 牛顿法
  2. 不动点迭代
  3. 试位法
  4. 二分法