Matlab中的牛顿法

时间:2019-01-25 23:08:11

标签: matlab newtons-method

我试图在Matlab中应用牛顿方法,并编写了一个脚本:

syms f(x)
f(x) = x^2-4
g = diff(f)
x_1=1 %initial point
while f(['x_' num2str(i+1)])<0.001;% tolerance
    for i=1:1000 %it should be stopped when tolerance is reached
       ['x_' num2str(i+1)]=['x_' num2str(i)]-f(['x_' num2str(i)])/g(['x_' num2str(i)])
    end
end

我收到此错误:

   Error: An array for multiple LHS assignment cannot contain M_STRING.

牛顿方法公式为x_(n + 1)= x_n-f(x_n)/ df(x_n),直到f(x_n)值接近零为止。

1 个答案:

答案 0 :(得分:1)

所有主要部分都存在于当前代码中。但是,有一些问题。

主要问题是假设字符串连接使工作空间中的变量变大。它不是。罪魁祸首是这条线是

['x_' num2str(i+1)]=['x_' num2str(i)]-f(['x_' num2str(i)])/g(['x_' num2str(i)])

['x_' num2str(i+1)]是一个字符串,并且MATLAB语言不支持分配给字符数组(这是我对An array for multiple LHS assignment cannot contain M_STRING.的解释)。

我的回答可能是

  1. 通过matlabFunction将符号函数转换为句柄(由于Netwon的Method几乎总是数字实现,因此一旦使用完符号函数,应将其删除)
  2. 使用双数组替换x来创建字符串(更清晰,更快,整体上更好的代码)。
  3. if循环中将break测试与for放在当前结构中。

我的建议已实施,如下所示:

syms f(x)
f(x) = x^2-4;
g = diff(f);

f = matlabFunction(f);
g = matlabFunction(g);

nmax = 1000;
tol = 0.001;% tolerance
x = zeros(1, nmax);
x(1) = 1; %initial point

fk = f(x(1));
for k = 1:nmax
    if (abs(fk) < tol)
        break;
    end

    x(k+1) = x(k) - f(x(k))/g(x(k));
    fk = f(x(k));

end