Sympy的Python Numba多项式根较低错误

问题描述 投票:1回答:1

我创建了一个函数,给定系数范围,构造具有这些系数的多项式,并输出所有根的列表。然而,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:对象失败(对象模式前端),我不明白......任何人都可以帮忙吗?

python sympy numba
1个回答
1
投票

你的代码中有很多东西是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循环和数组。

© www.soinside.com 2019 - 2024. All rights reserved.