У меня проблема при использовании numpy .convolve. Я не должен использовать его правильно, даже если я прочитал документацию и постарался изо всех сил ... Он дает мне массивы 0, когда я его использую.
Вот фрагмент моего кода:
from hapi import *
import numpy as np
import matplotlib.pyplot as plt
mol = getColumn(espece, 'molec_id')
iso = getColumn(espece, 'local_iso_id')
iso_global = []
for elt in iso:
if elt == 1:
iso_global.append(26)
if elt == 2:
iso_global.append(36)
if elt == 3:
iso_global.append(28)
if elt == 4:
iso_global.append(27)
if elt == 5:
iso_global.append(38)
if elt == 6:
iso_global.append(37)
NU = getColumn(espece,'nu')
S = getColumn(espece, 'sw')
E = 5.03445e-22*getColumn(espece, 'elower')
G = getColumn(espece, 'gp')
n_air = getColumn(espece, 'n_air')
g_air = getColumn(espece, 'gamma_air')
g_self = getColumn(espece, 'gamma_self')
delta_air = getColumn(espece,'delta_air')
def f_doppler(nu, nu_0):
delta_nu_d =7.16e-7*nu_0*np.sqrt(T/M)
return 2/delta_nu_d*np.sqrt(np.log(2)/np.pi)*np.exp(-4*np.log(2)*(nu-nu_0)**2/delta_nu_d**2)
def delta_nu_l(i):
P_atm = P*1e-5
P_self_atm = P_self*1e-5
res = 2*(T_ref/T)**(n_air[i])*(g_air[i]*(P_atm-P_self_atm)+g_self[i]*P_self_atm)
return res
def f_lorentz(nu, nu_0,i):
P_atm = P*1e-5
res = (delta_nu_l(i)/np.pi)/(2*(nu-nu_0-delta_air[i]*P_atm*delta_air[i])**2 + delta_nu_l(i)**2/2)
return res
def f_voigt(nu, nu_0, i):
return np.convolve(f_doppler(nu, nu_0),f_lorentz(nu, nu_0, i), mode='same')
def S_T(S, i, T_ref, T, E, nu_0):
res = float(S[i])*np.exp(-E[i]*1.986e-23/(k*T))/np.exp(-E[i]*1.986e-23/(k*T_ref))*(1-np.exp(-h*c*nu_0/(k*T)))/(1-np.exp(-h*c*nu_0/(k*T_ref)))
return res
def II_0(nu, nu_0, S, i):
print(f_voigt(nu, nu_0, i))
res = np.exp(-S_T(S, i, T_ref, T, E, nu_0)*N*L*f_voigt(nu, nu_0, i)*100)
return res
R = 8.31
Na = 6e23
L = 0.1 #longueur de l'échantillon en m
P = 10**2 #pression en Pa
T = 296 #température en K
M = 28 #masse molaire en g/mol
N = P*Na/(R*T)*10**(-5)
for i in range(len(NU)):
Y*= II_0(X, float(NU[i]), S, i)
plt.plot(X,Y)
plt.title("Rapport de l'intensité du laser avec et sans présence de "+espece)
plt.xlabel("Nombre d'onde (cm-1)")
plt.ylabel("I/I_0")
plt.show()
Но я не должен получать такие нули. Правильно ли я использую эту функцию?
В конце концов, я получаю массив 1, когда на самом деле должен получить график, полный пиков, спускающийся до нуля.