Как написать многовариантный цикл, который описывает все комбинации, когда каждая переменная имеет свои параметры? - PullRequest
0 голосов
/ 25 ноября 2018

Я пытаюсь написать функцию для выполнения интегрирования правила Симпсона 1-мерного интеграла Френеля.И я новичок в программировании.Я изо всех сил пытаюсь написать код, решает интеграл и строит его для всех возможных значений, используя массивы.Точнее, я пытаюсь выяснить, как описать y, где x является аргументом, а x 'находится в цикле границ x', которые являются пределами интеграла, как показано на рисунке.Любые дальнейшие рекомендуемые изменения в моем коде будут очень полезны. Формат вопроса, который был задан

Это мои текущие усилия.Включает блок с отступом, от которого я не могу избавиться.

import math 
import cmath
import numpy as np
import matplotlib.pyplot as plt

NumPoints = 100 #Number of areas to be calculated for integration           approximation
λ = 1*10**-6 #Wavelength 
z = 0.02 #Screen distance
k = (2*math.pi)/λ #wave number
j = j=cmath.sqrt(-1)

xmin = -0.005 #x = screen coordinate
xmax = +0.005 
xvals = np.linspace(xmin,xmax,NumPoints) # x intervals between limits

xdmin = 0.0 #xd = aperture coordinate 
xdmax = 2*10**-5
dxd = xdmax/NumPoints
xdvals = np.linspace(xdmin,xdmax,Numpoints) # xd intervals between limits
#All figures in SI

def simpson (x, xd ):

    for i in range(Numpoints):
    while (xdmin<xd<xdmax):

    yvals[i] = (k/2(math.pi)z)math.exp((1jk/2z)(xvals[i] - xd)**2)

    integral = np.sum(yvals[i])*dxd 

    return integral

print("The integral =", simpson, "for the given constants." )

plt.plot(xvals,yvals)

Спасибо!

1 Ответ

0 голосов
/ 25 ноября 2018

Если не важно написать свое правило Симпона , тогда вы можете использовать импорт 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.

...