2012-01-27 85 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

相關問題