我目前正在尝试在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 仅将矩阵和右侧作为输入.
我尝试重写线性系统,但在某些情况下,右侧也有未定义的变量,未知向量中有更多设定值,所以我正在寻找一个解决任何线性系统的过程与矩阵和两个未知向量。
你的问题有点令人困惑,因为你的矩阵的等级是2而不是3(这意味着它只给你2个线性独立的方程)。现在,如果我将你的矩阵称为
A
,而右手边 b
,你所能期望的最好的解决方案就是以下形式的解决方案
A@[0,0,x,y]=b.
请记住,这并不总是有效。事实上,由于 A 的最后两列是线性无关的,当且仅当
b
位于 A
的图像中时,该解才存在。所以 b
by 必须来自 A
与向量的乘法。
现在,如果我们记住线性代数中的一个简单事实,我们就可以为您找到您希望的解决方案。我们可以将欠定线性方程的任何解
x
写为 x=v+n
,其中 v
是任意解,n
来自矩阵的零空间。所以我们只需找到一个尚未存在于形式中的解,然后通过移动它抛出A
的零空间来将其带入形式。
让我们举一个明确的例子:假设我们有
b=[12,4,-12,8](=A@[1,2,3,4]).
(当然我假设我们不知道这一点
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.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].