我试图在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)值接近零为止。
答案 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.
的解释)。
我的回答可能是
matlabFunction
将符号函数转换为句柄(由于Netwon的Method几乎总是数字实现,因此一旦使用完符号函数,应将其删除)x
来创建字符串(更清晰,更快,整体上更好的代码)。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