Я проведенными метод секущий в MATLAB следующим образом:метод секущих в MATLAB
%Implementation of the secant method.
function c = secant2(x0, x1,eps)
format long e
fx0 = f(x0);
fx1 = f(x1);
if abs(fx1) < abs(fx0), %c is the current best approx to a root.
c = x1; fc = fx1;
else
c = x0; fc = fx0;
end;
fprintf('initial guesses: x0=%d, x1=%d, fx0=%d, fx1=%d\n',x0,x1,fx0,fx1)
if abs(fc) <= eps % check to see if initial guess satisfies
return; % convergence criterion.
end;
while abs(fc) > eps,
fpc = (fx1-fx0)/(x1-x0); % this is the secant approx to f'.
if fpc==0, %% if fprime is 0, abort.
error('fprime is 0') %% the error function prints message and exits
end;
x0 = x1; fx0 = fx1; %% save previous iterate
x1 = x1 - fx1/fpc; %% secant step
fx1 = f(x1);
if abs(fx1) < abs(fx0), %% store best approx to root in c.
c = x1; fc = fx1;
else
c = x0; fc = fx0;
end;
fprintf(' x0=%d, x1=%d, fx0=%d, fx1=%d\n',x0,x1,fx0,fx1)
end;
function fx = f(x)
fx = x-tan(x);
return;
Дело в том, что это не предполагается, не сходиться, но это дает
secant2(1,2,10^-6)
initial guesses: x0=1, x1=2, fx0=-5.574077e-01, fx1=4.185040e+00
x0=2, x1=1.117536e+00, fx0=4.185040e+00, fx1=-9.355037e-01
x0=1.117536e+00, x1=1.278759e+00, fx0=-9.355037e-01, fx1=-2.047554e+00
x0=1.278759e+00, x1=9.819084e-01, fx0=-2.047554e+00, fx1=-5.152181e-01
x0=9.819084e-01, x1=8.820982e-01, fx0=-5.152181e-01, fx1=-3.327476e-01
x0=8.820982e-01, x1=7.000875e-01, fx0=-3.327476e-01, fx1=-1.423505e-01
x0=7.000875e-01, x1=5.640071e-01, fx0=-1.423505e-01, fx1=-6.853868e-02
x0=5.640071e-01, x1=4.376483e-01, fx0=-6.853868e-02, fx1=-3.026248e-02
x0=4.376483e-01, x1=3.377447e-01, fx0=-3.026248e-02, fx1=-1.345669e-02
x0=3.377447e-01, x1=2.577501e-01, fx0=-1.345669e-02, fx1=-5.863760e-03
x0=2.577501e-01, x1=1.959730e-01, fx0=-5.863760e-03, fx1=-2.547959e-03
x0=1.959730e-01, x1=1.485017e-01, fx0=-2.547959e-03, fx1=-1.101340e-03
x0=1.485017e-01, x1=1.123608e-01, fx0=-1.101340e-03, fx1=-4.752504e-04
x0=1.123608e-01, x1=8.492712e-02, fx0=-4.752504e-04, fx1=-2.047731e-04
x0=8.492712e-02, x1=6.415760e-02, fx0=-2.047731e-04, fx1=-8.817364e-05
x0=6.415760e-02, x1=4.845148e-02, fx0=-8.817364e-05, fx1=-3.794967e-05
x0=4.845148e-02, x1=3.658380e-02, fx0=-3.794967e-05, fx1=-1.632969e-05
x0=3.658380e-02, x1=2.762008e-02, fx0=-1.632969e-05, fx1=-7.025644e-06
x0=2.762008e-02, x1=2.085142e-02, fx0=-7.025644e-06, fx1=-3.022464e-06
x0=2.085142e-02, x1=1.574097e-02, fx0=-3.022464e-06, fx1=-1.300219e-06
x0=1.574097e-02, x1=1.188281e-02, fx0=-1.300219e-06, fx1=-5.593207e-07
ans =
1.188281151181448e-02
Так что я сделал неправильно? (Я видел на http://www.wolframalpha.com/input/?i=x-tan%28x%29&lk=4&num=1, что корни не в интервале [1,2]
.)
Я не понимаю. В чем именно заключается ваша проблема? У вас есть вопрос о том, как ваш секущий метод сходится или не сходится? Кроме того, какова функция, которую вы пытаетесь найти в корне? Он не указан в вашей текущей постановке проблемы. BTW, оглядываясь назад, код вашего секущего метода выглядит так, как будто он правильный. Пробовали ли вы это с помощью другой функции с четко определенным корнем? Попробуйте что-то вроде 'x^2 - 4', где есть два корня в' x = 2' и 'x = -2' .... и посмотрите, что произойдет. – rayryeng
Ну, проблема в том, что мой метод сходится, когда не предполагается делать это :), и мой вопрос в том, что у меня неправильные Thnks :) – user162343
Тогда что можно сделать? – user162343