我正在编程newtons方法,下面的代码片段显示了我对main函数所做的工作。我有一个只有函数的数据结构,现在是x ^ 2 + y ^ 2。 data.x0的值是[1; 1](接近解决方案),data.e的值是0.01
更新xk正在远离原点而不是朝向它。事实上,当我指定data.x0非常接近局部最小值或者在函数的深坑内时,我可以得到这个代码来解决一些问题。否则即使是非常简单的功能也会出现分歧。
我的直觉告诉我,这是使用符号工具箱中的粗体和渐变函数而不是我被警告的分析方法的结果。有什么想法吗?
xk=data.x0
grad=gradient(data.f)
grad_xk=double(subs(grad,[x;y],xk))
hess=hessian(data.f)
norm_grad_xk=0;
for i=1:length(grad_xk)
norm_grad_xk=norm_grad_xk+grad_xk(i)^2;
end
norm_grad_xk=sqrt(norm_grad_xk)
mag_fun_xk=double(subs(data.f,[x;y],xk))
while (norm_grad_xk)>data.e*(1+abs(mag_fun_xk))
hess_xk=double(subs(hess,[x;y],xk))
invhess_xk=inv(hess_xk)
xk=xk-invhess_xk*grad_xk
% ll=horzcat(ll,xk)
norm_grad_xk=0;
for i=1:length(grad_xk)
norm_grad_xk=norm_grad_xk+grad_xk(i)^2
end
norm_grad_xk=sqrt(norm_grad_xk)
mag_fun_xk=double(subs(data.f,[x;y],xk))
end