2

am*m 行列 S に diff eq のシステムがあります。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))
4

1 に答える 1

3

odeint行列ではなくベクトルが必要な場合は、ベクトルを指定する必要があります。コードのロジックをあまり変更したくない場合は、関数の外側をベクトルにするxことができますが、必要な場所に自由に適用することで、関数の内側を行列にすることができます。完全にテストするのに十分な情報が提供されませんでしたが、次のようなものが機能する可能性があります。(m**2,)(m, m).reshape(-1)

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)
于 2013-02-11T18:48:48.023 に答える