【问题标题】:Newton's Method in MatlabMatlab中的牛顿法
【发布时间】:2019-06-19 19:15:16
【问题描述】:

我正在尝试在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) 值接近零。

【问题讨论】:

  • 请不要创建动态变量。使用单个数组保留所有迭代

标签: matlab newtons-method


【解决方案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的方法几乎总是一个数值实现,符号函数一旦使用结果完成就应该是dropper)
  2. 将字符串创建替换为 x 的双精度数组(更简洁、更快且整体更好的代码)。
  3. 将if-test 和break 放在for-loop 中与当前构造相比。

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

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

【讨论】:

    猜你喜欢
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-02
    • 2013-10-24
    • 2015-01-06
    相关资源
    最近更新 更多