Matlab 中的牛顿法

Newton's Method in Matlab

我想在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) 值得到接近于零。

所有主要部分都出现在代码中。但是,也有一些问题。

主要问题是假设字符串连接在工作区中产生了一个变量;它不是。罪魁祸首是这条线是这条

['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 的方法几乎总是数值实现,一旦使用结果完成,符号函数应该是 dropper)
  2. 将字符串创建替换为 x 的双精度数组(更清晰、更快速且总体上更好的代码)。
  3. for 循环中放置一个 if-test 和 break 与当前构造。

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

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