牛顿-拉格朗日法

1、牛顿-拉格朗日法的基本理论

 2、牛顿-拉格朗日法的Matlab程序

function [x,mu,val,mh,k]=newtlagr(x0,mu0)
%功能:用牛顿-拉格朗日法求解约束优化问题:
%    min f(x),s.t. h_i(x)=0,i=1,...,1.
%输入:x0是初始点,mu0是乘子向量的初始值
%输出:x,mu分别是近似最优点及相应的乘子,
%val是最优值,mh是约束函数的模,k是迭代次数.
maxk=500;%最大迭代次数
n=length(x0);l=length(mu0);
rho=0.5;gamma=0.4;
x=x0;mu=mu0;
k=0;  epsilon=1e-8;
while(k<maxk)
    dl=dla(x,mu);    %计算乘子函数的梯度
    if(norm(dl)<epsilon),break;end     %检验终止准则
    N=N1(x,mu);     %计算拉格朗日矩阵
    dz=-N\dl;     %解方程组得搜索方向 
                  %将线性方程组 -N*x = dl 求解出未知的向量 x
    dx=dz(1:n);du=dz(n+1:n+l);
    m=0;mk=0;
    while(m<20)     % Armijo搜索
        if(norm(dla(x+rho^m*dx,mu+rho^m*du))^2<=(1-gamma*rho^m)*norm(dl)^2)
            mk=m;break;
        end
        m=m+1;
    end
    x=x+rho^mk*dx; mu=mu+rho^mk*du;
    k=k+1;
end
val=f1(x);
mh=norm(h1(x),inf); %无穷范数

%%%%%%%%%拉格朗日函数L(x,mu)%%%%%%%%%%%%%
function l=la(x,mu)
f=f1(x);%调用目标函数文件
h=h1(x); %调用约束函数文件
l=f-mu'*h;%计算乘子函数

%%%%%%%%%拉格朗日函数的梯度%%%%%%%%%%%%%
function dl=dla(x,mu)
df=df1(x);%调用目标函数梯度文件
h=h1(x);%调用约束函数文件
dh=dh1(x); %调用约束函数Jacobi矩阵文件
dl=[df-dh'*mu;-h]; %计算乘子函数梯度文件

%%%%%%%%%拉格朗日函数的Hesse矩阵%%%%%%%%%%%
function d2l=d2la(x,mu)
d2f=d2f1(x);%调用目标函数Hesse矩阵文件
[d2h1,d2h2,d2h3]=d2h(x);%调用约束函数二阶导数文件
d2l=d2f-mu(1)*d2h1-mu(2)*d2h2-mu(3)*d2h3;%计算乘子函数的Hesse矩阵

%%%%%%%%%系数矩阵N(x,mu)%%%%%%%%%%%
function N=N1(x,mu) %计算拉格朗日矩阵
l=length(mu);
d2l=d2la(x,mu);dh=dh1(x);
N = [d2l, -dh'; -dh, zeros(3,3)];

%%%%%%%%%目标函数f(x)%%%%%%%%%%%%%
function f=f1(x)
s=x(1)*x(2)*x(3)*x(4)*x(5);
f=exp(s)-0.5*(x(1)^3+x(2)^3+1)^2;

%%%%%%%%%约束函数h(x)%%%%%%%%%%%%%
function h=h1(x)
h=[x(1)^2+x(2)^2+x(3)^2+x(4)^2+x(5)^2-10;x(2)*x(3)-5*x(4)*x(5);
    x(1)^3+x(2)^3+1];

%%%%%%%%%目标函数f(x)的梯度%%%%%%%%%%%%%
function df=df1(x)
s=x(1)*x(2)*x(3)*x(4)*x(5);
df(1)=s/(x(1))*exp(s)-3*(x(1)^3+x(2)^3+1)*x(1)^2;
df(2)=s/(x(2))*exp(s)-3*(x(1)^3+x(2)^3+1)*x(2)^2;
df(3)=s/(x(3))*exp(s); 
df(4)=s/(x(4))*exp(s);
df(5)=s/(x(5))*exp(s);
df=df(:);

%%%%%%%%%约束函数h(x)的Jacobi矩阵A(x)%%%%%%%%%%%%%
function dh=dh1(x)
dh=[2*x(1),2*x(2),2*x(3),2*x(4),2*x(5);...
    0,x(3),x(2),-5*x(5),-5*x(4);...
    3*x(1)^2,3*x(2)^2,0,0,0];

%%%%%%%%%目标函数f(x)的Hesse矩阵%%%%%%%%%%%%%
function d2f=d2f1(x)
s=x(1)*x(2)*x(3)*x(4)*x(5);
d2f= [(s/(x(1)))^2*exp(s)-6*x(1)*(x(1)^3+x(2)^3+1)-9*x(1)^4,...
    (1+s)*x(3)*x(4)*x(5)*exp(s)-9*x(1)^2*x(2)^2,...
    (1+s)*x(2)*x(4)*x(5)*exp(s),(1+s)*x(2)*x(3)*x(5)*exp(s),...
    (1+s)*x(2)*x(3)*x(4)*exp(s);...
    (1+s)*x(3)*x(4)*x(5)*exp(s)-9*x(1)^2*x(2)^2,...
    (s/(x(2)))^2*exp(s)-6*x(2)*(x(1)^3+x(2)^3+1)-9*x(2)^4,...
    (1+s)*x(1)*x(4)*x(5)*exp(s),(1+s)*x(1)*x(3)*x(5)*exp(s),...
    (1+s)*x(1)*x(3)*x(4)*exp(s);...
    (1+s)*x(2)*x(4)*x(5)*exp(s),(1+s)*x(1)*x(4)*x(5)*exp(s),...
    s^2/ (x(3))*exp(s),...
    (1+s)*x(1)*x(2)*x(5)*exp(s),(1+s)*x(1)*x(2)*x(4)*exp(s); ...
    (1+s)*x(2)*x(3)*x(5)*exp(s),(1+s)*x(1)*x(3)*x(5)*exp(s),...
    (1+s)*x(1)*x(2)*x(5)*exp(s),s^2/(x(4))*exp(s),...
    (1+s)*x(1)*x(2)*x(3)*exp(s); (1+s)*x(2)*x(3)*x(4)*exp(s),...
    (1+s)*x(1)*x(3)*x(4)*exp(s),(1+s)*x(1)*x(2)*x(4)*exp(s),...
    (1+s)*x(1)*x(2)*x(3)*exp(s) ,s^2/(x(5))*exp(s)]';

%%%%%%%%%%%%约束函数h(x)的Hesse矩阵%%%%%%%%%%
function [d2h1,d2h2,d2h3]=d2h(x)
d2h1=[2 0 0 0 0;0 2 0 0 0;0 0 2 0 0;0 0 0 2 0;0 0 0 0 2]';
d2h2=[0 0 0 0 0;0 0 1 0 0;0 1 0 0 0;0 0 0 0 -5;0 0 0 -5 0]';
d2h3=[6*x(1) 0 0 0 0;0 6*x(2) 0 0 0;0 0 0 0 0;0 0 0 0 0;0 0 0 0 0]';

Matlab调用示例如下:

初值为x0=[-1.7,1.6,1.8,-0.7,-0.7]',乘子向量初值为mu0=[0.1 0.1 0.1]’时

在命令窗口依次输入如下命令并回车即得计算结果:
x0=[-1.7,1.6,1.8,-0.7,-0.7]';

mu0=[0.1 0.1 0.1]';     

[x,mu,val,mh,k]=newtlagr(x0,mu0)

 结果如下:

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值