0

xdot 值

成本函数

初值和终值

这就是我要解决的问题,我根据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)来应用边界条件

最优 x 值

最优输入值

但结果看起来像上面的图片。首先,我通过将全局常数 N 定义为 10 来确定区间数为 10,但 x 的区间数为 45。我试图找出问题所在,但找不到问题所在。

除此之外,u_opt 与我任意定义的初始 u 相同。

有人可以就上述代码提供一些建议吗?很抱歉打扰您,非常感谢您阅读本文。

4

0 回答 0