function f=fun(y) global p x yi1 yi2 yi3 y=double(reshape(y,234,4)); zi1=double(y(:,1).*y(:,2)); zi2=double(y(:,1).*y(:,3)); zi3=double(y(:,1).*y(:,4)); f=0; for i=1:234 f=f+(2*p(i,1).*(1-x(i,1)).*y(i,1)+p(i,1).*yi3(i,1).*(y(i,2)-zi1(i,1))+p(i,1).*zi1(i,1).*(1-yi1(i,1))+p(i,1).*zi1(i,1).*(1-yi2(i,1))+p(i,1).*zi1(i,1).*(1-yi3(i,1))) end f=double(f); end% 定义目标函数 objecctive = @(y) fun(y) % 进行线性规划 options = optimoptions('linprog', 'Display', 'iter'); [x_opt, fval] = linprog(objecctive, A, b, Aeq, beq, lb, ub, options);出现以下报错:LINPROG requires the following inputs to be of data type double: 'f'. 出错 jixuner (第 183 行) [x_opt, fval] = linprog(objecctive, A, b, Aeq, beq, lb, ub, options);此时该如何解决
时间: 2023-10-03 15:07:10 浏览: 112
set_up_a_new_matrix.rar_4 3 2 1_生成矩阵_矩阵
这个错误发生是因为在linprog函数调用时,目标函数fun(y)返回的结果f的数据类型不是double。为了解决这个问题,你可以在fun函数中将f定义为double类型,并且在调用linprog函数之前,将目标函数fun的返回值f也转换为double类型。修改后的代码如下:
```matlab
function f=fun(y)
global p x yi1 yi2 yi3
y=double(reshape(y,234,4));
zi1=double(y(:,1).*y(:,2));
zi2=double(y(:,1).*y(:,3));
zi3=double(y(:,1).*y(:,4));
f=double(0); % 将f定义为double类型
for i=1:234
f=f+(2*p(i,1).*(1-x(i,1)).*y(i,1)+p(i,1).*yi3(i,1).*(y(i,2)-zi1(i,1))+p(i,1).*zi1(i,1).*(1-yi1(i,1))+p(i,1).*zi1(i,1).*(1-yi2(i,1))+p(i,1).*zi1(i,1).*(1-yi3(i,1)))
end
f=double(f);
end
objecctive = @(y) double(fun(y)); % 将目标函数fun的返回值转换为double类型
options = optimoptions('linprog', 'Display', 'iter');
[x_opt, fval] = linprog(objecctive, A, b, Aeq, beq, lb, ub, options);
```
这样修改之后,应该可以解决报错问题。请注意,在修改代码之前,最好先备份原始代码,以防修改后产生其他问题。
阅读全文