面向对象有限元编程|数值计算类

  • 生成矩阵

python主要依赖第三方库numpy,其中np.array和np.mat有区别,主要体现在:

  1. 生成矩阵所需格式不同

np.mat可以从字符串或列表中生成,而np.array只能从列表中生成。

代码语言:javascript
复制

import numpy as np
a = np.mat("1,2; 3,4")  #字符串生成2x2矩阵
b = np.mat([ [5,6], [7,8] ])   #列表生成2x2矩阵

c = np.array([ [2,6], [5,8] ])

  1. 生成的数组运算方式不同

np.array生成矩阵,用np.dot()表示矩阵乘法,星号()或np.multiply()表示点乘(对应元素相乘)。

代码语言:javascript
复制

import numpy as np
a = np.array([ [1, 1], [1, 1] ])
b = np.array([ [2, 2], [2, 2] ])
c = np.dot(a, b) #矩阵乘法
d = np.multiply(a, b) #对应元素相乘
e = a
b #对应元素相乘

np.mat生成矩阵,星号(*)和np.dot()表示矩阵乘法,np.multiply()表示点乘(对应元素相乘)。

代码语言:javascript
复制

import numpy as np
a = np.mat([[1, 1], [1, 1]])
b = np.mat([[2, 2], [2, 2]])

c = a*b #矩阵乘法
d =np.dot(a, b) #矩阵乘法
e = np.multiply(a, b) #对应元素相乘

  • 矩阵索引

用a[0][0]访问矩阵a中第一行第一列元素,注意索引值从0开始。

  • 解方程组

用np.linalg.solve(A, b)解方程组Ax=b,例如

代码语言:javascript
复制
##方程组Ax=b的解
import numpy as np
A =np.array( [ [6, -1.5, 1], [-1.5, 1.875, -1.5], [1, -1.5, 2] ])
b = np.array( [ 30, -10, 0 ] )
x = np.linalg.solve(A, b)
print("Solution", x)

C++的数值计算类可以用第三方数值计算库,比如Eigen, BLAS等。