ฉันไม่คิดว่ามันจะสร้างความแตกต่าง คุณต้องเลือกการสร้างพื้นที่สี่เหลี่ยมจัตุรัสสูงพอสำหรับอินทิกรัลมากกว่าθ ดังนั้นมันจึงเท่ากับฟังก์ชัน Bessel J0. ฉันเลือกลำดับ 20 ในตัวอย่างด้านล่าง แต่คุณต้องทำการลู่เข้าเสมอเกี่ยวกับฟังก์ชั่นและช่วงเวลาที่คุณรวมเข้าด้วยกัน จากนั้นฉันก็บรรจบกับnคำสั่งของการสร้างพื้นที่สี่เหลี่ยมจัตุรัสของเกาส์เซียนของอินทิกรัลมากกว่า x. ฉันเลือกฉ( x ) = e- xx2 และใช้โดเมน [ 0 , xสูงสุด]คุณสามารถเปลี่ยน xสูงสุดด้านล่าง ฉันได้:
n direct rewritten
1 0.770878284949 0.770878284949
2 0.304480978430 0.304480978430
3 0.356922151260 0.356922151260
4 0.362576361509 0.362576361509
5 0.362316789057 0.362316789057
6 0.362314010897 0.362314010897
7 0.362314071949 0.362314071949
8 0.362314072182 0.362314072182
9 0.362314072179 0.362314072179
10 0.362314072179 0.362314072179
อย่างที่คุณเห็นสำหรับ n = 9 อินทิกรัลทั้งสองถูกรวมเข้าด้วยกันเป็น 12 เลขนัยสำคัญ
นี่คือรหัส:
from scipy.integrate import fixed_quad
from scipy.special import jn
from numpy import exp, pi, sin, cos, array
def gauss(f, a, b, n):
"""Gauss quadrature"""
return fixed_quad(f, a, b, n=n)[0]
def f(x):
"""Function f(x) to integrate"""
return exp(-x) * x**2
xmax = 3.
print " n direct rewritten"
for n in range(1, 20):
def inner(theta_array):
return array([gauss(lambda x: f(x) * cos(x*sin(theta)), 0, xmax, n)
for theta in theta_array])
direct = gauss(lambda x: f(x) * jn(0, x), 0, xmax, n)
rewritten = gauss(inner, 0, pi, 20) / pi
print "%2d %.12f %.12f" % (n, direct, rewritten)
คุณสามารถเล่นได้ด้วยตัวเองเพียงแค่เปลี่ยนxmax
คุณอาจต้องแบ่งช่วงเวลา[ 0 , ∞ ]เป็นองค์ประกอบและรวมองค์ประกอบโดยองค์ประกอบ f(x)
นอกจากนี้คุณยังสามารถเปลี่ยนฟังก์ชั่น ตรวจสอบให้แน่ใจว่าคุณได้รวมอินทิกรัลเข้าด้วยกันเสมอrewritten = gauss(inner, 0, pi, 20) / pi
นั่นคือเริ่มต้นด้วยคำสั่งต่ำและเพิ่มมันเรื่อย ๆ จนกว่าผลการพิมพ์จะหยุดเปลี่ยน