如何将 4 个矩阵连接成一个大矩阵而不看起来很奇怪?

问题描述 投票:0回答:1

我正在尝试求解矩阵形式的微分方程。 每当我将我的 4 个小矩阵连接成一个大矩阵时,打印的结果太奇怪了,我不知道它是否正确。

import numpy as np
from sympy import *
from sympy import init_printing
# from scipy.integrate import odeint
from scipy.integrate import solve_ivp
init_printing()

params = {'m1': 1, 'm2': 2, 'k1': 1, 'k2': 2, 'c1': 0.1, 'c2': 0.1} 
params.update({'N' : 3}) 
params['dimM'] = 4*params['N'] 


##---------------------------------------## M1 et M2 ##--------------------------------------------------##
M1 = np.zeros([2*params['N'],2*params['N']])
print('M1 = \n', M1)

M2 = np.eye(2*params['N'])
print('M2 = \n', M2)

# m1 pour les indices pair
# m2 pour les indices impair

##---------------------------------------## M3 ##--------------------------------------------------------##

v3 = np.zeros(2*params['N'])
v3[::2]= -(params['k1']/params['m2'] - params['k2']/params['m2'])
v3[1::2]= -(params['k1']/params['m1'] - params['k2']/params['m1'])
print("Vecteur v3:", v3, "\n")

v3_b = np.zeros(2*params['N']-1)
v3_b[::2] = params['k2']/params['m1']
v3_b[1::2] = params['k1']/params['m2']
print("Vecteur v3_b:", v3_b, "\n")

M3 = np.diag(v3, 0) + np.diag(v3_b, +1) + np.diag(v3_b, -1)
print('M3 = \n', M3)

##---------------------------------------## M4 ##--------------------------------------------------------##

v4 = np.zeros(2*params['N'])
v4[::2]= -(params['c1']/params['m2'] - params['c2']/params['m2'])
v4[1::2]= -(params['c1']/params['m1'] - params['c2']/params['m1'])
print("Vecteur v4:", v4, "\n")

v4_b = np.zeros(2*params['N']-1)
v4_b[::2] = params['c2']/params['m1']
v4_b[1::2] = params['c1']/params['m2']
print("Vecteur v4_b:", v4_b, "\n")

M4 = np.diag(v4, 0) + np.diag(v4_b, +1) + np.diag(v4_b, -1)
print('M4 = \n', M4)

##---------------------------------------## Matrice complete M ##----------------------------------------##

M = [[M1, M2], [M3,M4]]
print('M = \n', M)

如果执行该代码,您将能够看到所有矩阵。 M1、M2、M3、M4 都工作正常。 然而,M 显示了这个奇怪的混乱:

M = 
 [[array([[0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0.]]), array([[1., 0., 0., 0., 0., 0.],
       [0., 1., 0., 0., 0., 0.],
       [0., 0., 1., 0., 0., 0.],
       [0., 0., 0., 1., 0., 0.],
       [0., 0., 0., 0., 1., 0.],
       [0., 0., 0., 0., 0., 1.]])], [array([[0.5, 2. , 0. , 0. , 0. , 0. ],
       [2. , 1. , 0.5, 0. , 0. , 0. ],
       [0. , 0.5, 0.5, 2. , 0. , 0. ],
       [0. , 0. , 2. , 1. , 0.5, 0. ],
       [0. , 0. , 0. , 0.5, 0.5, 2. ],
       [0. , 0. , 0. , 0. , 2. , 1. ]]), array([[0.  , 0.1 , 0.  , 0.  , 0.  , 0.  ],
       [0.1 , 0.  , 0.05, 0.  , 0.  , 0.  ],
       [0.  , 0.05, 0.  , 0.1 , 0.  , 0.  ],
       [0.  , 0.  , 0.1 , 0.  , 0.05, 0.  ],
       [0.  , 0.  , 0.  , 0.05, 0.  , 0.1 ],
       [0.  , 0.  , 0.  , 0.  , 0.1 , 0.  ]])]]
math numerical-methods differential-equations
1个回答
0
投票

简单谷歌搜索后,发现 Numpy 有一个连接函数。

所以这个问题的答案就像使用 numpy 的连接函数一样简单,如下所示:

M = np.zeros([4*params['N'],4*params['N']])
Ma = np.concatenate((M1, M2), axis=1)
Mb = np.concatenate((M3, M4), axis=1)
M = np.concatenate((Ma, Mb), axis=0)
print('Ma = \n', Ma)
print('Mb = \n', Mb)
print('M = \n', M)
© www.soinside.com 2019 - 2024. All rights reserved.