首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Matlab中的牛顿法

Matlab中的牛顿法
EN

Stack Overflow用户
提问于 2019-01-25 23:08:11
回答 1查看 1.2K关注 0票数 0

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

代码语言:javascript
复制
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

我得到了这个错误:

代码语言:javascript
复制
   Error: An array for multiple LHS assignment cannot contain M_STRING.

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-26 09:27:20

所有的主要部分都在当前的代码中。然而,也存在一些问题。

主要问题是假设字符串级联在工作区中生成一个变量;它没有。罪魁祸首是这条线是这条

代码语言:javascript
复制
['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的方法几乎总是一个数值实现,一旦它们的使用结果完成,符号函数就应该是滴管)
  2. 将字符串创建替换为用于x的双数组(更干净、更快和总体上更好的代码)。
  3. if-test与break放在for-loop中,而不是当前结构中。

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

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54373982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档