Если не важно написать свое правило Симпона , тогда вы можете использовать импорт from scipy.integrate import simps
.Следующий код является попыткой решить вашу проблему:
import math
import cmath
from scipy.integrate import simps
import numpy as np
# Variables
wavelength = 1*10**(-6) # Wavelength
z = 0.02 # Screen distance
k = (2*math.pi) / wavelength # Wave number
n = 100
aperture_width = 2*10**(-5)
# Define the integrand
def f(a, b):
integrand = cmath.exp(1j*k/(2*z)*(a - b)**2)
return integrand
# Paramters defining the limits of integration and x'
x = np.linspace(-0.005, 0.005, n)
xd = np.linspace(0.0, aperture_width, n)
# Create a list of y values from the integrand function above
y = [0.0]*n
for i in range(1, n):
y[i] = f(x[i], xd[i])
# Using Simpon's Rule, integrate y dx
print(k/(2*math.pi*z)*simps(y, x)) # Output is complex
Запуск этого кода приводит к выводу (-26942.956248350412-72020.42454065284j)
.Если этот ответ слишком уродлив, вы можете упростить ответ, используя научную запись, следующим образом:
# Using Simpon's Rule, integrate y dx
answer = k/(2*math.pi*z)*simps(y, x)
simplified_answer = '{:.2e}'.format(answer) # Round and put in scientific notation
print(simplified_answer) # Output is complex
В результате получается намного красивее -2.69e+04-7.20e+04j
.