在matlab中为什么改变目标函数,优化结果不变呢,哪儿出错了,或者有没有更合适的优化方法? 50
F = pi*X.*Y.*2.*(500+Z)*7850*12750*5.5+pi*Z.*2.*500*7850*12750*5.5;
C = true(size(X));
for i = 1:numel(X)
n = X(i);
y = Y(i);
z = Z(i);
c = 0;
for k = 1:1:n
c = c+((16*y/(500+(k-1)*y))*((((500+z+(k-1)*y)/500)^2)/(((500+z+(k-1)*y)/500)^2-1)))
end
x = n;
C(i) = ((31.4*(3^0.5))*((((500+x*y+z)/500)^2)/((((500+x*y+z)/500)^2)-1))-(z*177.8)/(x*y+z)-((186.6*0.95*x*y)/(x*y+z)))-2*c<=0;
end
minf = min(F(C));
if(isempty(minf))
fprintf('无解\n')
else
I = find((minf==F)&C);
x = X(I);
y = Y(I);
z = Z(I);
fmin =pi*x.*y.*(1000+2*z)*7850*12750*5.5+pi*z.*1000*7850*12750*5.5;
fprintf('在x=%d,y=%d,z=%d处目标函数有最小值%d\n',x,y,z,fmin)
end
F(~C)=NaN;
scatter3(X(:),Y(:),Z(:),10,F(:)) 展开
在matlab中为什么改变目标函数,优化结果不变呢,哪儿出错了?
一、实现题主给出的代码是无法得到最优解的,方法错误。
二、分析题主给出的具体问题,该问题实际非线性函数优化问题,应该使用fmincon()函数才对。求解方法的思路是:
1、自定义目标函数,myfun(x)。即
x1=x(1);y1=x(2);z1=x(3);
f=(1100962500*x1*y1*pi*(500+z1)+2652318750000*z1*pi);
2、自定义约束条件函数,mycon(x)。即
eq = symsum(16*y1/(500+m*y1)*(500+z1+m*y1)^2/((500+z1+m*y1)^2-500^2),m,1,n); %求和
31.4*sqrt(3)*(500+x1*y1+z1)^2/((500+x1*y1+z1)^2-500^2)-135.82/(x1*y1+z1)-177.27*x1*y1/(x1*y1+z1)-2*eq≤0 %约束
3、确定初始值,x0=[6 8 8]
4、确定x的上下限,即lb=[6,8,8];ub=[12,20,20];
5、使用fmincon()函数求出,x、y、z值
6、验证约束条件是否接近于0
按上述方法进行编程,运行可以得到如下结果。