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

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

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

外点惩罚函数法介绍

外点法是将惩罚函数定义在可行域之外,并在整个Rn中进行参数寻优。初始点x0可以在Rn中任选,既可在可行域中,亦可在域外,这给设计人员和实际计算带来极大的便利。由于外点法是从约束可行域外逐步逼近约束极值点的,故它很适合于具有等式约束或不等式约束条件的优化问题。
在这里插入图片描述
其算法步骤可以总结为:
在这里插入图片描述

MATLAB程序编程

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

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

MATLAB程序:

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)=1;a=2;%r为惩罚因子,a为递增系数
%% 循环
while  D>e2 %罚因子迭代收敛条件
    x1=A(k);x2=B(k);
%判断点在不在可行域内,来选择惩罚函数
if x1-6>0
    u1=1;
else
    u1=0;
end
if x2-8>0
    u2=1;
else
   u2=0;
end
if x1+x2-11>0
    u3=1;
else
    u3=0;
end
%约束问题转换后的新目标函数
F=f+r(k)*u1*g1^2+r(k)*u2*g2^2+r(k)*u3*g3^2;
%梯度法求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程序如下:

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)=1;a=2;%r为惩罚因子,a为递增系数
%% 循环
while  D>e2 %罚因子迭代收敛条件
    x1=A(k);x2=B(k);
%判断点在不在可行域内,来选择惩罚函数
if x1-6>0
    u1=1;
else
    u1=0;
end
if x2-8>0
    u2=1;
else
   u2=0;
end
if x1+x2-11>0
    u3=1;
else
    u3=0;
end
%约束问题转换后的新目标函数
F=f+r(k)*u1*g1^2+r(k)*u2*g2^2+r(k)*u3*g3^2;
%单纯形法求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))

对于此案例运算的结果为:(6.0002,4.9972),外点法运行结果还是不错的!

  • 22
    点赞
  • 191
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
以下是使用外点罚函数法求解无约束优化问题的 MATLAB 代码示例: ``` function [xopt, fopt] = penalty(func, x0, penalty_func, constr_func, epsilon, max_iter) % func: 目标函数 % x0: 初始解 % penalty_func: 外点罚函数 % constr_func: 约束函数 % epsilon: 精度要求 % max_iter: 最大迭代次数 % 初始化 x = x0; iter = 0; while iter < max_iter % 检查是否满足精度要求 if penalty_func(x, constr_func) < epsilon xopt = x; fopt = func(xopt); return; end % 最小化罚函数 f = @(x) func(x) + penalty_func(x, constr_func); x = fminsearch(f, x); iter = iter + 1; end % 达到最大迭代次数仍未满足精度要求 warning('达到最大迭代次数但未满足精度要求'); xopt = x; fopt = func(xopt); end ``` 其中 `penalty_func` 和 `constr_func` 分别代表外点罚函数和约束函数。在运行代码前,需要先定义这两个函数。例如,以下是一个定义了罚函数和约束条件的例子: ``` function p = penalty_func(x, constr_func) % 罚函数 p = max(0, constr_func(x))^2; function c = constr_func(x) % 约束条件 c = x(1)^2 + x(2)^2 - 1; ``` 在这个例子中,我们使用一个简单的约束条件 $ x_1^2 + x_2^2 \leq 1 $。罚函数定义为 $ max(0, x_1^2 + x_2^2 -1)^2 $。这里的 `penalty_func` 和 `constr_func` 函数都只接受一个参数 `x`,即待优化的变量向量。在实际应用中,这些函数可能需要接受更多的参数,例如约束条件中的常数。 使用以上代码,我们可以调用 `penalty` 函数来解决无约束优化问题。例如,以下代码使用罚函数法求解 Rosenbrock 函数的最小值: ``` % Rosenbrock函数 rosen = @(x) 100*(x(2)-x(1)^2)^2 + (1-x(1))^2; % 罚函数法求解 penalty_func = @(x, constr_func) max(0, constr_func(x))^2; constr_func = @(x) x(1)^2 + x(2)^2 - 1; x0 = [-1.2, 1]; epsilon = 1e-6; max_iter = 100; [xopt, fopt] = penalty(rosen, x0, penalty_func, constr_func, epsilon, max_iter); % 输出结果 fprintf('最优解:x = [%f, %f]\n', xopt(1), xopt(2)); fprintf('最小值:f(x) = %f\n', fopt); ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值