我试图用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
。这些点没有任何意义,我只是把它们放在那里,这样字符就不会堆在一起了。在
谢谢大家,删除列的技巧正是我需要的。我的例子的特殊结构,特别是它没有完整的等级,代表了我正在研究的一类问题。知道了其中一个变量,这些问题就可以用一个唯一的解决方案进行分析解决,remove-a-column技巧让我成功地使用numpy.linalg.求解,所以我的问题得到了回答。在
说你需要解决
你知道t1。那你需要解决
^{pr2}$所以基本上你:
从矩阵中删除第4列
用第4列乘以t1减去右侧
删除t1作为变量
一旦你有了合适的矩阵,只要调用^{} (或类似的东西)。我建议你不要在意自己是否在“做最小二乘法”,或者它是否独一无二。让
linalg.solve
找到最优解(在L2意义上);如果解是唯一的,那么它在L2意义上也是唯一的。在正如@Foon指出的,标准的方法是减去一个列。在
然而,另一方面,由于您的问题被过度确定,您需要使用诸如最小二乘法之类的方法。根据定义,如果这是一个过度确定的问题,就没有“唯一、精确的解决方案”。(否则,它甚至会被确定-一个方阵。)
除此之外,以下是你应该怎么做的:
让我们来看看你的等式:
正如你所指出的,这是一个过度的决定。如果我们知道我们的一个“模型”变量(在本例中是
n1
),它将更加确定。这不是一个问题,但这意味着我们需要使用最小二乘法,而且没有一个完全唯一的解决方案。在所以,假设我们知道
n1
应该是什么。在在这种情况下,我们将通过从观察向量中减去
^{pr2}$n1
乘以解矩阵中的第一列来重新说明问题(这是@Foon建议的):让我们用一个更具体的例子来形容。让我们来解方程
y = Ax^2 + Bx + C
。首先,让我们生成数据和“真实”模型参数:首先,我们将在没有知识的情况下解决它。我们可以使用
np.polyfit
来实现这一点,但是为了进入下一个阶段,我们将使用一个较低级别的方法:正如你所看到的,我们会得到一些接近,但不完全是1。在本例中(我没有设置种子,因此这会有所不同),返回的模型参数为
而真正的参数是:
现在让我们来考虑一下我们对
b
的了解。我们将用少一列生成一个新的G
,并从观察值中减去该列乘以b
(d
/y
):现在},我们已经用
m
是{b
的知识来求解这两个变量。在相关问题 更多 >
编程相关推荐