位置 1 处的索引超出数组边界(不能超出 1)。 出错 work2>@(x)f(a,b,x(1))+f(a,b,x(2))+f(a,b,x(3))+c*(x(1)+x(2)) (第 5 行) fun = @(x) f(a, b, x(1)) + f(a, b, x(2)) + f(a, b, x(3)) + c * (x(1) + x(2)); 出错 fmincon (第 567 行) initVals.f = feval(funfcn{3},X,varargin{:}); 出错 work2 (第 14 行) [x, fval] = fmincon(fun, x0, A, b, Aeq, beq, lb, ub, [], options); 原因: Failure in initial objective function evaluation. FMINCON cannot continue.
时间: 2023-09-26 20:15:14 浏览: 168
关于C#索引超出了数组界限的问题??
4星 · 用户满意度95%
这个错误可能是由于目标函数的输入参数 x 维度不一致导致的。请确保在定义目标函数时,使用的 x 与在 fmincon 函数中传递的 x 维度一致。在这个问题中,由于使用了 x(1),x(2),x(3) 来表示三个季度的生产量,因此需要将 x 定义为一个 3x1 的矩阵,而不是一个标量。修改后的目标函数如下:
```matlab
fun = @(x) f(a, b, x(1)) + f(a, b, x(2)) + f(a, b, x(3)) + c * (x(1) + x(2));
```
同时,在 fmincon 函数中也需要将初始值 x0 定义为一个 3x1 的矩阵。修改后的完整代码如下:
```matlab
a = 50;
b = 0.2;
c = 4;
% 定义目标函数
fun = @(x) f(a, b, x(1)) + f(a, b, x(2)) + f(a, b, x(3)) + c * (x(1) + x(2));
% 定义不等式约束
A = [-1 0 0; -1 -1 0; 0 -1 -1];
b = [-40; -60; -80];
Aeq = [];
beq = [];
% 定义变量的取值范围
lb = [0; 0; 0];
ub = [100; 100; 100];
% 求解
x0 = [0; 0; 0];
options = optimoptions('fmincon', 'Display', 'iter');
[x, fval] = fmincon(fun, x0, A, b, Aeq, beq, lb, ub, [], options);
% 输出结果
disp(['第一季度生产:' num2str(x(1)) ' 台,存储:' num2str(40 - x(1)) ' 台']);
disp(['第二季度生产:' num2str(x(2)) ' 台,存储:' num2str(60 - x(1) - x(2)) ' 台']);
disp(['第三季度生产:' num2str(x(3)) ' 台,存储:' num2str(80 - x(2) - x(3)) ' 台']);
disp(['总成本:' num2str(fval)]);
function cost = f(a, b, x)
cost = a * x + b * x^2;
end
```
希望这次修改可以解决问题。
阅读全文