Ошибка Numba при компиляции функции в PythonPython

Программы на Python
Ответить
Anonymous
 Ошибка Numba при компиляции функции в Python

Сообщение Anonymous »

Я пытаюсь запрограммировать симуляцию Шрёдингера на Python, но у меня возникли проблемы с @njit из библиотеки Numba для оптимизации функций.
Это код. Я просто пытаюсь решить дискретное дифференциальное уравнение.

Код: Выделить всё

import numpy as np
from scipy.integrate import solve_ivp as ivp
from numba import njit

m = 1/2             #Un. Geom.
h_bar = 1           #Unidades geometrizadas
infty = 5000        #Esto sirve como infinito

# =============================================================================
# # Parámetros
# =============================================================================

z0 = 0
zf = 1

omega = 1
t0 = 0
tf = 1
a = 1
b = 3

m = 50

# =============================================================================
# # Funciones
# =============================================================================

def f(z):
return 2**0.5*np.sin(2*np.pi*z)

def Ll(a,b,t):
return a + b*t

def dLl(b):
return b

def Ls(a,b,t):
return a + b*np.sin(omega*t)

def dLs(b,t):
return omega*b*np.cos(omega*t)

@njit
def res(t,phi):
global h
dphi = np.zeros_like(z, dtype = complex)       #recordar que para dphi0 y dphi-1 son ceros

for i in range(0,m):
if i != 0 and i != m-1:
#print(i,len(dphi))
#print('phi_i= ', phi[i], 'phi_{i-1}= ', phi[i-1], 'phi_{i+1}= ',phi[i+1],'||',dphi[i])
dphi[i] = 1/h**2*1j/Ll(a,b,t)**2*(phi[i+1]-2*phi[i]+phi[i-1]) + 1/2/h*i*dLl(b)/Ll(a,b,t)*(phi[i+1] - phi[i-1])
# dphi[i] = 1/h**2*1j/L**2*(phi[i+1]-2*phi[i]+phi[i-1]) + 1/2/h*i*dLs(b,t)/Ls(a,b,t)(phi[i+1] - phi[i-1]) #esta es para el sin

else:
if i == 0:
print(i,phi[i])

dphi[i] = 1/h**2*1j/Ll(a,b,t)**2*(phi[i+1]-2*phi[i]+ 0) + 1/2/h*i*dLl(b)/Ll(a,b,t)*(phi[i+1] - 0)

if  i == m-1:
print(i,phi[i])

dphi[i] = 1/h**2*1j/Ll(a,b,t)**2*( 0 -2*phi[i]+phi[i-1]) + 1/2/h*i*dLl(b)/Ll(a,b,t)*( 0 - phi[i-1])

print(dphi)
return dphi

# =============================================================================
# # Resolución numérica
#  Esto se hace con ivp
# =============================================================================

h = 1/m
z = np.linspace(z0+h,zf-h,m)
z = np.transpose(z)
print('tamaño z  =  ', len(z))

y0 = f(z)
t = np.linspace(t0,tf,m)

sol = ivp(res,(t0,tf), y0, t_eval=t)
print(sol.y)

Моя функция работает без @njit, но когда я ее раскомментирую, результат: «Невозможно определить тип Numba ». Я искал ответы, и единственное, о чем я могу думать, это удалить Numba, но время расчета велико (31 с).
После реализации @njit для всех вызываемых функций я получаю следующее сообщение:

Код: Выделить всё

TypingError: No implementation of function Function() found for signature:

zeros_like(readonly array(float64, 1d, C), dtype=Literal[str](complex128))

There are 2 candidate implementations:
- Of which 2 did not match due to:
Overload of function 'zeros_like': File: numba\core\typing\npydecl.py: Line 525.
With argument(s): '(readonly array(float64, 1d, C), dtype=unicode_type)':
No match.

During: resolving callee type: Function()
During: typing of call at C:\...\untitled0.py (66)
Я искал документацию Numba, и там сказано, что функция np.zeros_like включена в пакет только с первыми двумя аргументами (те, которые я использую), но я продолжаю получать это сообщение. Я пытался ввести z в функцию, но это тоже не работает.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»