数值分析:割线法.我做错了什么



我正试图解决一个关于割线数值方法应用的问题。

我的MATLAB代码是以下

function [f]= fsecante(t) 
R=24.7;
L=2.74;
C=0.000251;
P1=-0.5*(R/L)*t;
P2=t*sqrt(1/(L*C)-(R^2)/(4*L^2));
f=2*exp(P1).*cos(P2)-1;
end
%iteradas iniciais%
x0=0;
x1=10^-4;
wanted=10^-8;
f0=fsecante(x0);
f1=fsecante(x1);
iter=0;
error=wanted;
while(erro>=wanted)
F=(x1-x0)/(f1-f0);
xn=x1-F*f1
error=abs(F*f1);
iter=iter+1;
x0=x1;
x1=xn;
f0=fsecante(x0);
f1=fsecante(x1);
end

我用计算器了解了我应该得到的值,它是0.152652376(大约(然而,使用MATLAB中的方法,它收敛到1.4204,这远远超过了我们应该得到的值。我做错了什么?我的猜测是我的错误变量在循环中出错了吗?我还觉得奇怪的是,我的解在集[0,1]的解应该在的地方。有人能澄清一下我遗漏了什么吗?

如果这只是为了求解方程,请使用

fsolve(@fsecante, 0)

以找到最接近CCD_ 1的函数的根。

ans =   0.0257389353753764

你没有做错什么,割线法只是不能收敛于所有的初始点。只有当收敛发生时,才能保证快速收敛。

对于使用割线根并保证收敛的方法,请使用regula falsi方法。在伊利诺伊州的变体中,它可以实现为

x0=0
f0=fsecante(x0)
x1=1
f1=fsecante(x1)
wanted=10^-8;
iter=1;
while( abs(x1-x0) >= wanted)
iter=iter+1
F=(x1-x0)/(f1-f0);
xn=x1-F*f1
fn = fsecante(xn)
if fn*f0 < 0 
x1=x0; f1=f0;
else
f1 = f1*0.5;
end
x0=xn; f0=fn;
end

并给出了CCD_ 2 的结果

init:  x0=     0                ,   f(x0)=   1
init:  x1=     1                ,   f(x1)=  -0.97824464599
n= 2:  xn=     0.5054986510525  ,   f(xn)=  -0.803719660003
n= 3:  xn=     0.28025344639849 ,   f(xn)=  -1.21180917676
n= 4:  xn=     0.081858845659703,   f(xn)=  -2.38168069197
n= 5:  xn=     0.007776289683393,   f(xn)=   0.848005195428
n= 6:  xn=     0.027227838393959,   f(xn)=  -0.090747663322
n= 7:  xn=     0.025347489826149,   f(xn)=   0.0235362327768
n= 8:  xn=     0.025734738800888,   f(xn)=   0.000253074462073
n= 9:  xn=     0.025743020435749,   f(xn)=  -0.000246366400381
n=10:  xn=     0.02573893523423 ,   f(xn)=   7.80359576957e-09
n=11:  xn=     0.025738935363624,   f(xn)=   2.40252262529e-13
n=12:  xn=     0.025738935363632,   f(xn)=  -2.39919195621e-13

相关内容

  • 没有找到相关文章

最新更新