Ошибка: Ошибка типа: невозможно умножить последовательность на не-int типа 'numpy .float64' (не знаю что делать) - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь построить уравнение, которое содержит и определенный интеграл. Это сечение фотоионизации, связанное с межподзонными переходами в двумерном квантовом кольце. Я сделал angular часть аналитически, и я пытаюсь численно вычислить радиальную часть.

Вот моя попытка реализовать это в Python коде:

from scipy.integrate import quad
import numpy as np
from scipy.special import gamma
from scipy.constants import alpha
import matplotlib.pyplot as plt

#Constants
epsilon = 13.1 #dielectric constant of the material
gamma_C = 0.5 # donor impurity linewidth 
nr = 3.2 #refractive index of semiconductor
flux = 0  # Phi in eqn 8 magnetic flux
R = 5  #radius of the qunatum ring in nm
r = np.linspace(0, 6 * R)
rho = r / R
m_0 = 0.0067*0.511 # electron effective mass
h = 4.13e-15 # Planck constant in eV
hbar =  6.58e-16 # reduced Planck constant in eV
#Photon energy
hnu = np.linspace(0, 100) #in eV


#Function that calculates the integrand
def func(rho):
    betai = np.sqrt( gama**4/4)
    betaf = np.sqrt(1+gama**4/2)
    return ((gama * rho)**(betai + betaf) *
            np.exp(-1/2*(gama * rho)**2) 
         * (gama * rho)**2/2   ) 

def cross_section(hnu, gama):
    #function that calculates the photoionisation cross section
    betai = np.sqrt( gama**4/4)
    betaf = np.sqrt(1+gama**4/2)
    Ei = gama**2*(1+betai)-gama**4/2
    Ef = gama**2*(3+betaf)-gama**4/2
    return (nr/epsilon * 4*np.pi/3 * alpha * hnu *
            (abs(R * np.sqrt(1/2**betai*gamma(betai + 1))*
            np.sqrt(1/2**betaf*gamma(betaf + 1)) *
            quad(func, 0, np.infty))**2 * 
             hbar * gamma_C/(Ef - Ei - hnu)**2 + ( hbar * gamma_C)**2))

#Plot

plt.figure();plt.clf()

for gama in [1.0, 1.5, 2.0]:
    plt.plot(hnu, cross_section(hnu, gama))

Но я продолжаю получать эту ошибку

TypeError: can't multiply sequence by non-int of type 'numpy.float64'

Любой знает причину и как этого избежать?

1 Ответ

2 голосов
/ 09 апреля 2020

Посмотрите еще раз на строку документации для scipy.integrate.quad. В частности, посмотрите на раздел «Возвраты». Вы увидите, что он возвращает несколько значений. Точнее, он возвращает кортеж значений. Фактическое число значений зависит от параметра full_output, но оно всегда включает как минимум два значения, численно вычисленный интеграл и оценку ошибки.

В этом коде

    return (nr/epsilon * 4*np.pi/3 * alpha * hnu *
            (abs(R * np.sqrt(1/2**betai*gamma(betai + 1))*
            np.sqrt(1/2**betaf*gamma(betaf + 1)) *
            quad(func, 0, np.infty))**2 * 
             hbar * gamma_C/(Ef - Ei - hnu)**2 + ( hbar * gamma_C)**2))

вы используйте возвращаемое значение quad, но это кортеж, поэтому он не будет работать правильно в этом выражении. Чтобы это исправить, просто вытащите первое значение кортежа, возвращенное quad. То есть замените quad(func, 0, np.infty) на quad(func, 0, np.infty)[0]:

    return (nr/epsilon * 4*np.pi/3 * alpha * hnu *
            (abs(R * np.sqrt(1/2**betai*gamma(betai + 1))*
            np.sqrt(1/2**betaf*gamma(betaf + 1)) *
            quad(func, 0, np.infty)[0])**2 * 
             hbar * gamma_C/(Ef - Ei - hnu)**2 + ( hbar * gamma_C)**2))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...