clc;clear
a=3;
b=2;
c=4;
z1=2;
z2=5;
z3=3;
fun=@(x)(a*x(1)^z1+b*x(2)^z2+c*x(3)*z3);
A=-[3 .5 7;2 4 5;7 3 9];
b=-[5;7;15];
p1=@(x) A(1,1)*x(1)+A(1,2)*x(2)+A(1,3)*x(3)-b(1);
p2=@(x) A(2,1)*x(1)+A(2,2)*x(2)+A(2,3)*x(3)-b(2);
p3=@(x) A(3,1)*x(1)+A(3,2)*x(2)+A(3,3)*x(3)-b(3);
x_al=[1;1;1];
r_al=[1;1;1];
pena=10; %惩罚系数
c_scale=10; %乘法系数乘数
cta=0.8; %下降标准系数
e_al=0.01; %误差控制范围
max_itera=250;
out_itera=1; %迭代次数
while out_itera<max_itera
x_al0=x_al;
r_al0=r_al;
compareFlag=((max(-p1(x_al0),r_al(1)/pena)^2+max(-p2(x_al0),r_al(2)/pena)^2+max(-p3(x_al0),r_al(3)/pena)^2))^0.5;
g=@(x)(fun(x)+(0.5/pena)*(max(0,(r_al(1)+pena*p1(x))).^2-r_al(1).^2)+(0.5/pena)*(max(0,(r_al(2)+pena*p2(x))).^2-r_al(2).^2)+(0.5/pena)*(max(0,(r_al(3)+pena*p3(x))).^2-r_al(3).^2));
if g(x_al0)==-inf
break
end
[X,Fval]=fminunc(g,x_al0);
x_al=X;
compare0=((max(-p1(x_al),r_al(1)/pena)^2+max(-p2(x_al),r_al(2)/pena)^2+max(-p3(x_al),r_al(3)/pena)^2))^0.5;
if compare0<e_al
break;
end
if compare0<cta*compareFlag
else
pena=c_scale*pena; %乘子系数最大1000;
end
r_al(1)=min(0,r_al(1)+pena*p1(x_al));
r_al(2)=min(0,r_al(2)+pena*p2(x_al));
r_al(3)=min(0,r_al(3)+pena*p3(x_al));
out_itera=out_itera+1;
end
p1(X)
p2(X)
p3(X)
评论0