2015-09-20 4 views
0

Я проведенными метод секущий в 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].)

+0

Я не понимаю. В чем именно заключается ваша проблема? У вас есть вопрос о том, как ваш секущий метод сходится или не сходится? Кроме того, какова функция, которую вы пытаетесь найти в корне? Он не указан в вашей текущей постановке проблемы. BTW, оглядываясь назад, код вашего секущего метода выглядит так, как будто он правильный. Пробовали ли вы это с помощью другой функции с четко определенным корнем? Попробуйте что-то вроде 'x^2 - 4', где есть два корня в' x = 2' и 'x = -2' .... и посмотрите, что произойдет. – rayryeng

+0

Ну, проблема в том, что мой метод сходится, когда не предполагается делать это :), и мой вопрос в том, что у меня неправильные Thnks :) – user162343

+0

Тогда что можно сделать? – user162343

ответ

0

Хорошо, это начинает выглядеть все много, как домашнее задание ...

Там нет ничего плохого с алгоритмом. Сеансовый метод не является заключенным в квадратные скобки способом, что означает, что он не будет оставаться между указанными начальными точками. Точка, о которой вы сообщаете, которая равна нулю, является допустимым корнем для вашего уравнения x-tan(x)=0.

Я настоятельно рекомендую вам Google «критерии конвергенции для поиска корня», чтобы узнать больше. В этом случае, если вы установили привязку своей относительной ошибки в x, вы обнаружите, что она не может быть удовлетворена. Я также рекомендую вам прочитать страницу Википедии о поиске корня (здесь: https://en.wikipedia.org/wiki/Root-finding_algorithm), чтобы получить лучшее понимание предмета.

Существует также множество книг, которые подробно обсуждают этот вопрос. Один из самых доступных и дешевых - «Научные вычисления: вводный опрос» от Heath

+0

Право, чтобы уточнить, это не домашнее задание, это практика, и спасибо за то, что он сказал, что этот код прав :), И хорошо, что я только концентрируюсь на интервале [1,2]. – user162343

Смежные вопросы