Иногда кажется, что программа MATLAB, использующая метод Secant, выдает бессмысленные значения - PullRequest
0 голосов
/ 29 сентября 2019

Чтобы изучить MATLAB, я работаю над программой, которая находит корень нуля, используя метод Secant. Ниже моего кода:

function [zero, x_vector] = secant_method(fx, x1, x2, nmax, tol)
%function that tries to find root of given function using the secant method. 
%Mandatory inputs: FX is the function to be evaluated, X1 is first input
%value of the function, X2 is second input value of the function.
%Optional inputs: NMAX is maximum number of iterations (default = 5000), tol
%is maximum tolerance (default = 1e-4).
%Outputs: ZERO is the root of the function within the tolerance or after
%the maximum iterations has been reached, X_VECTOR is a vector of all
%consecutive evaluted inputs of the function. 

%code by Steven

if ~exist('tol')
    tol = 1e-4;
end

if ~exist('nmax')
    nmax = 5000;
end

y_vector = [];
x_vector = [];
x_vector(1)=x1;
x_vector(2)=x2;

diff=tol+1;         %this ensures at least one iteration will take place
i=1;
while diff > tol && i < (nmax)
    i = i+1;

    %Creating new straight line from two previous coordinates, using the conventional
    % y=ax+b for paramter notation.
    y_vector(i-1) = feval(fx,x_vector(i-1));
    y_vector(i) = feval(fx,x_vector(i));
    a = (y_vector(i)-y_vector(i-1))/(x_vector(i)-x_vector(i-1));
    b = y_vector(i)-a*x_vector(i);

    x_vector(i+1) = -b/a; 

    diff = abs(x_vector(i+1)-x_vector(i));
end

if i == (nmax) && diff > tol
    fprintf(['Function stopped without converging to the desired tolerance\n',... 
        'because the number of maximum iterations was reached.']);
end

zero = x_vector(i+1);

return 

Теперь для большинства входов код работает нормально. Как пример

secant_method('sin', 1, 5, 50, 1e-10) = 3.141592653589793, который достаточно близок к pi.


Но с некоторыми входными данными я не понимаю, почему код возвращаетчто оно делает. Например,

secant_method('sin', -8, 12, 500, 1e-10) = 2.002170932439574e+30

, но sin(2.002170932439574e+30)= 0.019481942752609, который не очень близок к 0.

Любые идеи о том, почему это происходит или где я ошибаюсь, оченьоценили.

1 Ответ

1 голос
/ 30 сентября 2019

Правила метода Secant

if fx(x1) < 0 ---> choose x2 such as fx(x2) > 0
if fx(x1) > 0 ---> choose x2 such as fx(x2) < 0

Пример 1:

x1 = 1; sin(x1) =  0.8415;
x2 = 5; sin(x2) = -0.9589;

fx(x1) > 0; fx(x2) < 0 Нет проблем

Пример 2:

x1 = -8; sin(x1) =   -0.9894;
x2 = 12; sin(x2) = -0.5366;

fx(x1) < 0; fx(x2) < 0 Изменение граничных значений

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...