Я пытаюсь запрограммировать симуляцию Шрёдингера на 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 в функцию, но это тоже не работает.
Я пытаюсь запрограммировать симуляцию Шрёдингера на Python, но у меня возникли проблемы с @njit из библиотеки Numba для оптимизации функций. Это код. Я просто пытаюсь решить дискретное дифференциальное уравнение. [code]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
@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
# ============================================================================= # # 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)
[/code] Моя функция работает без @njit, но когда я ее раскомментирую, результат: «Невозможно определить тип Numba ». Я искал ответы, и единственное, о чем я могу думать, это удалить Numba, но время расчета велико (31 с). После реализации @njit для всех вызываемых функций я получаю следующее сообщение: [code]TypingError: No implementation of function Function() found for signature:
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) [/code] Я искал документацию Numba, и там сказано, что функция np.zeros_like включена в пакет только с первыми двумя аргументами (те, которые я использую), но я продолжаю получать это сообщение. Я пытался ввести z в функцию, но это тоже не работает.