Допустим, у нас есть три комплексные матрицы и система связанных дифференциальных уравнений с этими матрицами.
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
, за которыми следуют все мнимые части. Вы хотели их перемежать? - person Warren Weckesser   schedule 27.10.2014A
,B
иC
хранятся вx
. Когда вы распаковываетеx
в началеsystem(x,t)
, ясно, что, например,x[1]
- это изображение. часть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
. - person Warren Weckesser   schedule 27.10.2014dxdt
. Вы можете принять любое соглашение для присвоения компонентовA
,B
иC
x
, но вы должны использовать то же соглашение для присвоения производных по времени этих компонентовdxdt
. - person Warren Weckesser   schedule 27.10.2014