Optimization 使用syms/subs的牛顿法散度
我正在编程Newton方法,下面的代码片段显示了我对主函数所做的操作。我有一个只有函数的数据结构,现在是x^2+y^2。data.x0的值为[1;1](接近溶液),data.e的值为0.01 更新xk正在远离原点,而不是朝向原点。事实上,当我指定data.x0非常接近局部最小值或在函数的深坑中时,我可以让这段代码解决一些问题。否则,即使对于非常简单的函数,它也会发散 我的直觉告诉我,这是使用符号工具箱中的hessian函数和梯度函数,而不是像我被警告的那样使用分析方法的结果。有什么想法吗Optimization 使用syms/subs的牛顿法散度,optimization,Optimization,我正在编程Newton方法,下面的代码片段显示了我对主函数所做的操作。我有一个只有函数的数据结构,现在是x^2+y^2。data.x0的值为[1;1](接近溶液),data.e的值为0.01 更新xk正在远离原点,而不是朝向原点。事实上,当我指定data.x0非常接近局部最小值或在函数的深坑中时,我可以让这段代码解决一些问题。否则,即使对于非常简单的函数,它也会发散 我的直觉告诉我,这是使用符号工具箱中的hessian函数和梯度函数,而不是像我被警告的那样使用分析方法的结果。有什么想法吗
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