2012-01-27 97 views
0

我已经在状态系统,在边界处有“强制”输入。我的SS方程是:zp = A * z * B(A是方阵和B柱)Matlab解决应用于状态空间系统的ODE,输入时间依赖

如果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 

我的问题是,当我申请一个斜率,因此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 

我希望你能帮助!

回答

2

您应该定义一个函数B,它随着t的不断变化并将其作为函数句柄传递。通过这种方式,您将允许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 
+0

谢谢你回答@jonnat。我明白你的意思,但是我没有弄懂如何编写代码,但我正在努力。 – marco 2012-01-27 20:47:43

+0

@marco,'B'函数只是依赖于'x'的斜坡。例如,B的主体可能是'y =(x-tinit)/(tfinal-tinit)*(Bmax-Bmin)+ Bmin' – foglerit 2012-01-28 01:10:22

+0

我已经通过了我的一周期待这个问题,我想我需要一个刹车来理解清楚我能做些什么。 B最初是一个带有“斜坡”的矩阵(可能在最后一行)。 B的大小为nz x size(t)。 @jonnat我认为你的“方式”可能是对的,但我需要编纂和验证。 谢谢你的病人和时间! – marco 2012-01-28 11:13:26