牛顿法的matlab实现

简介:牛顿法是用来求解无约束优化问题的,它的基本思想是用迭代点xk处的一阶导数和二阶导数对目标函数进行二次函数近似,然后把二次模型的极小点作为新的迭代点,不断重复这一过程,直至满足精度的近似极小点。

这里有必要讲一下泰勒展开式的几何意义:泰勒公式的几何意义是利用多项式函数来逼近原函数,由于多项式函数可以任意次求导,易于计算,且便于求解极值或者判断函数的性质,因此可以通过泰勒公式获取函数的信息,同时,对于这种近似,必须提供误差分析,来提供近似的可靠性。

基本牛顿法算法的步骤:

步0:确定终止误差e=(0~1),初始点x0,令k=0

步1:计算gk=\bigtriangledownf(xk).若||gk||<=e,停算,输出xk作为最优解。否则,转步2

步2:计算Gk=\bigtriangledown^2f(xk),并解出方程组:Gk*dk=-gk,解得dk,其中Gk在xk处要正定

步3:令Xk+1=xk+dk,k=k+1;转步1

这个算法的特点就是他的收敛速度快,缺点就是要求二阶导师,比较麻烦。

还有一个缺点就是它的x0的选取要靠近极小点,否则可能导致算法不收敛,所以x0的选取成为了一个问题,为了改进这个问题,这里用线搜索技术(这里用Armijo线搜索技术)来克服达到大范围收敛的算法,即阻尼牛顿法(与基本的牛顿法相比,它的搜索步长不同,基本的步长是1):

算法步骤:

步0:确定终止误差e=(0~1),初始点x0,\delta=(0~1),\sigma=(0,0.5),令k=0

步1:计算gk=\bigtriangledownf(xk).若||gk||<=e,停算,输出xk作为最优解。否则,转步2

 步2:计算Gk=\bigtriangledown^2f(xk),并解出方程组:Gk*dk=-gk,解得dk,其中Gk在xk处要正定

步3:求步长\alphak=\delta^mk,m的值从0开始

若f(xk+ \delta^m*dk)<=f(xk)+\sigma*\delta^m*gk'dk

则 mk=m,步长 \alphak=\delta^mk,若不满足上式,则m=m+1,直到满足上述不等式为止

步4:令Xk+1=xk+ \alphak*dk,k=k+1,转步1

 代码实现:

1.阻尼牛顿法

function [x,val,k] =dampnm(fun,gfun,Hess,x0)
%功能:用阻尼牛顿法求解无约束问题minif(x)
%dampnm是阻尼的意思
%输入:fun,gfun,Hess分别是目标函数,梯度,二阶导数,x0是初始点
%输出:x,val分别是近似极小点和近似最优值,k是迭代次数
maxk=100;
rho=0.55;
sigma=0.4;
k=0;
e=1e-5;%精度要求
while(k

 2.目标函数

function f= fun(x)
%目标函数
f=100*(x(1)^2-x(2))^2+(x(1)-1)^2;
end

 3.目标函数梯度

function  g=gfun(x)
%目标函数的梯度
g=[400*x(1)*(x(1)^2-x(2))+2*(x(1)-1),-200*(x(1)^2-x(2))]';
end

4.目标函数的Hess阵

function f = Hess(x)
%n=length(x);
%f=zero(n,n);
f=[1200*x(1)^2-400*x(2)+2,-400*x(1);
    -400*x(1),             200];
end

 5.主函数

%这个问题的精确值是x=(1,1)',f(x)=0;
clear all
clc
x0=[-1.2 1]';
[x,val,k]=dampnm('fun','gfun','Hess',x0);
disp('迭代次数:k=')
disp(k)
disp(['最优解:x = '])
disp(x)
disp(['此时: f(x) = ',num2str(val)]) 

6.结果显示

牛顿法的matlab实现_第1张图片

你可能感兴趣的:(matlab,线性代数,矩阵,算法,机器学习)