有没有办法生成非平方线性方程的随机解,最好是 python?

Is there a way to generate random solutions to non-square linear equations, preferably in python?

首先,我知道these threads存在!所以请耐心等待,他们没有完全回答我的问题。

举个例子,假设我们在一个 4 维向量 space 中,即 R^4。我们正在看两个线性方程:

3*x1 - 2* x2 + 7*x3 - 2*x4 = 6
1*x1 + 3* x2 - 2*x3 + 5*x4 = -2 

实际问题是:有没有一种方法可以生成 N 个点来求解 both 这些方程,利用 NumPy 等的线性求解器?

到目前为止,我尝试过的所有 python 库的主要问题是:它们需要 n 方程用于 n 维 space

求解一个方程的问题非常容易,因为您可以简单地使用 n-1 随机生成的值并调整最后一个值,使向量求解方程。

我的预期结果是 N "randomly" 生成点的列表,这些点求解 n 维 space 中的 k 线性方程,其中k<n.

变量多于方程的线性方程组称为 underdetermined system

An underdetermined linear system has either no solution or infinitely many solutions.

...

There are algorithms to decide whether an underdetermined system has solutions, and if it has any, to express all solutions as linear functions of k of the variables (same k as above). The simplest one is Gaussian elimination.

正如您所说,库中提供的许多函数(例如 np.linalg.solve)需要一个方阵(即 n 个方程式代表 n 个未知数),您正在寻找的是 Gaussian elimination for non square linear systems 的实现。

这不是 'random',但 np.linalg.lstsq(最小二乘)将求解非方矩阵:

Return the least-squares solution to a linear matrix equation.

Solves the equation a x = b by computing a vector x that minimizes the Euclidean 2-norm || b - a x ||^2. The equation may be under-, well-, or over- determined (i.e., the number of linearly independent rows of a can be less than, equal to, or greater than its number of linearly independent columns). If a is square and of full rank, then x (but for round-off error) is the “exact” solution of the equation.

有关详细信息,请参阅: solving Ax =b for a non-square matrix A using python

因为你有一个欠定方程组(你的解的约束太少,或者方程比变量少)你可以只为 x3 和 x4 选择一些任意值并求解x1, x2 中的系统(这有 2 个 variables/2 方程)。

您只需要检查生成的系统是否不一致(即它不承认任何解决方案)并且没有重复的解决方案。

例如,您可以固定 x3=0 并选择 x4 的随机值生成 x1、x2 方程的解

这是生成 10 "random" 个解决方案的示例

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)

这给出了如 中所示的解决方案。在我上面的示例中,矩阵 A 等于左侧方程的系数,b 代表右侧的向量。

2. 确定矩阵 A 的空值 space。

这些都是向量 v,使得 A 的每个(!)行 A_i 的标量积 v*A_i = 0。下面这个函数,foundin this thread可以用来获取代表A的nullspace:

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) "random" 个 solution_vec 的线性组合(意思是随机系数)和结果向量矩阵的nullspace随心所欲!这是可行的,因为标量积是可加的,并且 nullspace 向量与方程的向量的标量积为 0。这些线性组合总是必须包含 solution_vec,如:

linear_combination = solution_vec + a*null_spacevec_1 + b*nullspacevec_2...

其中 ab 可以随机选择。