การแปลง


15

ฉันได้ยินมาโดยบังเอิญว่าเมื่อมีคนพยายามทำตัวเลขที่เป็นส่วนหนึ่งของแบบฟอร์ม

0f(x)J0(x)dx

ด้วยf(x)ราบรื่นและมีความประพฤติดี (เช่นตัวเองไม่ได้มีความผันผวนสูง, ไม่มีความผิด, ฯลฯ ) จากนั้นมันจะช่วยให้ความแม่นยำในการเขียนใหม่เป็น

1π0π0f(x)cos(xsinθ)dxdθ

และดำเนินการอินทิกรัลภายในเป็นตัวเลขก่อน ฉันไม่เห็นเหตุผลที่ฉันควรคาดหวังว่าสิ่งนี้จะทำงานได้ แต่แล้วความแม่นยำของวิธีการเชิงตัวเลขก็ไม่ค่อยชัดเจน

แน่นอนฉันรู้ว่าวิธีที่ดีที่สุดที่จะทำคือการใช้วิธีการที่เหมาะสำหรับอินทิกรัลสโคปแบบนี้ แต่เพื่อความอยากรู้อยากเห็น ใครสามารถยืนยันหรือลบล้างการเปลี่ยนแปลงนี้มีแนวโน้มที่จะปรับปรุงความถูกต้องของอินทิกรัล? และ / หรือชี้ให้ฉันไปยังแหล่งที่มาอธิบายหรือไม่


1
แบบบูรณาการมากกว่า ... มันเป็นหนึ่งในความหมายหนึ่งของฟังก์ชัน Bessel 0θπ
David Z

4
ดังนั้นคำถามของคุณคือ: กำหนดสูตรการหาพื้นที่สี่เหลี่ยมจัตุรัส point ทั่วไปQ N [ ]ใน[ 0 , )และQ N π [ ]ใน[ 0 , π ] , คือQ N M [ fNQN[][0,)QπN[][0,π]แย่กว่าหรือดีกว่า Q M π [ Q N [ f ( x )QNM[fJ0] ] QπM[QN[f(x)cos(xsinθ)]]
Stefano M

@tefanoM ใช่ถูกต้องแล้ว
David Z

FWIW ซึ่งเป็นหนึ่งในวิธีที่มีประสิทธิภาพมากที่สุดสำหรับการประเมินฟังก์ชัน Bessel เพื่อ Zeroth-order คือกฎรูปสี่เหลี่ยมคางหมูซึ่งเป็นที่รู้จักกันดีในการให้ผลลัพธ์ที่แม่นยำมากเมื่อรวมการบูรณาการเป็นระยะในช่วงเวลาหนึ่ง ดังนั้นอาจช่วยได้
JM

คำตอบ:


3

ฉันไม่คิดว่ามันจะสร้างความแตกต่าง คุณต้องเลือกการสร้างพื้นที่สี่เหลี่ยมจัตุรัสสูงพอสำหรับอินทิกรัลมากกว่าθ ดังนั้นมันจึงเท่ากับฟังก์ชัน Bessel J0. ฉันเลือกลำดับ 20 ในตัวอย่างด้านล่าง แต่คุณต้องทำการลู่เข้าเสมอเกี่ยวกับฟังก์ชั่นและช่วงเวลาที่คุณรวมเข้าด้วยกัน จากนั้นฉันก็บรรจบกับnคำสั่งของการสร้างพื้นที่สี่เหลี่ยมจัตุรัสของเกาส์เซียนของอินทิกรัลมากกว่า x. ฉันเลือก(x)=อี-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นั่นคือเริ่มต้นด้วยคำสั่งต่ำและเพิ่มมันเรื่อย ๆ จนกว่าผลการพิมพ์จะหยุดเปลี่ยน


ฉันสงสัยว่าคุณพูดถูกการทดสอบของฉันได้แสดงผลลัพธ์ที่คล้ายกัน
David Z
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.