有没有一种方法可以生成非平方线性方程的随机解,最好在python中生成?

时间:2019-01-11 14:34:28

标签: python linear-algebra linear-equation

首先,我知道these threads存在!因此,请允许我,他们的问题还没有完全回答我。

作为一个例子,假设我们在一个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个“随机”生成的点的列表,这些点可以在k维空间(其中n)中解决k<n个线性方程。 >

3 个答案:

答案 0 :(得分:1)

一个线性方程组,其变量多于方程组,称为underdetermined system

  

一个不确定的线性系统要么没有解,要么有很多解。

     

...

     

存在一些算法来确定欠定系统是否具有解,如果有解,则将所有解表示为变量k的线性函数(与上述k相同)。最简单的一种是高斯消去。

您说过,库中可用的许多函数(例如np.linalg.solve)都需要平方矩阵(即n个未知数的n个方程),您正在寻找的是Gaussian elimination for non square linear systems的实现。

这不是“随机”,但是np.linalg.lstsq(最小二乘法)将解决非平方矩阵:

  

将最小二乘解返回线性矩阵方程。

     

通过计算最小化欧几里德2-范数||的向量x来解决方程a x = b的问题。 b-a x || ^ 2。该方程式可以是欠定的,良好确定的或过度确定的(即a的线性独立行的数量可以小于,等于或大于其线性独立列的数量)。如果a是正方形且具有全秩,则x(但针对四舍五入误差)是方程的“精确”解。

有关更多信息,请参见: solving Ax =b for a non-square matrix A using python

答案 1 :(得分:1)

由于您有一个未定方程组(对您的解决方案约束太少,或者方程组少于变量),您可以为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

答案 2 :(得分:0)

感谢您的回答,这对我有帮助,也为我指明了正确的方向。

对于任意k<n,我现在都有一个简单的逐步解决方案。

1。。找到所有给定方程式的一个解决方案。这可以通过使用

来完成
 solution_vec = numpy.linalg.lstsq(A,b)

这提供了一种ukemis answer中所见的解决方案。在上面的示例中,矩阵A等于左侧方程的系数,b代表右侧的向量。

2。。确定矩阵A的空空间。

这些都是向量v,因此v*A_i = 0的每一行(!)行的斯卡拉积A_i。在in this thread中找到的以下函数可用于获取A的空空间的代表:

A

3。。生成与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) 一样多的(N)“随机”线性组合(意味着具有随机系数)以及矩阵空空间的所得矢量想!之所以可行,是因为标量积是可加的,并且零空间向量与方程式的向量的标量积为0。这些线性组合必须始终包含solution_vec,例如:

solution_vec

其中linear_combination = solution_vec + a*null_spacevec_1 + b*nullspacevec_2... a可以随机选择。