【发布时间】:2014-12-22 05:39:23
【问题描述】:
假设我们有三个复矩阵和一个由这些矩阵组成的耦合微分方程组。
import numpy, scipy
from numpy import (real,imag,matrix,linspace,array)
from scipy.integrate import odeint
import matplotlib.pyplot as plt
def system(x,t):
a1= x[0];a3= x[1];a5= x[2];a7= x[3];
a2= x[4];a4= x[5];a6= x[6];a8= x[7];
b1= x[8];b3= x[9];b5= x[10];b7= x[11];
b2= x[12];b4= x[13];b6= x[14];b8= x[15];
c1= x[16];c3= x[17];c5= x[18];c7= x[19];
c2= x[20];c4= x[21];c6= x[22];c8= x[23];
A= matrix([ [a1+1j*a2,a3+1j*a4],[a5+1j*a6,a7+1j*a8] ])
B= matrix([ [b1+1j*b2,b3+1j*b4],[b5+1j*b6,b7+1j*b8] ])
C= matrix([ [c1+1j*c2,c3+1j*c4],[c5+1j*c6,c7+1j*c8] ])
dA_dt= A*C+B*C
dB_dt= B*C
dC_dt= C
list_A_real= [dA_dt[0,0].real,dA_dt[0,1].real,dA_dt[1,0].real,dA_dt[1,1].real]
list_A_imaginary= [dA_dt[0,0].imag,dA_dt[0,1].imag,dA_dt[1,0].imag,dA_dt[1,1].imag]
list_B_real= [dB_dt[0,0].real,dB_dt[0,1].real,dB_dt[1,0].real,dB_dt[1,1].real]
list_B_imaginary= [dB_dt[0,0].imag,dB_dt[0,1].imag,dB_dt[1,0].imag,dB_dt[1,1].imag]
list_C_real= [dC_dt[0,0].real,dC_dt[0,1].real,dC_dt[1,0].real,dC_dt[1,1].real]
list_C_imaginary= [dC_dt[0,0].imag,dC_dt[0,1].imag,dC_dt[1,0].imag,dC_dt[1,1].imag]
return list_A_real+list_A_imaginary+list_B_real+list_B_imaginary+list_C_real+list_C_imaginary
t= linspace(0,1.5,1000)
A_initial= [1,2,2.3,4.3,2.1,5.2,2.13,3.43]
B_initial= [7,2.7,1.23,3.3,3.1,5.12,1.13,3]
C_initial= [0.5,0.9,0.63,0.43,0.21,0.5,0.11,0.3]
x_initial= array( A_initial+B_initial+C_initial )
x= odeint(system,x_initial,t)
plt.plot(t,x[:,0])
plt.show()
我基本上有两个问题:
如何减少我的代码?我的意思是减少,有没有办法通过不单独写下所有组件来做到这一点,而是在解决系统的同时处理矩阵ODE?
而不是相对于 t(我的代码的最后 2 行)绘制矩阵的元素,我如何绘制特征值(绝对值)(比如说,矩阵 A 的特征值的绝对值作为 t) 的函数?
【问题讨论】:
-
您确定您的代码正确吗?
a1= x[0];a2= x[1];a3= x[2];a4= x[3];...结合A= matrix([ [a1+1j*a2,a3+1j*a4],...表示A的实部和虚部在x中交错,但是当你组装system(x,t)的返回值时,你列出了dA_dt的所有实部,然后是所有的虚部。你的意思是交错这些吗? -
微分方程为:dA(t)/dt= A(t)*C(t)+B(t)*C(t) ; dB(t)/dt= B(t)*C(t) 和 dC(t)/dt= C(t) 。任何矩阵的每个元素(每个元素的实部和虚部)都是 t 的函数。
-
顺便说一句,我提供的代码非常适合我,除了我提到的 2 个问题。
-
我了解 eqns;我的问题是关于真实和想象的。
A、B和C中的值存储在x中。当您在system(x,t)的开头解压缩x时,很明显,例如,x[1]就是 imag。A[0,0]的一部分。所以system(x,t)返回的列表的第二个元素应该是A[0,0]的虚部的时间导数。也就是说,它应该是dA_dt[0,0].imag。你返回list_A_real + ...,这意味着你返回list_A_real[1]作为A[0,0]虚部的时间导数。但是list_A_real[1]是dA_dt[0,1].real,而不是dA_dt[0,0].imag。 -
@WarrenWeckesser,我明白了!所以你的意思是我在返回 ODE 的结果时没有正确维护顺序。但是,如果我将新的/返回的“A 矩阵”定义为 A= matrix([ [x[:,0]+1jx[:,4],x[:,1]+1j x[:,5]],[x[:,2]+1jx[:,6],x[:,3]+1jx[:,7]] ]) ?它可以完成工作,还是我必须坚持我的第一个任务顺序?
标签: python numpy matrix scipy odeint