使numpy polyfit适用于具有大量数字的数字

时间:2018-04-15 11:26:57

标签: python numpy interpolation polynomials

我想将numpy.polyfitPolynomial.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来解决这个问题吗?

2 个答案:

答案 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)

当双精度不够时,通常需要寻找其他库,例如mpmathsympysympy有一个内置的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值。