Метод Ньютона коренится в Matlab

У меня не так много опыта работы с Matlab. Мне это просто нужно ради решения каких-то длинных нелинейных уравнений. Вместо того, чтобы использовать fzero, я хочу использовать Ньютона-Рафсона для решения уравнения.

newton.m содержит следующий код.

function [ x, ex ] = newton( f, df, x0, tol, nmax )

    if nargin == 3
        tol = 1e-4;
        nmax = 1e1;
    elseif nargin == 4
        nmax = 1e1;
    elseif nargin ~= 5
        error('newton: invalid input parameters');
    end

    x(1) = x0 - (f(x0)/df(x0));
    ex(1) = abs(x(1)-x0);
    k = 2;
    while (ex(k-1) >= tol) && (k <= nmax)
        x(k) = x(k-1) - (f(x(k-1))/df(x(k-1)));
        ex(k) = abs(x(k)-x(k-1));
        k = k+1;
    end

end

И в основном файле я назвал эту функцию следующим образом:

ext_H = newton( exp(x) + x^3, diff(exp(x) + x^3), 9, 0.5*10^-5, 10);

Когда я запускаю эту функцию, она дает мне следующую ошибку.

Error using sym/subsref (line 9)
Error using maplemex
Error, (in MTM:-subsref) Array index out of range

Error in newton (line 37)
    x(1) = x0 - (f(x0)/df(x0));

Error in main (line 104)
ext_H = newton( exp(x) + x^3, diff(exp(x) + x^3), 9, 0.5*10^-5, 10);

Может ли кто-нибудь помочь мне пройти через это?


person India Slaver    schedule 04.12.2014    source источник
comment
У вас есть особая причина не использовать fzero/fsolve MAtlab?   -  person Kostya    schedule 04.12.2014


Ответы (1)


Вероятно, вы можете использовать fsolve от Matlab (http://uk.mathworks.com/help/optim/ug/fsolve.html) с несколькими вариантами

x0 = 9;
options = optimoptions('fsolve','Algorithm','levenberg-marquardt','TolFun',5*10^-6,'MaxIter',100);
x = fsolve(@(x)(exp(x) + x^3), x0,options);

или просто fzero (http://uk.mathworks.com/help/optim/ug/fzero.html), который реализует алгоритм BD

x = fzero(@(x)(exp(x) + x^3), x0);
person Kostya    schedule 04.12.2014
comment
Не могли бы вы посмотреть на этот мой пост? - person India Slaver; 04.12.2014
comment
Вы имеете в виду свой вопрос выше? - person Kostya; 04.12.2014
comment
Нет, прости меня. Я забыл вставить ссылку. Пожалуйста, посмотрите на этот пост от меня. stackoverflow.com/questions/27251770/ - person India Slaver; 04.12.2014