我试图在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(X_n)/df(X_n),直到f(x_n)值接近于零为止。
发布于 2019-01-26 09:27:20
所有的主要部分都在当前的代码中。然而,也存在一些问题。
主要问题是假设字符串级联在工作区中生成一个变量;它没有。罪魁祸首是这条线是这条
['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.的解释)。
我的答案是,其他人可能会有所不同
matlabFunction将符号函数转换为句柄(因为Netwon的方法几乎总是一个数值实现,一旦它们的使用结果完成,符号函数就应该是滴管)x的双数组(更干净、更快和总体上更好的代码)。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));
endhttps://stackoverflow.com/questions/54373982
复制相似问题