利用 MATLAB 编程实现罚函数法法求解约束最优化问题

本文章包含以下内容:

1、画出外罚函数法的算法流程图;

2、MATLAB 编写外罚函数法求解无约束优化问题的函数,无约束子问题用 精确一维搜索的拟 Newton 法(函数式 M 文件,精度设为 epson 可调);编写程序 (命令式 M 文件),调用外罚函数法,求解如下问题:

min f(x)=x_1^2+x_2^2

s.t. x1+x2=2

精度为 10-8,初始点为(10,10)。

3、MATLAB 编写内罚函数法求解无约束优化问题的函数(分不限制一维搜 索步长和限制一维搜索步长两种情况),无约束子问题用精确一维搜索的拟 Newton 法(函数式 M 文件,精度设为 epson 可调);编写程序(命令式 M 文件), 调用内罚函数法,求解如下问题:

min f(x)=x_1^2+x_2^2

s.t.x_1-1\geqslant 0

精度为 10-8,初始点为(10,10)。

拟 Newton 法

1、画出外罚函数法的算法流程图;

利用 MATLAB 编程实现罚函数法法求解约束最优化问题_第1张图片

2、MATLAB 编写外罚函数法求解无约束优化问题的函数,无约束子问题用 精确一维搜索的拟 Newton 法(函数式 M 文件,精度设为 epson 可调);编写程序 (命令式 M 文件),调用外罚函数法,求解如下问题:

min f(x)=x_1^2+x_2^2

s.t. x1+x2=2

精度为 10-8,初始点为(10,10)。

function y=f(x)
global s;
if(length(x)==1)
    global xk;
    global pk;
    x=xk+x*pk;
end
y=x(1)^2+x(2)^2+s*(x(1)+x(2)-2)^2;

 

function xk=waifanhanshufa(e,x)
%step 1
c=10;
global s;
s=1;
global xk;
global pk;
xk=x;
%没用到k,只存储当前迭代的值。
%step 2
while 1
    H=[1 0;0 1];
    xk=DFP_hjfg(1e-4,xk,H);
    if s*(xk(1)+xk(2)-2)^2

3、MATLAB 编写内罚函数法求解无约束优化问题的函数(分不限制一维搜 索步长和限制一维搜索步长两种情况),无约束子问题用精确一维搜索的拟 Newton 法(函数式 M 文件,精度设为 epson 可调);编写程序(命令式 M 文件), 调用内罚函数法,求解如下问题:

min f(x)=x_1^2+x_2^2

s.t.x_1-1\geqslant 0

 

精度为 10-8,初始点为(10,10)。

function y=f(x)
global r;
if(length(x)==1)
    global xk;
    global pk;
    x=xk+x*pk;
end
y=x(1)^2+x(2)^2+r/(x(1)-1);

 不限制一维搜索步长

function xk=neifanhanshufa(e,x)
%step 1
c=0.1;
global r;
r=10;
global xk;
global pk;
xk=x;
%没用到k,只存储当前迭代的值。
%step 2
while 1
    %拟牛顿法
    Hk=[1 0;0 1];
    xk=DFP_hjfg(1e-6,xk,Hk);
    if r/(xk(1)-1)

 限制一维搜索步长(这里更改了拟牛顿法函数,原函数还是看之前的代码)

function xk=neifanhanshufa(e,x)
%step 1
c=0.1;
global r;
r=10;
global xk;
global pk;
xk=x;
%没用到k,只存储当前迭代的值。
%step 2
while 1
    %拟牛顿法
    Hk=[1 0;0 1];
    xk=DFP_hjfg(1e-6,xk,Hk);
    if r/(xk(1)-1)

结果示例:

利用 MATLAB 编程实现罚函数法法求解约束最优化问题_第2张图片

 

你可能感兴趣的:(matlab,算法,线性代数)