Optimization 使用syms/subs的牛顿法散度

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

我正在编程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