牛顿的方法源于Matlab

时间:2014-12-04 07:48:29

标签: matlab nonlinear-functions newtons-method

我对Matlab的经验不是很多。我只是需要它来解决一些冗长的非线性方程。我不想使用fzero,而是想用Newton-Raphson来解决这个问题。

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);

有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

你可以使用Matlab的fsolve(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);

或仅执行BD算法的fzero(http://uk.mathworks.com/help/optim/ug/fzero.html

x = fzero(@(x)(exp(x) + x^3), x0);