优化设计-内点惩罚函数法-MATLAB编程

优化设计-内点惩罚函数法-MATLAB编程

  • 优化设计-内点惩罚函数法-MATLAB编程
    • 内点惩罚函数法介绍
    • MATLAB程序编程
      • 无约束优化环节采用梯度法
      • 无约束优化环节采用单纯型法

优化设计-内点惩罚函数法-MATLAB编程

有关于内点惩罚法原理的详细介绍可参考:
《结构优化设计概论》[M]国防工业出版社,1997.谢祚水,或者其他优化设计有关书籍
(谢祚水先生的书很经典,所以放这了)

内点惩罚函数法介绍

内点法是将惩罚函数定义在可行域内,并从可行域内某一初始点出发,在可行域内进行迭代的方法。它的最大特点是在给定一个初始可行的方案之后,通过迭代寻优, 可以得到一系列可行的、逐步改进的及可任意选取的设计方案。这对决策人员具有很大的可选灵活性,他既可以选择约束最优解x*,也可以根据具体情况,选择其中任何一个无约束最优解x*(r(k))。由于内点法的所有迭代点始终是在可行域内部进行的,因而它不能处理具有等式约束条件的优化问题。
优化设计-内点惩罚函数法-MATLAB编程_第1张图片
其算法步骤可以总结为:
优化设计-内点惩罚函数法-MATLAB编程_第2张图片

MATLAB程序编程

本程序运行有一定的小问题,即运行结果可能超出可行域外,而接近原函数无约束优化时的解,即惩罚函数未起到应有的作用。于是我在惩罚函数选取时选取了三种形式的惩罚函数,可结果依然不理想。一些研究有说出现这种情况可能是初始惩罚因子选取过小的问题,但是调整初始惩罚因子后,程序结果依旧没有太大的改变,现将程序附下,希望能有人指点下!!!

程序在利用无优化约束方法求取极值点这一环节,个人用了两种方法,一种是传统的梯度法求解,但是编写的程序适用于二维变量求解,且在矩阵求逆环节计算速度较慢,于是采用了第二种方法:单纯型法,可对多维变量函数求解,有关于单纯型法的编程,可详见此文:https://blog.csdn.net/Randall_crow_J/article/details/106305624

无约束优化环节采用梯度法

MATLAB程序如下:

%% 内点法惩罚函数选取在line16可调整,计算逆矩阵(line30)计算速度很慢
clear all;clc
syms x1 x2 x; 
f=x1^2+x2^2-x1*x2-10*x1-4*x2+60;%原函数
g1=x1-6;g2=x2-8;g3=x1+x2-11;%约束条件转换函数
e1=0.1;%梯度法最优值收敛精度
e2=0.1;%内点法收敛精度
D=1;%差值
k=1;
A(k)=0;B(k)=0;%A,B分别记录x1,x2点,初始点为[0,0]
r(k)=3;a=0.7;%r为惩罚因子,a为递增系数
%% 循环
while  D>e2 %罚因子迭代收敛条件
    x1=A(k);x2=B(k);
%约束问题转换后的新目标函数;
F=f-r(k)*(log10(-g1)+log10(-g2)+log10(-g3));%F=f+r(k)*(1/g1^2+1/g2^2+1/g3^2);%F=f-r(k)*(1/g1+1/g2+1/g3);
%梯度法求F的最优解xr
Fx1=diff(F,'x1');Fx2=diff(F,'x2');Fx1x1=diff(Fx1,'x1');Fx1x2=diff(Fx1,'x2');Fx2x1=diff(Fx2,'x1');Fx2x2=diff(Fx2,'x2');%求偏导、海森元素。
for n=1:100 %梯度法求最优值。
F1=subs(Fx1); %求解梯度值和海森矩阵
F2=subs(Fx2);
F11=subs(Fx1x1);
F12=subs(Fx1x2);
F21=subs(Fx2x1);
F22=subs(Fx2x2);
if(double(sqrt(F1^2+F2^2))<=e1) %梯度法最优值收敛条件
A(k+1)=double(x1);B(k+1)=double(x2);
break;
else
X=[x1 x2]'-([F11 F12;F21 F22])\[F1 F2]';
x1=X(1,1);x2=X(2,1);
end
end
D=double(sqrt((A(k+1)-A(k))^2+(B(k+1)-B(k))^2));
r(k+1)=a*r(k);
k=k+1;
end
A(k)
B(k)
double(subs(f))

无约束优化环节采用单纯型法

MATLAB程序如下:

%% 内点法惩罚函数选取的问题line16
clear all;clc
syms x1 x2 x; 
f=x1^2+x2^2-x1*x2-10*x1-4*x2+60;%原函数
g1=x1-6;g2=x2-8;g3=x1+x2-11;%约束条件转换函数
e1=0.001;%梯度法最优值收敛精度
e2=0.001;%内点法收敛精度
D=1;%差值
k=1;
A(k)=0;B(k)=0;%A,B分别记录x1,x2点,初始点为[0,0]
r(k)=10;a=0.7;%r为惩罚因子,a为递增系数
%% 循环
while  D>e2 %罚因子迭代收敛条件
    x1=A(k);x2=B(k);
%约束问题转换后的新目标函数
%F=f-r(k)*(log10(-g1)+log10(-g2)+log10(-g3));
F=f+r(k)*(1/(g1^2)+1/(g2^2)+1/(g3^2));
%F=f-r(k)*(1/g1+1/g2+1/g3);
%单纯形法求F的最优解xr
minx=minfunction(F,x1,x2,e1);
A(k+1)=minx(1,1);B(k+1)=minx(2,1);
D=double(sqrt((A(k+1)-A(k))^2+(B(k+1)-B(k))^2));
r(k+1)=a*r(k);
k=k+1;
end
A(k)
B(k)
double(subs(f))

欢迎各位大佬指正程序中的问题!!!

你可能感兴趣的:(算法,matlab)