我必须计算下面函数的系数(c1-c9),而温度(to,tc)和解(y)都是通过不同点的测量数据给出的。我试图用numpy.linalg.solv解决它,但它引发了一个奇异矩阵错误,我不确定如何避免。
c[0] + c[[0]]*to[0] + c[[1]]*tc[0] + c[3]*to[0]^2 + c[4]*to[0]*tc[0] + c[5]*tc[0]^2 + c[6]*to[0]^3 + c[7]*tc[0]*to[0]^2 + c[8]*to[0]*tc[0]^2 + c[9]*tc[0]^3 = y[0]
有人可以给我一个线索或解决方案,说明如何使用Python解决这个问题?这是我到目前为止的代码
import numpy as np
to1 = 10
tc1 = 30
y1 = 148450
to2 = 5
tc2 = 30
y2 = 124955
to3 = 0
tc3 = 30
y3 = 104596
to4 = -5
tc4 = 30
y4 = 86964
to5 = -10
tc5 = 30
y5 = 71704
a = np.array([[1,to1,tc1, to1**2, to1*tc1], [1,to2,tc2,to2**2, to2*tc2],[1,to3,tc3,to3**2, to3*tc3],[1,to4,tc4,to4**2, to4*tc4],[1,to5,tc5,to5**2, to5*tc5]])
b = np.array([y1,y2,y3,y4,y5])
x = np.linalg.solve(a, b)
print x
你的问题
在您的所有数据点中,您都有tc=30
!
当您尝试使用函数拟合数据时to, tc
算法会告诉您(使用它唯一知道的语言,线性代数语言),当数据集中没有tc
变化时,您无法估计y
的变异性作为tc
的函数。
如何纠正您的问题
拥有更多的数据点,具有两个自变量的不同值,并尽可能使用最小二乘法,使用您可以收集的所有数据点(我的意思是,估计 10 个参数?使用数十或数百个数据点)。 答案的这一部分与要使用的编程语言无关:拥有更多数据。
错误消息告诉您矩阵是奇异的,因此它缺乏秩,因此行列式为零。您可以通过以下方式进行检查:
print np.linalg.matrix_rank(a)
它给出了 3 而不是 5。在这个问题/答案中可以找到关于这意味着什么的非常好的解释:
什么是等级不足以及如何处理它
但是,您可以找到一个"良好拟合"的最小二乘解 - 尽管如前所述,由于某些行彼此线性依赖,因此不是给定矩阵的唯一解。