numpy 用两个向量中的未知数进行scipy求解

zzlelutf  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(95)

我目前正在尝试用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只需要矩阵和右侧作为输入。
我试着重写线性系统,但在某些情况下,右手边也有未定义的变量,未知向量中有更多的设定值,所以我正在寻找一个程序,可以用矩阵求解任何线性系统,以及两个未知向量。

5anewei6

5anewei61#

问题陈述

你的问题有点令人困惑,因为你的矩阵的秩是2而不是3(这意味着它只给你2个线性无关的方程)。现在如果我把你的矩阵A和右边的b,你能希望得到的最好的解是这样的

A@[0,0,x,y]=b.

请记住,这并不总是奏效。实际上,由于A的最后两列是线性无关的,所以这个解存在当且仅当bA的图像中。所以b必须来自A与一个向量的乘法。

线性代数思想

现在如果我们记住线性代数中的一个简单事实,我们就可以找到一个,你希望的形式的解。我们可以将欠定线性方程的任何解x写为x=v+n,其中v是任何解,n来自矩阵的零空间。所以我们只需要找到一个还没有在形式中的解,然后通过将它移动到A的零空间来将它带入形式。

示例

让我们来看一个明确的例子:假设我们有

b=[12,4,-12,8](=A@[1,2,3,4]).

(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不会抛出异常,而是给你一个近似的解决方案。
如果你想要一个特殊形式的不同的解,你只需要计算零空间

null_space = scipy.linalg.null_space(A)

然后我们如何改变v,使其在前两个条目中为零,

coefs = np.linalg.solve(null_space[:2], v[:2])
w = -null_space@coefs
x = v+w.

原来x=[0,0,0,2].

相关问题