这就是我要解决的问题,我根据youtube做了一些代码来使用fmincon,但是不知道是哪一部分有问题。
global T N x0 x1 A B Q R
T = 5; N = 10;
A = -1; B = 1; Q = 1; R = 1;
x0 = [10];
x1 = [0];
u_init = ones(1,N);
options.Algorithm = 'sqp';
u_opt = fmincon(@costfun,u_init,[],[],[],[],[],[],@nonlcon,options);
首先,我定义了我需要的所有参数,
function xdot = my_ode2(t,x,u_in)
global A B;
u = udet2(t,u_in);
xdot = A*x + B*u;
end
然后我将 x 点定义为一个函数。
function vec = udet2(t,u_in)
global T N
a = N*t/T;
if a==0
vec = u_in(:,1);
else
vec = u_in(:,abs(ceil(a)));
end
end
然后,我定义了将 u 转换为适当向量的函数。
Function J = costfun(u_in)
[t,x] = ode45(@my_ode2,[0 T],x0,[],u_in);
func = @(x,u_in) Q*x.^2 + R*u_in.^2;
J = integral2(func,min(x),max(x),min(u_in),max(u_in))
end
之后,我通过求解 ode 函数 (xdot) 找到 x 值来定义成本函数
function [c,ceq] = nonlcon(u_in)
global T x0
[t,x] = ode45(@my_ode2,[0 T],x0,[],u_in);
n = length(x);
% There is no nonlinear nonequality constraints
c=[];
% x0 = 10, x(5) = 0
ceq(1) = x(1)-10;
ceq(2) = x(n);
ceq = ceq';
结尾
然后我通过求解 ode 函数(xdot)来应用边界条件
但结果看起来像上面的图片。首先,我通过将全局常数 N 定义为 10 来确定区间数为 10,但 x 的区间数为 45。我试图找出问题所在,但找不到问题所在。
除此之外,u_opt 与我任意定义的初始 u 相同。
有人可以就上述代码提供一些建议吗?很抱歉打扰您,非常感谢您阅读本文。