当一个变量的值已知时用numpy方法求解超定系统

2024-09-30 06:14:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用Python解决一个过度确定的系统,使用numpy.solve函数。我知道其中一个变量的值,并且我知道理论上,如果我能以某种方式插入这个已知的值,我可以为这个系统找到一个唯一的解。在

我的系统是AxC=B的形式。变量分为两组,一组是N变量,一组是T变量(尽管这对于数学来说并不重要)。向量{cd4}是向量的长度。在

我如何告诉numpy.solve(或者Python中的另一个函数,但是请不要推荐最小二乘法,我需要唯一的、精确的解,我知道它存在)来使用其中一个变量的已知值?在

我的系统的一个简单例子是:

|1 0 0 1 0|     |n1|     |B1|
|1 0 0 0 1|     |n2|     |B2|
|0 1 0 1 0|  X  |n3|  =  |B3|
|0 1 0 0 1|     |t1|     |B4|
|0 0 1 1 0|     |t2|     |B5|
|0 0 1 0 1|              |B6|  

当然,B元素的值,以及其中一个变量的值,假设我知道t1=1。这些点没有任何意义,我只是把它们放在那里,这样字符就不会堆在一起了。在


Tags: 函数numpy系统方式数学理论向量形式
3条回答

谢谢大家,删除列的技巧正是我需要的。我的例子的特殊结构,特别是它没有完整的等级,代表了我正在研究的一类问题。知道了其中一个变量,这些问题就可以用一个唯一的解决方案进行分析解决,remove-a-column技巧让我成功地使用numpy.linalg.求解,所以我的问题得到了回答。在

说你需要解决

|1 0 0 1 0|     |n1|     |B1|
|1 0 0 0 1|     |n2|     |B2|
|0 1 0 1 0|  X  |n3|  =  |B3|
|0 1 0 0 1|     |t1|     |B4|
|0 0 1 1 0|     |t2|     |B5|
|0 0 1 0 1|              |B6|  

你知道t1。那你需要解决

^{pr2}$

所以基本上你:

  • 从矩阵中删除第4列

  • 用第4列乘以t1减去右侧

  • 删除t1作为变量

一旦你有了合适的矩阵,只要调用^{}(或类似的东西)。我建议你不要在意自己是否在“做最小二乘法”,或者它是否独一无二。让linalg.solve找到最优解(在L2意义上);如果解是唯一的,那么它在L2意义上也是唯一的。在

正如@Foon指出的,标准的方法是减去一个列。在

然而,另一方面,由于您的问题被过度确定,您需要使用诸如最小二乘法之类的方法。根据定义,如果这是一个过度确定的问题,就没有“唯一、精确的解决方案”。(否则,它甚至会被确定-一个方阵。)

除此之外,以下是你应该怎么做的:

让我们来看看你的等式:

|1 0 0 1 0|     |n1|     |B1|
|1 0 0 0 1|     |n2|     |B2|
|0 1 0 1 0|  X  |n3|  =  |B3|
|0 1 0 0 1|     |t1|     |B4|
|0 0 1 1 0|     |t2|     |B5|
|0 0 1 0 1|              |B6|  

正如你所指出的,这是一个过度的决定。如果我们知道我们的一个“模型”变量(在本例中是n1),它将更加确定。这不是一个问题,但这意味着我们需要使用最小二乘法,而且没有一个完全唯一的解决方案。在

所以,假设我们知道n1应该是什么。在

在这种情况下,我们将通过从观察向量中减去n1乘以解矩阵中的第一列来重新说明问题(这是@Foon建议的):

^{pr2}$

让我们用一个更具体的例子来形容。让我们来解方程y = Ax^2 + Bx + C。首先,让我们生成数据和“真实”模型参数:

import numpy as np

# Randomly generate two of our model variables
a, c = np.random.rand(2)
b = 1
x = np.linspace(0, 2, 6)

y = a * x**2 + b * x + c
noise = np.random.normal(0, 0.1, y.size)
y += noise

首先,我们将在没有知识的情况下解决它。我们可以使用np.polyfit来实现这一点,但是为了进入下一个阶段,我们将使用一个较低级别的方法:

# I'm a geophysist, so I tend to use Gm=d instead of Ax=b
G = np.column_stack([x**2, x, np.ones_like(x)])
d = y

m, _, _, _ = np.linalg.lstsq(G, d)

print "Ideally, this would be 1: ", m[1]

正如你所看到的,我们会得到一些接近,但不完全是1。在本例中(我没有设置种子,因此这会有所不同),返回的模型参数为

[ 0.13392633,  0.97217035,  0.33645734]

而真正的参数是:

[ 0.14592752,  1.        ,  0.31349185]

现在让我们来考虑一下我们对b的了解。我们将用少一列生成一个新的G,并从观察值中减去该列乘以bd/y):

G = np.column_stack([x**2, np.ones_like(x)])
d = y - b * x
m, _, _, _ = np.linalg.lstsq(G, d)

现在m是{},我们已经用b的知识来求解这两个变量。在

相关问题 更多 >

    热门问题