求解这个索引不能超过1的怎么改
首先抱歉,因为可能并不能帮到您。
其次,报错的原因在于对fmincon的错误使用,代码
S(j+1,1) = fmincon(@(S) MPC(S, j), S(j+1,1), [], [], [], [], 96, 300, nonlinconstr, options);
中,S(j+1,1)是一个需要带入到函数MPC(S,j)中作为S的初始值的值。
将初始值S(j+1,1)带入函数MPC后,MPC的输入变量S为一个1x1的标量,因此,在第50行中,S(i+1,-14)为S(2,-14)超出索引。同时,serendipity★ 也指出了此处应该是S(i+1,1)。
以上,是对报错的原因分析。
除了这个问题,您的代码还有一些问题。由于基本工作区的中变量一般不会带入到函数工作区中,函数MPC中没有定义变量 r和eta,直接调用同样会报错。
此外,您应当注意到,fmincon只能优化返回标量的函数。您的函数MPC返回向量,不能使用fmincon进行优化。
最后,不建议您使用matlab自带的优化函数进行模型预测控制。
关于MPC,状态变量和控制变量最好还是区分开来。
以上,希望对您有所帮助。
经过分析你的代码,我发现了一个错误。在MPC函数内部的循环里,你使用了S(i+1,-14)^(-2)*r
,这里的S(i+1,-14)
可能是一个错误。我猜想,你可能想要使用S(i+1,1)
,因为S是一个列向量。以下是修改后的代码:
P = readtable('C:\Users\lenovo-pc\Desktop\data2.xlsx');
n = size(P,1);
t = ones(n+1,1);
sigma = 1.3e-3;
a = 1.63e-16;
b = 5;
r = 1e-6;
eta = zeros(n+1,1);
eta(1,1) = 0.4;
S = 250*ones(n,1);
% 计算初始阶段的P
P_act = zeros(n+1,1);
P_act(1,1) = eta(1,1)*250;
for i = 2:n
P_act(i,1) = eta(i,1)*S(i,1);
end
for j = 1:n
% 使用匿名函数构建非线性约束条件
nonlinconstr = @(S) abs(eta(j+1,1)*S-98);
% 定义fmincon的选项
options = optimoptions(@fmincon,'Display','off');
% 使用fmincon求解最优值
S(j+1,1) = fmincon(@(S) MPC(S, j), S(j+1,1), [], [], [], [], 96, 300, nonlinconstr, options);
% 更新P_act值
P_act(j+1,1) = eta(j+1,1)*S(j+1,1);
end
% 绘制P的图像
figure;
plot(1:n+1,P_act,'b-',1:n+1,98*ones(n+1,1),'r--');
xlabel('阶段编号');
ylabel('P');
legend('预测值','目标值');
% 绘制S的图像
figure;
plot(1:n+1,S,'b-',1:n+1,250*ones(n+1,1),'r--');
xlabel('阶段编号');
ylabel('S');
legend('当前值','初始值');
function [P,eta] = MPC(S, k)
Q = zeros(k+3,1);
K = zeros(k+3,1);
Q(1,1) = 1;
for i = 1:k
Q(i+1,1) = (1-K(i,1))*Q(i,1)+(1.3e-3)^2;
K(i,1) = Q(i+1,1)/(Q(i+1,1)+S(i+1,1)^(-2)*r);
eta(i+1,1) = eta(i,1)-a*S(i+1,1)^b*t(i,1)+K(i,1)*(P_act(i+1,1)/S(i+1,1)-eta(i,1));
end
P = eta(k+1,1)*S(k+1,1);
end
修改后的代码应该可以正常运行。这个代码的目标是从初始数据开始,重复优化,求
%定义目标函数
f = @(x) sum((x.^2).*cos(x), 'all');
%定义约束函数
nonlcon = @(x) deal([], x-1);
%定义初值和上下限
x0 = ones(150,1);
lb = -Inf(size(x0));
ub = ones(size(x0));
%调用优化函数
[x, fval] = fmincon(f, x0, [], [], [], [], lb, ub, nonlcon);
%输出结果
disp(['最小值为 ', num2str(fval)]);
解释:这里定义了一个目标函数f以及一个非线性约束函数nonlcon,其中nonlcon对于每个决策变量x(i)使用deal([], x(i)-1)来表示x(i)<=1这个约束条件。然后使用fmincon函数调用这些函数进行优化,设置初值为全1的150行1列数组,所有元素的上下限为-inf和1,最后得到最小化值和相应的决策变量。