Использование numpy .convolve - PullRequest
0 голосов
/ 28 апреля 2020

У меня проблема при использовании 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, когда на самом деле должен получить график, полный пиков, спускающийся до нуля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...