首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有一种方法可以生成非方线性方程组的随机解,最好是在python中?

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

Stack Overflow用户
提问于 2019-01-11 14:34:27
回答 3查看 1.6K关注 0票数 2

首先,我知道这些螺纹是存在的!所以请原谅我,我的问题没有被他们完全回答。

作为一个例子,假设我们处于一个四维向量空间,即R^4。我们正在研究两个线性方程组:

代码语言:javascript
复制
3*x1 - 2* x2 + 7*x3 - 2*x4 = 6
1*x1 + 3* x2 - 2*x3 + 5*x4 = -2 

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

到目前为止,我尝试过的所有python库的主要问题是:它们需要n方程作为n-dimensional空间。

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

我的预期结果将是N“随机”生成的在n-dimensional空间中求解线性方程组的点的列表,其中k<n

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-01-11 22:16:29

谢谢你的回答,这既帮助了我,也为我指明了正确的方向。

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

1.给出了所有方程的一种解。这可以通过使用

代码语言:javascript
复制
 solution_vec = numpy.linalg.lstsq(A,b)

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

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

这些都是向量v,因此skalar产品v*A_i = 0为每一个(!)A_i of A.下面的函数,found 在这个线程中可以用来获取A空空间的代表

代码语言:javascript
复制
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)的“随机”线性组合(用随机系数表示)以及由此产生的矩阵的空空间向量!这是因为标量积是可加的,空间向量的标量积为0。这些线性组合必须始终包含solution_vec,如:

代码语言:javascript
复制
linear_combination = solution_vec + a*null_spacevec_1 + b*nullspacevec_2...

可以随机选择ab

票数 0
EN

Stack Overflow用户

发布于 2019-01-11 14:55:30

一个变量比方程多的线性方程组称为欠定系统

欠定线性系统要么没有解,要么有无穷多个解。 ..。 有一些算法可以决定一个欠定系统是否有解,如果它有解,则用变量k的线性函数表示所有的解(与上面的k相同)。最简单的方法是高斯消去。

正如您所说,库中的许多可用函数(例如np.linalg.solve)都需要一个平方矩阵(即n个未知数的n个方程),您要寻找的是线性系统的实现。

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

将最小二乘解返回到线性矩阵方程. 解方程a x=b,通过计算向量x,使欧几里德2-范数x_b-a x_^2最小化。方程可以是在-,好的,也可以是过定的(即a的线性无关行数可以小于、等于或大于其线性独立列的数目)。如果a是平方的,并且是满秩的,那么x(但是对于舍入误差)是方程的“精确”解。

有关更多信息,请参见:用python求解非方阵A的Ax =b

票数 1
EN

Stack Overflow用户

发布于 2019-01-11 16:07:35

由于您有一个欠确定的方程组(对于您的解的约束太少,或者比变量更少),所以您只需为x3和x4选择一些任意值,并在x1,x2中求解这个系统(这里有2个变量/2个方程)。

您只需检查生成的系统是否不不一致(也就是说,它不允许任何解决方案),并且没有重复的解决方案。

例如,您可以修复x3=0并为x1,x2中的方程选择随机值的x4生成解。

下面是一个生成10个“随机”解决方案的示例

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54148593

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档