首先,我知道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
个线性方程。 >
答案 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
可以随机选择。