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

Matlab求解状态空间系统的常微分方程,输入与时间有关,matlab,state,space,ode,Matlab,State,Space,Ode,在状态系统中,有“强制”输入的边界。我的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)

在状态系统中,有“强制”输入的边界。我的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(这是目标)

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解算器有效地调整时间步长(您使用僵硬的ODE解算器
ode15s
,这表明可变时间步长更为重要)

代码的形式如下所示:

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

感谢您回答@jonnat。我明白你说的,但我不知道如何编码,但我正在努力。@marco,
B
函数将只是依赖于
x
的渐变。例如,B的主体可以是
y=(x-tinit)/(t最终tinit)*(Bmax Bmin)+Bmin
我花了一周时间研究这个问题,我想我需要一个刹车来清楚地了解我能做什么。B是一个在第一行(可能在最后一行)有“渐变”的矩阵。B有尺寸,nz x尺寸(t)@乔纳特:我认为你的“方式”可能是对的,但我需要编纂和验证。谢谢你的耐心和时间!如果B是矩阵,如何确定渐变效应?我可以用大小nz x 1粘贴B,并随时间改变B(1,1)和B(nz,1)吗?抱歉@jonnat,但这是一项重要的工作,我被允许:)如果你真的需要将
B
表示为矩阵,你可以这样做。但重要的是要理解,本质上,您希望
B
依赖于时间,并且使用ode15s时,您不能期望
SS
函数以固定的时间间隔进行计算。如果要将
B
作为矩阵传递到
SS
,则必须将
B
的列插值到任意时间点。
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