2013-02-11 21 views
1

我有一個am * m矩陣S中的diff eqs系統。S [i,j]是一個特定的物種濃度,受S [i -1,j]和S [i,j-1]用全矩陣(對象對於所需陣列來說物體太深)模擬笛子

我可以在每一步獲得每個條目的dx/dt(由update_matrix返回),但是我需要整合它來更新我的初始濃度(x相同作爲x_counts)。然而,scipy的integrate.odeint不接受矩陣作爲輸入(或返回值,並提出對象太深的錯誤。

任何方式,我可以調整這使用矩陣上的積分?我提供了一塊代碼:diffeq返回DX/dt的每個條目。update_matrix返回矩陣B,其中B [IJ] = DX [I,J]/dt的

def diffeq(x,i,j,coeffs): 
    if (i==1 and j==0): 
     return (-(coeffs.M(1,0)-coeffs.L(1,0)))+coeffs.d(1,0)-coeffs.get_phi()*x[1][0] 
    elif j==0: 
     return (-(coeffs.M(i,0)+coeffs.L(i,0)))*x[i][0]+coeffs.L(i-1,0)*x[i-1][0]+coeffs.d(i,j)-coeffs.get_phi()*x[i][0] 
    elif (i>1 and j>0): 
     return (-(coeffs.M(i,j)+coeffs.L(i,j)))*x[i][j]+coeffs.M(i,j-1)*x[i][j-1]+coeffs.L(i-1,j)*x[i-1][j]+coeffs.d(i,j)-coeffs.get_phi()*x[i][j] 
    elif i==1 and j>0: 
     return (-(coeffs.M(1,j)+coeffs.L(1,j)))*x[1][j]+coeffs.M(1,j-1)*x[1][j-1]+coeffs.d(1,j)-coeffs.get_phi()*x[1][j] 
    elif i==0 and j==1: 
     return -x[0][1]+coeffs.d(0,1)-coeffs.get_phi()*x[0][1] 
    elif i==0 and j>1: 
     return -j*x[0][j]+(j-1)*x[0][j-1]+coeffs.d(0,j)-coeffs.get_phi()*x[0][j] 


def update_matrix(x,coeffs,m): 
    update_matrix=numpy.zeros((m,m)) 
    for i in range(m+1): 
     for j in range(m+1-i): 
      update_matrix[m][m]=diffeq(x,i,j,coeffs) 
    return update_matrix 


def run_simulation_R2(a,q,m): 

    x_counts=numpy.zeros((m,m)) 
    x_counts[1][0]=1 
    x_counts[0][1]=1 
    coeffs=R2(a,q,m,x_counts) 
    t=range(0,100) 
    output = integrate.odeint(update_matrix, x_counts, t, args=(coeffs, m)) 
+1

FYI:我創建了一個名爲'odeintw' odeint'的'的包裝,處理矩陣微分方程:HTTPS:/ /github.com/WarrenWeckesser/odeintw – 2014-05-15 03:45:08

回答

2

如果odeint期望的向量,而不是一個矩陣,你將不得不放棄它是一個向量,如果你不想更改你的代碼的邏輯,你可以使x成爲你的函數外部的一個向量,但仍然是(m, m)矩陣,通過寬鬆地應用01無處不在需要。你沒給我們提供足夠的信息,以充分測試,但這樣的事情可能工作:

def update_matrix(x,coeffs,m): 
    x = x.reshape(m, m) 
    update_matrix=numpy.zeros((m,m)) 
    for i in range(m+1): 
     for j in range(m+1-i): 
      update_matrix[m][m]=diffeq(x,i,j,coeffs) 
    return update_matrix.reshape(-1) 

def run_simulation_R2(a,q,m): 
    x_counts=numpy.zeros((m,m)) 
    x_counts[1][0]=1 
    x_counts[0][1]=1 
    coeffs=R2(a,q,m,x_counts) 
    t=range(0,100) 
    output = integrate.odeint(update_matrix, x_counts.reshape(-1), t, 
           args=(coeffs, m)) 
    return output.reshape(m, m) 
+0

是的我使用了類似的方法,我在update_matrix和run_simulation之間創建了一個接口,這樣矩陣每次都變平和重構,它確實解決了問題 – carefullynamed 2013-02-11 22:56:40