我必须计算下面函数的系数(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
答案 0 :(得分:2)
在您的所有数据点中,您有tc=30
!
当您尝试使用to, tc
函数调整数据时,算法会告诉您(使用它所知道的唯一语言,即线性代数的语言),您无法估计{{1}的可变性}当数据集中没有y
的变体时,tc
的函数。
拥有更多的数据点,两个独立变量的值不同,并且尽可能使用最小二乘法使用您可以收集的所有数据点(我的意思是,估计10个参数?使用数十个或数百个数据点)。答案的这一部分与您要使用的编程语言无关:拥有更多数据。
答案 1 :(得分:1)
错误消息告诉您矩阵是单数,因此它是秩不足的,因此行列式为零。您可以通过以下方式查看:
print np.linalg.matrix_rank(a)
给出3而不是5.这个问题/答案可以找到一个非常好的解释:
What is rank-deficiency and how to deal with it
然而,您可以找到一个最适合的解决方案,这个解决方案非常适合" - 尽管如上所述并不是给定矩阵的唯一解,因为有些行是线性相互依赖的。