Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用numba加速odeint,在尝试传递字典和自定义对象时会出现问题_Python_Python 3.x_Ode_Numba - Fatal编程技术网

Python 使用numba加速odeint,在尝试传递字典和自定义对象时会出现问题

Python 使用numba加速odeint,在尝试传递字典和自定义对象时会出现问题,python,python-3.x,ode,numba,Python,Python 3.x,Ode,Numba,我正在做一个个人项目,用Python编写一个四直升机模拟(和控制),作为一个学习项目。我使用的是scipyintegratorodeint,计算时间太长,让我非常失望。因此,我希望使用numba来加速我的集成。我在每个时间步调用odeint,因为我必须在每个模拟时间步之后创建命令 起初,当我的集成函数(state\u dot)是Quadcopter类的一种方法时,我遇到了一些问题。因此,我将其作为一个单独的函数,但当我使用@jit装饰函数时,我现在在定义正确的类型方面遇到了问题。state\u

我正在做一个个人项目,用Python编写一个四直升机模拟(和控制),作为一个学习项目。我使用的是
scipy
integrator
odeint
,计算时间太长,让我非常失望。因此,我希望使用
numba
来加速我的集成。我在每个时间步调用
odeint
,因为我必须在每个模拟时间步之后创建命令

起初,当我的集成函数(
state\u dot
)是
Quadcopter
类的一种方法时,我遇到了一些问题。因此,我将其作为一个单独的函数,但当我使用
@jit
装饰函数时,我现在在定义正确的类型方面遇到了问题。
state\u dot
函数有一个dictionary(
params
)作为输入参数(我读到numba支持dictionary),但它也是一个自定义类(
wind
),因为我的wind模型是该类的一个方法。如果我现在排除
wind
,使用
numba.typed.Dict
导入字典似乎不起作用

要在函数中导入
wind
对象,我看到使用了numba类型
object
,但是Python在numba中找不到
object

我使用的是numba版本0.45.0和Python 3.7

将numpy导入为np
从scipy.integrate导入odeint
从numba导入jit、void、float、int_
进口麻木
四级直升机:
定义初始化(自):
#四参数
# ---------------------------
mB=1.2#质量(kg)
参数={}
参数[“mB”]=mB
self.params=params
#初始状态
# ---------------------------
self.state=np.zero(3)
def更新(自身、t、Ts、cmd、风):
self.state=odeint(state_点,self.state[t,t+Ts],args=(cmd,self.params,wind))[1]
@jit(void(float_[:],float,float_[:],numba.typed.Dict))#(nopython=True)
def状态(状态、t、cmd、参数、风):
#导入参数
# ---------------------------    
mB=参数[“mB”]
#导入状态向量
# ---------------------------  
x=状态[0]
y=状态[1]
z=状态[2]
#电机动力学和转子力(二阶系统:https://apmonitor.com/pdc/index.php/Main/SecondOrderSystems)
# ---------------------------
打印(cmd)
#风模型
# ---------------------------
[velW,qW1,qW2]=风。随机风(t)
打印(velW)
#状态导数向量
# ---------------------------
sdot=np.零(3)
sdot[0]=x*t+0.1
sdot[1]=y*t+0.1
sdot[2]=z*t+0.1
返回sdot
风力等级:
定义初始化(自):
#通常情况下,平均风速将随机设置在此处
self.velW_med=5.0
self.qW1_med=0.2
self.qW2_med=0.1
def随机风(自身,t):
#通常,风值是一个正弦函数,取决于当前时间
velW=自我。velW\u med
qW1=self.qW1_-med
qW2=self.qW2_-med
回流阀,qW1,qW2
#设定时间
Ti=0
Ts=0.005
Tf=10
#初始化四轮直升机和风机
quad=Quadcopter()
风=风
#模拟
t=Ti
圆形(t,3)
收到的错误是

Traceback (most recent call last):
  File "c:/Users/JOHN-Laptop/Documents/Code Dev/Test/question_quad.py", line 29, in <module>
    @jit(void(float_[:], float_, float_[:], numba.typed.Dict )) #(nopython = True)
  File "C:\Users\JOHN-Laptop\AppData\Local\Programs\Python\Python37\lib\site-packages\numba\decorators.py", line 186, in wrapper
    disp.compile(sig)
  File "C:\Users\JOHN-Laptop\AppData\Local\Programs\Python\Python37\lib\site-packages\numba\compiler_lock.py", line 32, in _acquire_compile_lock
    return func(*args, **kwargs)
  File "C:\Users\JOHN-Laptop\AppData\Local\Programs\Python\Python37\lib\site-packages\numba\dispatcher.py", line 676, in compile
    args, return_type = sigutils.normalize_signature(sig)
  File "C:\Users\JOHN-Laptop\AppData\Local\Programs\Python\Python37\lib\site-packages\numba\sigutils.py", line 48, in normalize_signature
    check_type(ty)
  File "C:\Users\JOHN-Laptop\AppData\Local\Programs\Python\Python37\lib\site-packages\numba\sigutils.py", line 43, in check_type
    "instance, got %r" % (ty,))
TypeError: invalid type in signature: expected a type instance, got <class 'numba.typed.typeddict.Dict'>
回溯(最近一次呼叫最后一次):
文件“c:/Users/JOHN Laptop/Documents/Code Dev/Test/question_quad.py”,第29行,在
@jit(void(float_[:],float,float_[:],numba.typed.Dict))#(nopython=True)
文件“C:\Users\JOHN Laptop\AppData\Local\Programs\Python\Python37\lib\site packages\numba\decorators.py”,第186行,在包装器中
disp.compile(sig)
文件“C:\Users\JOHN Laptop\AppData\Local\Programs\Python\37\lib\site packages\numba\compiler\u lock.py”,第32行,在\u acquire\u compile\u lock中
返回函数(*args,**kwargs)
文件“C:\Users\JOHN Laptop\AppData\Local\Programs\Python\Python37\lib\site packages\numba\dispatcher.py”,第676行,编译
args,return\u type=sigutils.normalize\u签名(sig)
文件“C:\Users\JOHN Laptop\AppData\Local\Programs\Python\Python37\lib\site packages\numba\sigutils.py”,第48行,在normalize\u签名中
检查类型(ty)
文件“C:\Users\JOHN Laptop\AppData\Local\Programs\Python\Python37\lib\site packages\numba\sigutils.py”,第43行,检查类型
“实例,获取了%r”%(ty,)
TypeError:签名中的类型无效:应为类型实例,已获取
可在此处查看完整代码:

如果我遗漏了任何信息,请随时询问


编辑:将完整代码的链接更改为链接到另一个分支。

我注意到的第一件事是——至少在这里显示的代码中——您的jit签名有四种类型,但您正在装饰的函数有五个参数:

@jit(void(float_[:],float,float_[:],numba.typed.Dict))
def状态(状态、t、cmd、参数、风):
很明显,你需要解决这个问题。最简单的方法是删除签名,然后让numba找出答案:

@jit
def状态(状态、t、cmd、参数、风):
当然,即使您这样做,numba仍然抱怨它不知道如何键入所有内容,并指向一行说
mB=params[“mB”]
。它仍然执行“循环提升”,这意味着它能够编译一些东西,但不会尽可能快

因此,第二件要注意的事情是,虽然numba说它支持
dict
s,但随后提出了许多警告。基本上,使用dict仍然不是一个好主意。我也不认为你有什么好的理由使用dict。为什么不让
mB
成为你班的一员,就像
self.mB=mB
?我知道你的全套
Quadcopter
课程会有更复杂的内容,但是你可以有很多成员

现在,需要注意的第三件事是,numba有g