我想将numpy.polyfit
或Polynomial.polyfit
应用于3个数据点[a1,a2,a3],每个数据点大约有300个数字。
如果我使用:
x = numpy.array([1.0, 2.0, 3.0])
y = numpy.array([a1, a2, a3])
c = numpy.polyfit(x,y,2)
d = Polynomial.polyfit(x,y,2)
我得到的是不精确的系数
并且polyfit不接受数据类型dtype=object
来处理具有大量数字的数字。
另外,我可以用python调用MAXIMA来解决这个问题吗?
答案 0 :(得分:0)
对于三点,这是一个线性方程问题。你可以使用SymPy:
from sympy import S, Matrix
x1, x2, x3 = S(1), S(2), S(3)
y1, y2, y3 = S(2), S(0), S(1)
X = Matrix([
[x1**2, x1, 1],
[x2**2, x2, 1],
[x3**2, x3, 1]
])
y = Matrix([
[y1],
[y2],
[y3]
])
X.inv() * y
超过三点,这是一个线性最小二乘问题:
https://en.wikipedia.org/wiki/Linear_least_squares_(mathematics)
答案 1 :(得分:0)
当双精度不够时,通常需要寻找其他库,例如mpmath
或sympy
。 sympy
有一个内置的interpolating_poly
function:
from sympy import Symbol, interpolating_poly
x = Symbol('x')
xp = [1, 2, 3]
yp = [3333333333333333333333333, 77777777777777777777777777, 22222222222222222222222222222]
p = interpolating_poly(3, x, xp, yp)
第一个参数是点数;第二个是在多项式中使用的符号。如果你这样做,那么不为1.0
等写1
;这将强制所有的浮动,你会回到你的NumPy。符号计算需要整数,有理数和符号表达式。
结果以牛顿多项式形式返回(x-1)
,(x-1)*(x-2)
等;可以使用expand
使其成为更熟悉的多项式形式:
p = p.expand()
返回22070000000000000000000000001*x**2/2 - 66061111111111111111111111115*x/2 + 21998888888888888888888888890
。这些系数是精确的,因为可以使用[p.subs(x, v) for v in xp]
进行检查:返回原始yp
值。