不动点迭代法
理论基础:
f(x)=0 等价变换 x=ф(x)
f(x)的根 等价变换 ф(x)的不动点
从一个初值x0出发,计算x1=ф(x0),x2=ф(x1),……,x(k+1)=ф(xk),……若{xk}(k=0~k=∞)收敛,即存在x* 使得lim(k->∞) xk=x* ,且ф连续,则由lim(k->∞)x(k+1)=lim(k->∞)ф(xk)可知 x* = =ф(x*),即x*是ф的不动点,也就是f的根。
满足收敛
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5CWf6WNa-1646553360951)(迭代法收敛图解.png)]
构造收敛迭代格式的两个要素:
1、x=g(x)应该满足|g’(x*)|<1;
2、初值x0必须取自x*的充分小邻域(Bδ),Bδ<={f(x),x=g(x)}
①绘制原方程对应函数图像,判断方程零点所在大致范围并确定初值x0。
②采用不动点迭代法在不同迭代格式下求解方程的近似根。
主函数
x;
y=x.*x.*x+x-1;
Draw(x,y);%绘制函数图像以确定x0
x0=input('请输入初值:x0=');
SimpleIterative(x0);%通过不动点迭代法求解近似根
Draw
function Draw(x,y)
grid on;hold on;
plot(x,y);
title('f(x)图像')
xlabel('x')
ylabel('f(x)');
end
phi
用以设定迭代格式
function x=phi(x)
%x=1-x.*x.*x;
x=(1-x)^(1/3);
% x=(1+2*x*x)/(1+3*x*x);
end
SimpleIterative
用以实现不动点迭代法
function SimpleIterative(x0)
PRECISION=0.0001;
MAX_Number=10000;
x0;
x1=phi(x0);
k=1;
while k<MAX_Number
if abs(x1-x0)>PRECISION%不断向后递推
x0=x1;
x1=phi(x1);
disp('次数');
disp(k);
disp(x0);
k=k+1;
elseif abs(x1-x0)<=PRECISION%跳出循环
break
end
end
if k>=MAX_Number
disp('该迭代格式下迭代失败');
else
disp('迭代次数k=');
disp(k);
end
disp('方程的近似根为x=');
disp(x1);
end
原方程对应函数图像:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wFP5JN7l-1646553360952)(不动点迭代法函数图.png)]
由此,我们可以选择0.5为初值,即令x0=0.5
(1) x=1-x.*x.*x
输出结果:
(由于迭代失败k及x1的输出过多,这里只展示部分)
……
次数
9997
1
次数
9998
0
次数
9999
1
该迭代格式下迭代失败
方程的近似根为x=0
(2) x=(1-x)^(1/3)
输出结果:
次数
1
0.7937
次数
2
0.5909
次数
3
0.7424
次数
4
0.6363
次数
5
0.7138
次数
6
0.6590
次数
7
0.6986
次数
8
0.6704
次数
9
0.6907
次数
10
0.6763
次数
11
0.6866
次数
12
0.6792
次数
13
0.6845
次数
14
0.6807
次数
15
0.6835
次数
16
0.6815
次数
17
0.6829
次数
18
0.6819
次数
19
0.6826
次数
20
0.6821
次数
21
0.6825
次数
22
0.6822
次数
23
0.6824
次数
24
0.6823
迭代次数k=25
方程的近似根为x=0.6824
(3)x=(1+2xx)/(1+3xx)
输出结果:
次数
1
0.8571
次数
2
0.7707
次数
3
0.7865
次数
4
0.7834
次数
5
0.7840
次数
6
0.7839
迭代次数k=7
方程的近似根为x=0.7839
由此可见,选择适合的迭代格式十分重要,不同的迭代格式产生的结果可能有差异,应当在实践应用中寻找收敛、高效、生成结果更为精准的迭代格式。