首先,我知道这些线程存在!所以请耐心等待,我的问题没有得到他们的完全回答。
例如,假设我们处于 4 维向量空间中,即R^4
.我们正在研究两个线性方程:
3*x1 - 2* x2 + 7*x3 - 2*x4 = 6
1*x1 + 3* x2 - 2*x3 + 5*x4 = -2
实际的问题是:有没有办法利用 NumPy 等的线性求解器生成N
点来解决这两个方程?
到目前为止,我尝试过的所有 python 库的主要问题是:它们需要n
方程来表示n
维空间
对于一个方程来说,求解问题非常容易,因为您可以简单地使用随机生成的n-1
vlaues 并调整最后一个方程,以便向量求解方程。
我的预期结果将是N
"随机"生成的点的列表,这些点在n
维空间中求解k
线性方程,其中k<n
.
变量多于方程的线性方程组称为欠定系统。
一个欠定的线性系统要么没有解,要么有无限多个解。
。
有一些算法可以决定一个欠定的系统是否有解,如果有的话,将所有解表示为变量的k的线性函数(与上面的k相同)。最简单的是高斯消除。
正如你所说,库中可用的许多函数(例如 np.linalg.solve)需要一个方阵(即 n 个未知数的 n 个方程),你正在寻找的是非平方线性系统的高斯消除实现。
这不是"随机的",但np.linalg.lstsq(最小二乘)将求解非二乘矩阵:
将最小二乘解返回到线性矩阵方程。
通过计算最小化欧几里得 2 范数的向量 x 求解方程 a x = b || b - a x ||^阿拉伯数字。方程可以确定不足、良好或过度确定(即,a 的线性独立行数可以小于、等于或大于其线性独立列数)。如果 a 是平方且是全秩,则 x(但对于舍入误差)是方程的"精确"解。
有关详细信息,请参阅: 使用 python 求解非方阵 A 的 Ax =b
由于你有一个不确定的方程组(你的解的约束太少,或者方程比变量少),你可以为 x3 和 x4 选择一些任意值,并在 x1、x2 中求解系统(这有 2 个变量/2 个方程)。
您只需要检查生成的系统是否不一致(即它不允许任何解决方案)并且没有重复的解决方案。
例如,您可以修复 x3=0 并选择 x4 的随机值,为您的方程生成 x1、x2 中的解
下面是生成 10 个"随机"解决方案的示例
n = 10
x3 = 0
X = []
for x4 in np.random.choice(1000, n):
b = np.array([[6-7*x3+2*x4],[-2+2*x3-5*x4]])
x = np.linalg.solve(a, b)
X.append(np.append(x,[x3,x4]))
# check solution nr. 3
[x1, x2, x3, x4] = X[3]
3*x1 - 2* x2 + 7*x3 - 2*x4
# output: 6.0
1*x1 + 3* x2 - 2*x3 + 5*x4
# output: -2.0
感谢您的回答,这既帮助了我,又为我指明了正确的方向。
我现在有一个简单的分步解决方案来解决我的问题,用于任意k<n
.
1.为所有给定的方程找到一个解。这可以通过使用
solution_vec = numpy.linalg.lstsq(A,b)
这给出了一个解决方案,如 UKEMIS 答案所示。在我上面的例子中,矩阵A
等于左侧方程的系数,b
表示右侧的向量。
2.确定矩阵A
的零空间。
这些都是向量v
使得 skalar 乘积v*A_i = 0
每个 (!) 行A_i
A
。在此线程中找到的以下函数可用于获取A
的空空间的表示:
def nullSpaceOfMatrix(A, eps=1e-15):
u, s, vh = scipy.linalg.svd(A)
null_mask = (s <= eps)
null_space = scipy.compress(null_mask, vh, axis=0)
return scipy.transpose(null_space)
3.生成任意数量的(N
)solution_vec
的"随机"线性组合(意味着随机系数)和矩阵零空间的结果向量!这是有效的,因为标量积是加法的,而零空间向量的标量积为 0。这些线性组合总是必须包含solution_vec
,如:
linear_combination = solution_vec + a*null_spacevec_1 + b*nullspacevec_2...
可以随机选择a
和b
的位置。