我目前正在尝试用Python实现一个有限元方法,我必须求解一个线性系统,其中矩阵是欠定的,但系统应该由边界条件定义好。
准确地说,在一个非常简单的情况下,矩阵看起来像这样
[ 12., 6., -12., 6.],
[ 6., 4., -6., 2.],
[-12., -6., 12., -6.],
[ 6., 2., -6., 4.]]
右边是一个数组。
显然,第三列是第一列的负数,所以矩阵是欠定的。
然而,我想强制要求解向量中的第一个条目为零,因此解的形式应该是[0,x,y,z]
。现在我们有3个未知数和3个方程,所以应该有一个唯一的解,但我还没有找到一个scipy函数,因为正常的scipy.linalg.solve只需要矩阵和右侧作为输入。
我试着重写线性系统,但在某些情况下,右手边也有未定义的变量,未知向量中有更多的设定值,所以我正在寻找一个程序,可以用矩阵求解任何线性系统,以及两个未知向量。
1条答案
按热度按时间5anewei61#
问题陈述
你的问题有点令人困惑,因为你的矩阵的秩是2而不是3(这意味着它只给你2个线性无关的方程)。现在如果我把你的矩阵
A
和右边的b
,你能希望得到的最好的解是这样的请记住,这并不总是奏效。实际上,由于A的最后两列是线性无关的,所以这个解存在当且仅当
b
在A
的图像中。所以b
必须来自A
与一个向量的乘法。线性代数思想
现在如果我们记住线性代数中的一个简单事实,我们就可以找到一个,你希望的形式的解。我们可以将欠定线性方程的任何解
x
写为x=v+n
,其中v
是任何解,n
来自矩阵的零空间。所以我们只需要找到一个还没有在形式中的解,然后通过将它移动到A
的零空间来将它带入形式。示例
让我们来看一个明确的例子:假设我们有
(Of当然,我假设我们不知道
b=A@[1,2,3,4]
。)我们可以用v=np.linalg.lstsq(A, b)[0](=[ 0.4, -0.8, -0.4, 1.2])
找到一个解决方案。这里我们应该仔细检查A@v==b
(或者至少是np.isclose(A@v,b)
),因为如果没有解决方案,np.linalg.lstsq
不会抛出异常,而是给你一个近似的解决方案。如果你想要一个特殊形式的不同的解,你只需要计算零空间
然后我们如何改变
v
,使其在前两个条目中为零,原来
x=[0,0,0,2].