原代码的约束是求和函数,目标函数是x*y最小值,现在我想让这个求和函数
∑(1849000*y + 8600*(k -1 )*y^2 + 10*( k - 1 )^2 * y^3)/ ...
((400+(k-1)*y)* (24900+860*(k-1)* y+(k-1)^2 *y^2));有最大
,x*y=88为约束条件
请改写以下两个代码(由Joel解答)
[X,Y] = meshgrid(6:12,8:16);
F = X.*Y;
C = true(size(X));
for i = 1:numel(X)
n = X(i);% x(1)
y = Y(i);% x(2)
c = 0;
for k = 1:1:n
c = c+(1849000*y + 8600*(k -1 )*y^2 + 10*( k - 1 )^2 * y^3)/ ...
((400+(k-1)*y)* (24900+860*(k-1)* y+(k-1)^2 *y^2));
end
C(i) = 6-c<=0;
end
minf = min(F(C));
if(isempty(minf))
fprintf('无解\n')
else
I = find((minf==F)&C);
x = X(I);
y = Y(I);
fmin = x*y;
fprintf('在x=%d,y=%d处目标函数有最大值%d\n',x,y,fmin)
end
F(~C)=NaN;
surf(X,Y,F)
clear; clc;
fun = @( x ) x( 1 ) * x( 2 );
A = [];
Aeq = [];
b = [];
beq = [];
lb = [ 6, 7];
ub = [ 10, 16 ];
x0 = [1,1];
exitflag = -1;
options = optimoptions('fmincon','Algorithm','sqp');
while(exitflag<=0)
x0 = lb + ( ub - lb ) .* rand( 1, 2 );
[ x, fval, exitflag ] = fmincon( fun, x0, A, b, Aeq, beq, lb, ub, @MyNonCon ,options)
end
MyNonCon(x0)
function [ c, ceq ] = MyNonCon( x )
f = @( m ) (1849000.*x(2) + 8600 .*( m - 1 ).* x( 2 )^2 + 10.*( m - 1 ).^2 .* x( 2 ).^3) ./ ...
((400+(m-1).*x(2)).* (24900+860.*(m - 1).* x( 2 ) + ( m - 1 ).^2 .* x( 2 ).^2 ));
eq = sum( f( [ 1 : 1 : x( 1 ) ] ) );
c =6 -double( eq );
ceq = [];
end
你好,类似这样就行
[X,Y] = meshgrid(6:12,8:16);
F = X.*Y;
C = zeros(size(X));
for i = 1:numel(X)
n = X(i);% x(1)
y = Y(i);% x(2)
c = 0;
for k = 1:1:n
c = c+(1849000*y + 8600*(k -1 )*y^2 + 10*( k - 1 )^2 * y^3)/ ...
((400+(k-1)*y)* (24900+860*(k-1)* y+(k-1)^2 *y^2));
end
C(i) = c;
end
minf = min(C(X.*Y==88));
if(isempty(minf))
fprintf('无解\n')
else
I = find((minf==C)&X.*Y==88);
x = X(I);
y = Y(I);
fmin = C(I);
fprintf('在x=%d,y=%d处目标函数有最小值%d\n',x,y,fmin)
end