首页 > 解决方案 > 使用带有对称系数矩阵的 scipy.linalg.solve (assume_a='sym')

问题描述

我正在尝试使用 scipy 的linalg.solve函数求解未知 x 的线性方程组 A * x = b。这是一个运行良好的示例:

import numpy as np
import scipy.linalg as linalg

A = np.array([[ 0.18666667, 0.06222222, -0.01777778],
              [ 0.01777778, 0.18666667,  0.01777778],
              [-0.01777778, 0.06222222,  0.18666667]])
b = np.array([0.26666667, -0.26666667, -0.4])
x = linalg.solve(A, b, assume_a='gen')

结果是x = [1.77194417, -1.4555256, -1.48892533],这是一个正确的解决方案。这可以通过计算得到验证A.dot(x),结果为[0.26666667, -0.26666667, -0.4]。由于这与 相同b,因此解决方案是正确的。

然而,系数矩阵A是对称的,即主对角线上方和下方的值相同。如果我正确理解文档,为了更有效地解决此类问题,该solve函数允许设置参数assume_a='sym'。不幸的是,使用以下代码(给定相同的Aand b)会导致找到不正确的解决方案:

x = linalg.solve(A, b, assume_a='sym')

结果是x = [1.88811181, -1.88811181, -1.78321672],这与上面的解决方案不同。计算A.dot(x)结果为[0.26666667, -0.35058274, -0.48391607]。由于这与 不同b,因此该解决方案似乎不正确。

我想知道我的代码是否有任何问题,或者我对对称矩阵或预期结果的理解是否完全错误!?也许矩阵必须满足与 一起使用的附加约束assume_a='sym'

我很感激你的回答。提前致谢!

标签: pythonnumpyscipy

解决方案


认为它不会发生。我提供了一个简短的回答。

非对称A

import numpy as np
import scipy.linalg as linalg

A = np.array([[ 0.18666667, 0.06222222, -0.01777778],
              [ 0.01777778, 0.18666667,  0.01777778],
              [-0.01777778, 0.06222222,  0.18666667]])
b = np.array([0.26666667, -0.26666667, -0.4])
x = linalg.solve(A, b, assume_a='gen')
np.allclose(A @ x,b)

出去:

真的

这表明求解器运行良好。

对称 A

# use you upper triangular A to get a symmetric matrix
A_symm = (np.triu(A) + np.triu(A).T -np.diag(A.diagonal()))

# solve the equations
x = linalg.solve(A_symm, b, assume_a='sym')
np.allclose(A_symm @ x,b)

出去:

真的

它仍然有效。

如果将非对称矩阵A传递给求解器,然后指定assume_a = 'sym',求解器将仅使用 的上三角矩阵A见下文:

x = linalg.solve(A, b, assume_a='sym')
np.allclose(A @ x,b),x

出去:

(假,数组([1.88811181,-1.88811181,-1.78321672]))

结果表明求解器工作“错误”,但结果x与结果相同linalg.solve(A_symm, b, assume_a='sym')


推荐阅读