有约束非线性最优化问题应用实例

[大谦MATLAB,dqmatlab点com]

【例6】试设计一个压缩圆柱螺旋弹簧,要求其质量最小。弹簧材料为65Mn,最大工作载荷Pmax=40N,最小工作载荷为0N,载荷变化频率fr = 25Hz,弹簧寿命为104h,弹簧钢丝直径d的取值范围为1~4mm,中径D2的取值范围为10~30mm,工作圈数n不应小于4.5圈,弹簧旋绕比C不应小于4,弹簧一端固定,一端自由,工作温度为50℃,弹簧变形量不小于10mm。

本题的优化目标是使弹簧质量最小,弹簧的质量可以表示为

\[M\approx\gamma(n+{n}_{2})\pi{D}_{2}\frac{\pi}{4}{d}^{2}\]

在上式中:\(\gamma\)—— 弹簧材料的密度,对于钢材\(\gamma\) =7.8106kg/mm3;

n—— 工作圈数;

n2—— 死圈数,常取n2=1.5~2.5,这里取n2=2;

D2—— 弹簧中径(mm);

d—— 弹簧钢丝直径(mm)。

将已知参数代入公式中,进行整理以后得到目标函数为

\[f(X)=M=0.192457\times1{0}^{-4}({x}_{2}+2){x}_{1}^{2}{x}_{3}\]

根据弹簧性能和结构上的要求,可写出问题的约束条件:

(1)强度条件

\[{g}_{1}(X)=350-163.0{x}_{1}^{-2.86}{x}_{3}^{0.86}\geq0\]

(2)刚度条件

\[{g}_{2}(X)=0.4\times1{0}^{-2}{x}_{1}^{-4}{x}_{2}{x}_{3}^{3}-10.0\geq0\]

(3)稳定性条件

\[{g}_{3}(X)=3.7{x}_{3}-({x}_{2}+1.5){x}_{1}-0.44\times1{0}^{-2}{x}_{1}^{-4}{x}_{2}{x}_{3}^{3}\geq 0\]

(4)不发生共振现象,要求

\[{g}_{4}(X)=0.356\times1{0}^{6}{x}_{1}{x}_{2}^{-1}{x}_{3}^{-2}-375\geq 0\]

(5)弹簧旋绕比的限制

\[{g}_{5}(X)={x}_{3}{x}_{1}^{-1}-4.0\geq 0\]

(6)对d, n, D2的限制

\[1.0\leq  d\leq  4.0\]

且应取标准值,即1.0, 1.2, 1.6, 2.0, 2.5, 3.0, 3.5, 4.0等。

\[4.5\leq n\leq50\]
\[10\leq{D}_{2}\leq30\]

由上可知,该弹簧的优化设计是一个三维的约束优化问题,其数学模型为

\[\left\{ \begin{matrix} \begin{matrix} \mathrm{\mathrm{min}}{M=0.192457\times1{0}^{-4}\left( {x}_{2}+2 \right){x}_{1}^{2}{x}_{3}} \\ {g}_{1}(X)=350-163{x}_{1}^{-2.86}{x}_{3}^{0.86}\leq0 \end{matrix} \\ {g}_{2}(X)=0.4\times1{0}^{2}{x}_{1}^{-4}{x}_{2}{x}_{3}^{3}-10\geq 0 \\ {g}_{3}(X)=3.7{x}_{3}-({x}_{2}+1.5){x}_{1}-0.44\times1{0}^{-2}{x}_{1}^{-4}{x}_{2}{x}_{3}^{3}\geq0 \\ {g}_{4}(X)=0.356\times1{0}^{6}{x}_{1}{x}_{2}^{-1}{x}_{3}^{-2}-375\geq0 \\ {g}_{5}(X)={x}_{3}/{x}_{1}-4\geq0 \\ {g}_{6}(X)={x}_{1}-1\geq 0 \\ {g}_{7}(X)=4-{x}_{1}\geq0 \\ {g}_{8}(X)={x}_{2}-4.5\geq 0 \\ {g}_{9}(X)=50-{x}_{2}\geq 0 \\ {g}_{10}(X)={x}_{3}-10\geq 0 \\ {g}_{11}(X)=30-{x}_{3}\geq 0 \end{matrix} \right.\]

取初始设计参数为X(0)=[2.0, 5.0, 25.0]T

首先,编写目标函数的M文件fmincono.m,返回x处的函数值f。

code.matlab
function f = myfun(x)
f = 0.192457*1e-4*( x(2)+2)*x(1)^2 * x(3);

由于在约束条件中有非线性约束,所以需要编写一个描述非线性约束条件的M文件fminconc.m:

code.matlab
function [c,ceq] = mycon(x)
c(1)=350-163*x(1)^( -2.86)*x(3)^0.86;
c(2)=10-0.4*0.01*x(1)^( -4)*x(2)*x(3)^3;
c(3)=(x(2)+1.5)*x(1)+0.44*0.01*x(1)^( -4)*x(2)*x(3)^3-3.7*x(3);
c(4)=371-0.356*1e6*x(1)*x(2)^( -1)*x(3)^( -2);
c(5)=4-x(3)/x(1);
ceq=0;

然后,设置线性约束的系数:

code.matlab
>> A=[-1  	 0  	 0
    1 	 0  	 0
     0  	-1  	 0
    0  	 1  	 0
    0  	 0  	 -1
    0  	 0  	 1];
>> b=[-1;4; -4.5;50; -10;30];

下一步给定初值,给定变量的下限约束,并调用优化过程。

code.matlab
>> x0 = [2.0; 5.0; 25.0];
>> lb=zeros(3,1);
>> [x,fval,exitflag,output]=fmincon(@fmincono,x0,A,b,[],[], lb,[],@fminconc)

计算结果为:

code.matlab
x =
    1.0000
    4.5001
   10.0001
fval =
    0.0013
exitflag =
     1
output =
  包含以下字段的 struct:
         iterations: 27
          funcCount: 131
    constrviolation: 0
           stepsize: 6.9192e-05
          algorithm: 'interior-point'
      firstorderopt: 1.6000e-08
       cgiterations: 5
            message: 'Local minimum found that satisfies the constraints….'
       bestfeasible: [1×1 struct]

所以,当弹簧钢丝直径d、工作圈数n及中径D2分别取1.0000、4.5001和10.0001时,弹簧质量最小,为1.3克。