(一) 实验目的
熟练掌握外点法、内点法原理并可以在matlab 熟练运行。
(二) 问题描述
目标函数:z =min x 1+x 2
s.t. –x 21+x 2≥0
x 1≥0
(三) 算法介绍
外点法: 对于混合约束问题 min f(x)
s.t. s i x ≥0, i =1:m
h j x =0, i =1:n
可以转化为:
min F(x,σ)=f(x)+ σ([max{0,− s
21 x }]2+ max 0, − s2 x 2+…
+ max 0, − sm x 2+ h1 x +h 2 x 2+⋯+h n x 2) = f(x)+ σ( m i=1[max{0,− sm x }]2+ n j=1h 2j
其中,P(x)= m i=1 max 0, − sm x 2+ n j=1h 2j
F(x,σ) :增广目标函数
P(x):惩罚函数 ,σ:罚因子
外部惩罚函数法迭代步骤:
给定初始点x 0,初始惩罚因子σ1,放大系数c>1,ε>0置k:=1
Step1:以x k −1为初始点求解min F(x, σk )得极小点x k
Step2:若σk P x k
Step3:σk+1=c σk ,置k ≔k +1转step1
注意外点法在选取初始点时要选取在可行域外的点。
在本问题中x 0 =[-1;-1],c=10,ε=0.01,σ1=1
内点法:这种解法只能用于不等式
对于约束问题 min f(x)
s.t. s i x ≥0, i =1:m
可以转化为:
min F(x,σ)=f(x)+μ(1
s 1 x +1
s 2 x +⋯+1
s m x ) …
其中μ为一个小正数
内部惩罚函数法迭代步骤:
已知f(x), si x , 取β x =s 11 x +s 12 x +⋯+s 1m x
给定初始点x 0,初始惩罚因子μ1,放大系数1>c>0,ε>0置k:=1
Step1:以x k −1为初始点求解min F(x, μk )得极小点x k
Step2:若μk P x k
Step3:μk =c μk ,置k ≔k +1转step1
在本问题中x 0 =[0.03;0.03],c=0.2,ε=0.001,μ1=0.1
注意内点法在选取初始点时要选取在可行域内的点。
其中以xk−1为初始点求解min F (x, σk)得极小点xk的求解过程我们利用最速下降法得到
(四)程序代码及运行结果:
(1)外点法源程序代码:
function f=again(x,c,e)
syms x1 x2 t
a=1;
f=x1+x2;
y1=-x1^2+x2;
y2=x1;
y1=-subs(y1,{x1,x2},x);
y2=-subs(y2,{x1,x2},x) ;
P=(max(0,double(y1)))^2+(max(0,double(y2)))^2;
if double(y1)>0&&double(y2)>0
y11=-x1^2+x2;
y22=x1;
end
if double(y1)0
y11=0;
y22=x1;
end
if double(y2)0
y11=-x1^2+x2;
y22=0;
end
FF=f+a*(y11^2+y22^2) ;
a1=diff(FF,x1);
b1=diff(FF,x2);
a1=subs(a1,{x1,x2},x);
b1=subs(b1,{x1,x2},x);
g=[a1;b1];
d=-g;
while P*a>e
while double(sqrt(a1^2+b1^2))>0.5
x=x+t*d;
FF=subs(FF,{x1,x2},x);
f1=diff(FF);
f1=solve(f1);
if f1~=0
ti=double(f1);
else
break
end
x=subs(x,t,ti(1,1));
FF=f+a*(y11^2+y22^2);
a11=diff(FF,x1);
b11=diff(FF,x2);
a11=subs(a11,{x1,x2},x);
b11=subs(b11,{x1,x2},x);
g11=[a11;b11];
d=-g11;
a1=a11;
b1=b11;
end
a=a*c;
y1=-x1^2+x2;
y2=x1;
y1=-subs(y1,{x1,x2},x);
y2=-subs(y2,{x1,x2},x) ;
P=(max(0,double(y1)))^2+(max(0,double(y2)))^2;
if double(y1)>0&&double(y2)>0
y11=-x1^2+x2;
y22=x1;
end
if double(y1)0
y11=0;
y22=x1;
end
if double(y2)0
y11=-x1^2+x2;
y22=0;
end
FF=f+a*(y11^2+y22^2) ;
a1=diff(FF,x1);
b1=diff(FF,x2);
a1=subs(a1,{x1,x2},x);
b1=subs(b1,{x1,x2},x);
g=[a1;b1];
d=-g;
end
x,a
(2)在matlab 对话框中输入again([-1;-1],10,0.01), 外点法得到结果为 :
x =
1.0e-003 *
-0.4673
-0.5140
a =
10000
其中a 为惩罚因子。
(3)内点法源程序代码:
function f=neidian(x,c,e)
syms x1 x2 t
a=0.1;
f=x1+x2;
y1=-x1^2+x2;
y2=x1;
FF=f+a*((1/(y1))+(1/(y2)) ) ;
a1=diff(FF,x1);
b1=diff(FF,x2);
a1=subs(a1,{x1,x2},x);
b1=subs(b1,{x1,x2},x);
g=[a1;b1];
d=-g;
y1=subs(y1,{x1,x2},x);
y2=subs(y2,{x1,x2},x) ;
P=1/double((y1))+1/double((y2));
while P*a>e
while double(sqrt(a1^2+b1^2))>0.5
x=x+t*d;
FF=subs(FF,{x1,x2},x);
f1=diff(FF);
f1=solve(f1);
if f1~=0
ti=double(f1);
else
break
end
x=subs(x,t,ti(1,1));
y1=-x1^2+x2;
y2=x1;
FF=f+a*((1/(y1))+(1/(y2)) ) ;
a11=diff(FF,x1);
b11=diff(FF,x2);
a11=subs(a11,{x1,x2},x);
b11=subs(b11,{x1,x2},x);
g11=[a11;b11];
d=-g11;
a1=a11;
b1=b11;
end
a=a*c;
y1=-x1^2+x2;
y2=x1;
FF=f+a*((1/(y1))+(1/(y2)) ) ;
a1=diff(FF,x1);
b1=diff(FF,x2);
a1=subs(a1,{x1,x2},x);
b1=subs(b1,{x1,x2},x);
g=[a1;b1];
d=-g;
y1=subs(y1,{x1,x2},x);
y2=subs(y2,{x1,x2},x) ;
P=1/double(y1)+1/double(y2);
end
x,a
(4)在matlab 对话框中输入
neidian([0.03;0.03],0.2,0.001),
内点法得到结果为 :
x =
0.0010
0.0013
a =
2.5600e-007
(六)结果分析
本题理论算法的最优解为min=0,x 1=0,x 2=0;但在matlab 上运行不能得到理想解,但经过多步迭代我们已经得到了一个非常接近于最优解的值。如果想得到更接近的最优解可通过减小ε的值使迭代步数增加。
(七)心得体会
外点法的求解过程中会遇到max 这一函数,但是由于max 函数中与0比较的函数含有未知量,无法进行比较因此在每次循环前先赋值比较在利用if 条件语句重新得到P(x),而这一过程的获得需要我们在编程之初就进行考虑,否则问题多多。
同时,由于我们在本题中进行了循环嵌套,内层循环是利用最速下降法求解每一步的极小点x k ,外层循环是惩罚函数精度的限制,因此在每一步内层循环结束后函数的重新赋值需要弄明白否则会发生很多错误。
对于内点法体会最深的一点就是初始点,惩罚因子,以及精度选择很重要,选择不当将会导致程序运行出错。
(一) 实验目的
熟练掌握外点法、内点法原理并可以在matlab 熟练运行。
(二) 问题描述
目标函数:z =min x 1+x 2
s.t. –x 21+x 2≥0
x 1≥0
(三) 算法介绍
外点法: 对于混合约束问题 min f(x)
s.t. s i x ≥0, i =1:m
h j x =0, i =1:n
可以转化为:
min F(x,σ)=f(x)+ σ([max{0,− s
21 x }]2+ max 0, − s2 x 2+…
+ max 0, − sm x 2+ h1 x +h 2 x 2+⋯+h n x 2) = f(x)+ σ( m i=1[max{0,− sm x }]2+ n j=1h 2j
其中,P(x)= m i=1 max 0, − sm x 2+ n j=1h 2j
F(x,σ) :增广目标函数
P(x):惩罚函数 ,σ:罚因子
外部惩罚函数法迭代步骤:
给定初始点x 0,初始惩罚因子σ1,放大系数c>1,ε>0置k:=1
Step1:以x k −1为初始点求解min F(x, σk )得极小点x k
Step2:若σk P x k
Step3:σk+1=c σk ,置k ≔k +1转step1
注意外点法在选取初始点时要选取在可行域外的点。
在本问题中x 0 =[-1;-1],c=10,ε=0.01,σ1=1
内点法:这种解法只能用于不等式
对于约束问题 min f(x)
s.t. s i x ≥0, i =1:m
可以转化为:
min F(x,σ)=f(x)+μ(1
s 1 x +1
s 2 x +⋯+1
s m x ) …
其中μ为一个小正数
内部惩罚函数法迭代步骤:
已知f(x), si x , 取β x =s 11 x +s 12 x +⋯+s 1m x
给定初始点x 0,初始惩罚因子μ1,放大系数1>c>0,ε>0置k:=1
Step1:以x k −1为初始点求解min F(x, μk )得极小点x k
Step2:若μk P x k
Step3:μk =c μk ,置k ≔k +1转step1
在本问题中x 0 =[0.03;0.03],c=0.2,ε=0.001,μ1=0.1
注意内点法在选取初始点时要选取在可行域内的点。
其中以xk−1为初始点求解min F (x, σk)得极小点xk的求解过程我们利用最速下降法得到
(四)程序代码及运行结果:
(1)外点法源程序代码:
function f=again(x,c,e)
syms x1 x2 t
a=1;
f=x1+x2;
y1=-x1^2+x2;
y2=x1;
y1=-subs(y1,{x1,x2},x);
y2=-subs(y2,{x1,x2},x) ;
P=(max(0,double(y1)))^2+(max(0,double(y2)))^2;
if double(y1)>0&&double(y2)>0
y11=-x1^2+x2;
y22=x1;
end
if double(y1)0
y11=0;
y22=x1;
end
if double(y2)0
y11=-x1^2+x2;
y22=0;
end
FF=f+a*(y11^2+y22^2) ;
a1=diff(FF,x1);
b1=diff(FF,x2);
a1=subs(a1,{x1,x2},x);
b1=subs(b1,{x1,x2},x);
g=[a1;b1];
d=-g;
while P*a>e
while double(sqrt(a1^2+b1^2))>0.5
x=x+t*d;
FF=subs(FF,{x1,x2},x);
f1=diff(FF);
f1=solve(f1);
if f1~=0
ti=double(f1);
else
break
end
x=subs(x,t,ti(1,1));
FF=f+a*(y11^2+y22^2);
a11=diff(FF,x1);
b11=diff(FF,x2);
a11=subs(a11,{x1,x2},x);
b11=subs(b11,{x1,x2},x);
g11=[a11;b11];
d=-g11;
a1=a11;
b1=b11;
end
a=a*c;
y1=-x1^2+x2;
y2=x1;
y1=-subs(y1,{x1,x2},x);
y2=-subs(y2,{x1,x2},x) ;
P=(max(0,double(y1)))^2+(max(0,double(y2)))^2;
if double(y1)>0&&double(y2)>0
y11=-x1^2+x2;
y22=x1;
end
if double(y1)0
y11=0;
y22=x1;
end
if double(y2)0
y11=-x1^2+x2;
y22=0;
end
FF=f+a*(y11^2+y22^2) ;
a1=diff(FF,x1);
b1=diff(FF,x2);
a1=subs(a1,{x1,x2},x);
b1=subs(b1,{x1,x2},x);
g=[a1;b1];
d=-g;
end
x,a
(2)在matlab 对话框中输入again([-1;-1],10,0.01), 外点法得到结果为 :
x =
1.0e-003 *
-0.4673
-0.5140
a =
10000
其中a 为惩罚因子。
(3)内点法源程序代码:
function f=neidian(x,c,e)
syms x1 x2 t
a=0.1;
f=x1+x2;
y1=-x1^2+x2;
y2=x1;
FF=f+a*((1/(y1))+(1/(y2)) ) ;
a1=diff(FF,x1);
b1=diff(FF,x2);
a1=subs(a1,{x1,x2},x);
b1=subs(b1,{x1,x2},x);
g=[a1;b1];
d=-g;
y1=subs(y1,{x1,x2},x);
y2=subs(y2,{x1,x2},x) ;
P=1/double((y1))+1/double((y2));
while P*a>e
while double(sqrt(a1^2+b1^2))>0.5
x=x+t*d;
FF=subs(FF,{x1,x2},x);
f1=diff(FF);
f1=solve(f1);
if f1~=0
ti=double(f1);
else
break
end
x=subs(x,t,ti(1,1));
y1=-x1^2+x2;
y2=x1;
FF=f+a*((1/(y1))+(1/(y2)) ) ;
a11=diff(FF,x1);
b11=diff(FF,x2);
a11=subs(a11,{x1,x2},x);
b11=subs(b11,{x1,x2},x);
g11=[a11;b11];
d=-g11;
a1=a11;
b1=b11;
end
a=a*c;
y1=-x1^2+x2;
y2=x1;
FF=f+a*((1/(y1))+(1/(y2)) ) ;
a1=diff(FF,x1);
b1=diff(FF,x2);
a1=subs(a1,{x1,x2},x);
b1=subs(b1,{x1,x2},x);
g=[a1;b1];
d=-g;
y1=subs(y1,{x1,x2},x);
y2=subs(y2,{x1,x2},x) ;
P=1/double(y1)+1/double(y2);
end
x,a
(4)在matlab 对话框中输入
neidian([0.03;0.03],0.2,0.001),
内点法得到结果为 :
x =
0.0010
0.0013
a =
2.5600e-007
(六)结果分析
本题理论算法的最优解为min=0,x 1=0,x 2=0;但在matlab 上运行不能得到理想解,但经过多步迭代我们已经得到了一个非常接近于最优解的值。如果想得到更接近的最优解可通过减小ε的值使迭代步数增加。
(七)心得体会
外点法的求解过程中会遇到max 这一函数,但是由于max 函数中与0比较的函数含有未知量,无法进行比较因此在每次循环前先赋值比较在利用if 条件语句重新得到P(x),而这一过程的获得需要我们在编程之初就进行考虑,否则问题多多。
同时,由于我们在本题中进行了循环嵌套,内层循环是利用最速下降法求解每一步的极小点x k ,外层循环是惩罚函数精度的限制,因此在每一步内层循环结束后函数的重新赋值需要弄明白否则会发生很多错误。
对于内点法体会最深的一点就是初始点,惩罚因子,以及精度选择很重要,选择不当将会导致程序运行出错。