Python 使用 Sympy 的 Numba 多项式根下误差
Python Numba Polynomial Root Lower Error with Sympy
我创建了一个函数,它根据给定的系数范围构造具有此类系数的多项式并输出其所有根的列表。然而,Numba 并不喜欢它。是这样的:
import math
import numpy as np
import itertools
from numba import jit
from sympy.solvers import solve
from sympy import Symbol
from sympy import Poly
@jit
def polyn(ranges=[[-20,20],[-20,20],[-20,20],[-20,20]],step=4):
l = []
x = Symbol('x')
rangl = [np.linspace(i[0],i[1],math.floor((i[1]-i[0])/step)) for i in ranges]
coeffl = iter(itertools.product(*rangl))
leng = 1
for i in rangl:
leng *= len(i)
for i in range(0, leng):
a = solve(Poly(list(next(coeffl)),x),x)
for j in a:
l.append(j)
return np.array(l)
当我尝试 运行 时,它输出了一个神秘的信息:
AssertionError:对象失败(对象模式前端)
我不明白...有人可以帮忙吗?
您的代码中有许多 Numba 目前无法处理的事情。第一个是构建 rangl
:
的列表理解
[np.linspace(i[0],i[1],math.floor((i[1]-i[0])/step)) for i in ranges]
您应该将其替换为 NumPy 解决方案,例如:
rangl = np.empty((len(ranges), step))
for i in ranges:
rangl[i] = np.linspace(i[0],i[1],math.floor((i[1]-i[0])/step))
Numba 无法应对的第二件事是 itertools.product。您也可以将其替换为 NumPy 和 for 循环。
一般来说,尝试通过注释掉代码的下半部分来减少代码,直到让 Numba 接受它,然后从上到下工作,看看哪些部分无法编译。有条不紊,循序渐进,并尝试坚持简单的构造,例如简单的 for
循环和数组。
我创建了一个函数,它根据给定的系数范围构造具有此类系数的多项式并输出其所有根的列表。然而,Numba 并不喜欢它。是这样的:
import math
import numpy as np
import itertools
from numba import jit
from sympy.solvers import solve
from sympy import Symbol
from sympy import Poly
@jit
def polyn(ranges=[[-20,20],[-20,20],[-20,20],[-20,20]],step=4):
l = []
x = Symbol('x')
rangl = [np.linspace(i[0],i[1],math.floor((i[1]-i[0])/step)) for i in ranges]
coeffl = iter(itertools.product(*rangl))
leng = 1
for i in rangl:
leng *= len(i)
for i in range(0, leng):
a = solve(Poly(list(next(coeffl)),x),x)
for j in a:
l.append(j)
return np.array(l)
当我尝试 运行 时,它输出了一个神秘的信息: AssertionError:对象失败(对象模式前端) 我不明白...有人可以帮忙吗?
您的代码中有许多 Numba 目前无法处理的事情。第一个是构建 rangl
:
[np.linspace(i[0],i[1],math.floor((i[1]-i[0])/step)) for i in ranges]
您应该将其替换为 NumPy 解决方案,例如:
rangl = np.empty((len(ranges), step))
for i in ranges:
rangl[i] = np.linspace(i[0],i[1],math.floor((i[1]-i[0])/step))
Numba 无法应对的第二件事是 itertools.product。您也可以将其替换为 NumPy 和 for 循环。
一般来说,尝试通过注释掉代码的下半部分来减少代码,直到让 Numba 接受它,然后从上到下工作,看看哪些部分无法编译。有条不紊,循序渐进,并尝试坚持简单的构造,例如简单的 for
循环和数组。