我优化程序的本意是想在两条曲线取j个点,在y相等的情况下,两条曲线对应的x的差的总和值最小,但是好像目标函数太复杂,计算出的结果就迭代一次,根本就不是想要的结果,求高手帮忙呀,看看程序的问题再哪里,我用的是fmincon的优化,下面是我的程序
主函数CODE:
clc;clear;
%format long;
A=[-1 0;0 -1];b=[0;0];
%A=[0 -zp/rp;0 zp/rp;1 0;-1 0];b=[-c1;c2;rp*(sin(pi/zp))/d1;-rp*(sin(pi/zp))/d2];
%lb=[1;0.6];ub=[7;3];
[x,fval,exitflag,output]=fmincon(@xiuxingOptimFun,[0.1 0.1],A,b,[],[],[0;0],[1.5;1.5],@xiuxingConFun)
%画图
rp=72.5;
rrp=4;
a=1.4;
zc=43;
zp=44;
data=0.14*pi/180;
kd1=a*zp/(rp);
for pha=0:0.002*pi/zc:pi/zc
s1=1+kd1^2-2*kd1.*cos(pha);
i=zp/zc;
xd5=(rp-rrp.*s1.^(-1/2)).*cos((1-i).*pha-data)-(a/rp).*(rp-zp*(rrp).*s1.^(-1/2)).*cos(i.*pha+data);
yd5=(rp-rrp.*s1.^(-1/2)).*sin((1-i).*pha-data)+(a/rp).*(rp-zp*(rrp).*s1.^(-1/2)).*sin(i.*pha+data);
xd7=(rp-rrp.*s1.^(-1/2)).*cos((1-i).*pha)-(a/rp).*(rp-zp*(rrp).*s1.^(-1/2)).*cos(i.*pha);
yd7=(rp-rrp.*s1.^(-1/2)).*sin((1-i).*pha)+(a/rp).*(rp-zp*(rrp).*s1.^(-1/2)).*sin(i.*pha);
%plot(x,y,'-','linewidth',3);
%plot(x,y,'-');
%hold on
kd2=a*zp/(rp+x(2));
s2=1+kd2^2-2*kd2.*cos(pha);
xd6=(rp+x(2)-(rrp+x(1)).*s2.^(-1/2)).*cos((1-i).*pha)-(a/(rp+x(2))).*(rp+x(2)-zp*(rrp+x(1)).*s2.^(-1/2)).*cos(i.*pha);
yd6=(rp+x(2)-(rrp+x(1)).*s2.^(-1/2)).*sin((1-i).*pha)+(a/(rp+x(2))).*(rp+x(2)-zp*(rrp+x(1)).*s2.^(-1/2)).*sin(i.*pha);
plot(xd5,yd5,'r');
hold on
plot(xd6,yd6);
hold on
plot(xd7,yd7,'g');
hold on
end
下面这个是目标函数CODE:
function y=xiuxingOptimFun(x)
rp=72.5;
rrp=4;
a=1.4;
zc=43;
zp=44;
P=zeros(1,10000);
xd1=P;
yd1=P;
xd2=P;
yd2=P;
yd3=P;
yd4=0;
m=1;
j=1;
data=0.14*pi/180;
kd1=a*zp/(rp);
for pha=0:0.0002*pi/zc:pi/zc
s1=1+kd1^2-2.*kd1.*cos(pha);
i=zp/zc;
xd1(j)=(rp-rrp.*s1.^(-1/2)).*cos((1-i).*pha-data)-(a/rp).*(rp-zp*(rrp).*s1.^(-1/2)).*cos(i.*pha+data);
yd1(j)=(rp-rrp.*s1.^(-1/2)).*sin((1-i).*pha-data)+(a/rp).*(rp-zp*(rrp).*s1.^(-1/2)).*sin(i.*pha+data);
%plot(x,y,'-','linewidth',3);
%plot(x,y,'-');
%hold on
kd2=a*zp./(rp+x(2));
s2=1+kd2^2-2.*kd2.*cos(pha);
xd2(j)=(rp+x(2)-(rrp+x(1)).*s2.^(-1/2)).*cos((1-i).*pha)-(a/(rp+x(2))).*(rp+x(2)-zp*(rrp+x(1)).*s2.^(-1/2)).*cos(i.*pha);
yd2(j)=(rp+x(2)-(rrp+x(1)).*s2.^(-1/2)).*sin((1-i).*pha)+(a/(rp+x(2))).*(rp+x(2)-zp*(rrp+x(1)).*s2.^(-1/2)).*sin(i.*pha);
j=j+1;
end
for k=1:1:j-1
for o=1:1:j-1
if(yd1(k)-yd2(o)<=0.01)
yd3(m)=abs(xd1(k)-xd2(o));
yd4=yd4+yd3(m);
m=m+1;
end
end
end
%plot(x,y,'-','linewidth',3);
%plot(x,y,'-');
%hold on
y=yd4;
约束条件CODE:
function [c,ceq]=xiuxingConFun(x)
c=[];
ceq=x(1)-x(2)-0.02;