使numpy polyfit适用于位数较大的数字

2024-10-04 05:22:00 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: 数据numpya2objecta1数字arraya3
2条回答

对于三个点,这是一个线性方程组问题。您可以使用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)

当双精度不够时,通常需要查找其他库,例如mpmath或{}。并且sympy有一个内置的^{} 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.011.0,以此类推;这将强制所有的东西都浮起,你将回到你和NumPy在一起时的状态。符号计算需要整数、有理数和符号表达式。在

结果以牛顿多项式形式与(x-1)(x-1)*(x-2)等一起返回;可以使用expand将其变成更熟悉的多项式形式:

^{pr2}$

返回22070000000000000000000000001*x**2/2 - 66061111111111111111111111115*x/2 + 21998888888888888888888888890。这些系数是精确的,可以用[p.subs(x, v) for v in xp]检查:返回原始的yp值。在

相关问题 更多 >