Matlab求解常微分方程应用于状态空间系统,输入与时间有关



我在State System中使用了"强制"输入。我的SS方程是:zp=A*z*B。(A是一个正方形矩阵,B是colunm)

如果B是一个步骤(沿着经验的时间),没有问题,因为我可以使用

  tevent = 2;
  tmax= 5*tevent;
  n =100;
  dT = n/tmax;
  t = linspace(0,tmax,n);
  u0 = 1 * ones(size(z'));
  B = zeros(nz,n);
  B(1,1)= utop(1)';
  A = eye(nz,nz);
  [tt,u]=ode23('SS',t,u0);

SS为:

  function zp = SS(t,z)
          global A B
          zp = A*z + B;
  end

我的问题是当我应用slop时,所以B将取决于时间。

  utop_init= 20;
  utop_final = 50;
  utop(1)=utop_init;
  utop(tevent * dT)=utop_final;
  for k = 2: tevent*dT -1
      utop(k) = utop(k-1) +(( utop(tevent * dT) - utop(1))/(tevent * dT));
  end
  for k = (tevent * dT) +1 :(tmax*dT)
      utop(k) = utop(k-1);
  end
  global A B
  B = zeros(nz,1);
  B(1,1:n) = utop(:)';
  A = eye(nz,nz);

我写了一个新的方程(试图解决),这个问题,但我无法调整"时间步长",而且我没有得到22x100的u(这是目标)。

  for k = 2 : n
  u=solveSS(t,k,u0);
  end

SolveSS有代码:

function [ u ] = solveSS( t,k,u0)
  tspan = [t(k-1) t(k)];
  [t,u] = ode15s(@SS,tspan,u0);
      function zp = SS(t,z)
          global A B
          zp = A*z + B(:,k-1);
      end
  end

我希望你能帮忙!

您应该定义一个随t不断变化的函数B,并将其作为函数句柄传递。通过这种方式,您将允许ODE求解器有效地调整时间步长(您使用的ode15s,一个僵硬的ODE求解程序,表明可变时间步长更为关键)

你的代码形式是这样的:

function [ u ] = solveSS( t,k,u0)
    tspan = [t(k-1) t(k)];
    [t,u] = ode15s(@SS,tspan,u0,@B);
        function y = B(x)
            %% insert B calculation
        end
        function zp = SS(t,z,B)
            global A
            zp = A*z + B(t);
        end
    end

最新更新