mlq123
2012-11-18, 14:14
%优化设计约束问题
%外点罚函数法利用梯度法求极小值
%输入初始值
%a=0.0001;
a=1;
X=[1;5];
n=0;
m=10;
c=80;
q1=0.0001;
q2=0.0001;
%u=1;
X1=[0;0];
%建立罚函数方程
syms x1 x2
fm=x2^3*((x1-3)^2-9)/(27*3^0.5);
g1=x2-x1/3^0.5;
g2=-x1+x2/3^0.5;
g3=x1+(x2/3^0.5)-6;
g4=-x1;
g5=-x2;
df1=diff(fm,x1);
df2=diff(fm,x2);
G1=inline(g1);
G2=inline(g2);
G3=inline(g3);
G4=inline(g4);
G5=inline(g5);
f=inline (fm);
df_1=inline(df1);
df_2=inline(df2);
%tf=((df_1(X(1)))^2+(df_2(X(2)))^2)^0.5;
%迭代循环开始
while a>0
n=n+1;
%建立外点罚函数方程
if n>=2
m=c*m;
end;
if G1(X(1),X(2))>0
gm1=(g1)^2;
else
gm1=0;
end;
if G2(X(1),X(2))>0
gm2=(g2)^2;
else
gm2=0;
end
if G3(X(1),X(2))>0
gm3=(g3)^2;
else
gm3=0;
end;
if G4(X(1))>0
gm4=(g4)^2;
else
gm4=0;
end;
if G5(X(2))>0
gm5=(g5)^2;
else
gm5=0;
end;
QXM=fm+m*(gm1+gm2+gm3+gm4+gm5);
qxm=inline(QXM);
%建立罚函数梯度方程
dQXM1=diff(QXM,'x1');
dQXM2=diff(QXM,'x2');
dfx=sqrt(dQXM1^2+dQXM2^2);
dqxm1=inline(dQXM1);
dqxm2=inline(dQXM2);
Hdfx=inline(dfx);
x1=X(1);
x2=X(2);
while Hdfx(x1,x2)>q1
n=n+1;
nf1=dqxm1(x1,x2);
nf2=dqxm2(x1,x2);
syms e
x1=x1+e*nf1;
x2=x2+e*nf2;
Ee=qxm(x1,x2);
dfe=diff(Ee);
e=eval(solve(dfe));
x1=x1+e*nf1;
x2=x2+e*nf2;
end;
X1(1,1)=x1;
X1(2,1)=x2;
if (((X(1)-X1(1))^2+(X(2)-X1(2))^2 )^0.5)>q1
n=n+1;
x1=X1(1,1);
x2=X1(2,1);
m=c*m;
else
U=abs((qxm(X(1),X(2))-qxm(X1(1),X1(2)))/qxm(X(1), X(2)));
if U>q2
n=n+1;
x1=X1(1,1);
x2=X1(2,1);
m=c*m;
else
a=-a;
end;
end;
%迭代停止
X=X1;
%pause;
end;
%输出X和y及循环次数n
X
y=f(X(1),X(2))
n
m
本人初学matlab此程序为本人所写但运行的时候提示错误“Error in ==> gt at 18
[varargout{1:nargout}] = builtin('gt', varargin{:});
Error in ==> U9 at 88
end;”不知道是怎么回事,希望高手指点!!!十分感谢
%外点罚函数法利用梯度法求极小值
%输入初始值
%a=0.0001;
a=1;
X=[1;5];
n=0;
m=10;
c=80;
q1=0.0001;
q2=0.0001;
%u=1;
X1=[0;0];
%建立罚函数方程
syms x1 x2
fm=x2^3*((x1-3)^2-9)/(27*3^0.5);
g1=x2-x1/3^0.5;
g2=-x1+x2/3^0.5;
g3=x1+(x2/3^0.5)-6;
g4=-x1;
g5=-x2;
df1=diff(fm,x1);
df2=diff(fm,x2);
G1=inline(g1);
G2=inline(g2);
G3=inline(g3);
G4=inline(g4);
G5=inline(g5);
f=inline (fm);
df_1=inline(df1);
df_2=inline(df2);
%tf=((df_1(X(1)))^2+(df_2(X(2)))^2)^0.5;
%迭代循环开始
while a>0
n=n+1;
%建立外点罚函数方程
if n>=2
m=c*m;
end;
if G1(X(1),X(2))>0
gm1=(g1)^2;
else
gm1=0;
end;
if G2(X(1),X(2))>0
gm2=(g2)^2;
else
gm2=0;
end
if G3(X(1),X(2))>0
gm3=(g3)^2;
else
gm3=0;
end;
if G4(X(1))>0
gm4=(g4)^2;
else
gm4=0;
end;
if G5(X(2))>0
gm5=(g5)^2;
else
gm5=0;
end;
QXM=fm+m*(gm1+gm2+gm3+gm4+gm5);
qxm=inline(QXM);
%建立罚函数梯度方程
dQXM1=diff(QXM,'x1');
dQXM2=diff(QXM,'x2');
dfx=sqrt(dQXM1^2+dQXM2^2);
dqxm1=inline(dQXM1);
dqxm2=inline(dQXM2);
Hdfx=inline(dfx);
x1=X(1);
x2=X(2);
while Hdfx(x1,x2)>q1
n=n+1;
nf1=dqxm1(x1,x2);
nf2=dqxm2(x1,x2);
syms e
x1=x1+e*nf1;
x2=x2+e*nf2;
Ee=qxm(x1,x2);
dfe=diff(Ee);
e=eval(solve(dfe));
x1=x1+e*nf1;
x2=x2+e*nf2;
end;
X1(1,1)=x1;
X1(2,1)=x2;
if (((X(1)-X1(1))^2+(X(2)-X1(2))^2 )^0.5)>q1
n=n+1;
x1=X1(1,1);
x2=X1(2,1);
m=c*m;
else
U=abs((qxm(X(1),X(2))-qxm(X1(1),X1(2)))/qxm(X(1), X(2)));
if U>q2
n=n+1;
x1=X1(1,1);
x2=X1(2,1);
m=c*m;
else
a=-a;
end;
end;
%迭代停止
X=X1;
%pause;
end;
%输出X和y及循环次数n
X
y=f(X(1),X(2))
n
m
本人初学matlab此程序为本人所写但运行的时候提示错误“Error in ==> gt at 18
[varargout{1:nargout}] = builtin('gt', varargin{:});
Error in ==> U9 at 88
end;”不知道是怎么回事,希望高手指点!!!十分感谢