数值分析:割线法。我究竟做错了什么

时间:2018-12-12 01:21:39

标签: matlab numerical-methods

我正在尝试解决关于割线数值方法应用的问题。

我的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]集。有人可以给我一些有关我缺少的东西的说明吗?

1 个答案:

答案 0 :(得分:0)

如果这只是要求解方程式,请使用

fsolve(@fsecante, 0)

查找最接近0的函数的根。

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

并给出x0=0; x1=1;

的结果
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