利用TensorFlow和Numpy求解线性方程组


1.利用TensorFlow求解线性方程组

TensorFlow中提供matrix_solve函数用于求解线性方程组。(源程序下载)

1
2
3
4
5
6
7
8
9
10
11
matrix_solve(matrix, rhs, adjoint=False, name=None)
'''
求解线性方程组。
参数:
matrix:张量,必须是下列类型之一:float64,float32,complex64,complex128;并且形状为 [..., M, M]。
rhs:张量,必须与 matrix 具有相同的类型;形状为 [..., M, K]。
adjoint:可选的 bool 值,默认取值为 False。布尔值表示是否用矩阵或其 (block-wise) adjoint 来求解。
name:操作的名称(可选)
返回值:
该操作返回张量,与 matrix 具有相同的类型;形状是 [..., M, K]。
'''

一般地,我们设解线性方程组形如 Ax=B,其中A是系数矩阵,B是常数向量/矩阵,x 是未知变量。下面举例说明TensorFlow求解线性方程组的过程。现有一线性方程组:
2x_{1}+x_{2}+2x_{3}+3x_{4}=10
x_{1}+2x_{2}+4x_{3}+4x_{4}=12
x_{1}-2x_{2}+4x_{3}+3x_{4}=7
-x_{1}+2x_{2}-6x_{3}+3x_{4}=-3

利用TensorFlow具体操作如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import numpy as np
import tensorflow as tf

#Create graph / 创建运算图
sess = tf.InteractiveSession()

#方程组系数矩阵
A = tf.constant([[2, 1, 2, 3],
                 [1, 2, 4, 4],
                 [1, -2, 4, 3],
                 [-1, 2, -6, 3]], dtype=tf.float32)

#常数矩阵
B = tf.constant(np.array([10, 12, 7, -3]).reshape(4, 1), dtype=tf.float32)

#打印求解结果
result = tf.matrix_solve(A, B).eval()
print('计算结果:')
for i, outcome in enumerate(result):
    print('x_'+str(i+1)+' = '+str(round(outcome[0],2)))

sess.close() # 关闭会话

需要注意的是,当系数矩阵不可逆时会抛出错误。

2.利用Numpy求解线性方程组

2.1按计算过程求解

按计算过程求解即先通过求解系数矩阵的逆矩阵,再通过逆矩阵与常数矩阵相乘,得到方程组的解。还以上节方程举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import numpy as np
##########按步骤计算############
#方程组系数矩阵
A = np.array([[2, 1, 2, 3],
              [1, 2, 4, 4],
              [1, -2, 4, 3],
              [-1, 2, -6, 3]])

#常数矩阵
B = np.array([10, 12, 7, -3]).reshape(4, 1)

#计算常数矩阵的逆矩阵
A_inverse = np.linalg.inv(A)

#计算结果,result_by_step为最终解
result_by_step = A_inverse.dot(B)

#打印求解结果
print('按步骤计算结果:')
for i, outcome in enumerate(result_by_step):
    print('x_'+str(i+1)+' = '+str(round(outcome[0],2)))

需要注意的是,当系数矩阵不可逆时会抛出错误。

2.2利用求解器计算

利用求解器计算,即通过np.linalg.solve求解器得到方程组的解。还以上节方程举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import numpy as np
##########利用求解器计算########
#方程组系数矩阵
A = np.array([[2, 1, 2, 3],
              [1, 2, 4, 4],
              [1, -2, 4, 3],
              [-1, 2, -6, 3]])

#常数矩阵
B = np.array([10, 12, 7, -3]).reshape(4, 1)

#计算结果,result_by_solver为最终解
result_by_solver = np.linalg.solve(A, B)

#打印求解结果
print('求解器求解结果:')
for i, outcome in enumerate(result_by_solver):
    print('x_'+str(i+1)+' = '+str(round(outcome[0],2)))

需要注意的是,当系数矩阵不可逆时会抛出错误。

点击下载源代码!

赞赏

微信赞赏支付宝赞赏

Have any Question or Comment?

发表评论

电子邮件地址不会被公开。 必填项已用*标注

分类目录

博客统计

  • 15,775 点击次数