Численный анализ: секущий метод.Что я делаю неправильно - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь решить проблему с применением метода секущих чисел.

Мой код 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 голосов
/ 12 декабря 2018

Если это только решение уравнения, используйте

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
...