function
[xc,num,eps]
=
fpi(g,x0,phi,step)
if
nargin<3
phi
=
1e-6
end
if
nargin<4
step
=
100
end
prenum=x0
num
=
0
eps
=
1
while
eps>phi
afternum=g(prenum)
eps
=
abs(afternum-prenum)
prenum
=
afternum
num
=
num+1
if
num
>
step
disp('超过迭代次数,可能不收敛')
break
end
end
xc
=
afternum
==================
下面是该程序的用法,比如我们想要求x^3+x-1=0的根,按如下的步骤进行:
1、首先将其转换成x=g(x)的形式,比如我将其转换成
x
=
(1-x)^(1/3)这种开立方的形式
2、将这种形式写成函数,即此时有g(x)
=
(1-x)^(1/3),将下面的代码保存成g.m文件:
function
y
=
g(x)
y
=
nthroot(1-x,3)
3、调用上面的主程序,后面两个参数是可选的,第三个参数表示你要求的最低精度,默认值为1e-6,第四个参数表示最大迭代次数,默认是100次。
[xc,num,eps]
=
fpi(@g,0.8)
获得结果如下:(xc就是根,num是实际迭代次数,eps是根的精度)
xc
=
0.6823
num
=
38
eps
=
9.5514e-07
================
以下是几点说明:
①
不动点的形式也可能有其它种形式,比如x=1-x^3,但是它不收敛,具体原因请参考数学书,这里可以提示一下,在根附近的其导数的绝对值大小1
②
所取的初始值最好在根附近,别太远。不动点法在离根较远时可能不收敛(虽然在根附近会收敛),上面的程序若取初值为1的话,最后并不收敛,会在0与1之间来回折腾。可自行验证
有问题请留言
用matlab不动点迭代法求方程x^3+4x^2-10=0根,可以这样来求解。
1、从一元三次方程中,得到下列迭代式
x(k+1)=sqrt(10-x(k)³)/2
2、选择x的初值,x(0)=1
3、计算过程
x(1)=sqrt(10-x(0)³)/2=sqrt(10-1³)/2=1.5
x(2)=sqrt(10-x(1)³)/2=sqrt(10-1.5³)/2=1.287
。。。。。。
迭代20,得到结果,误差为1e-6
4、为了快速计算,可以借助于Excel来求解。求解如下
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)