การประเมินเชิงตัวเลขของอินทิกรัลการแกว่งสูง


11

ในหลักสูตรขั้นสูงนี้เกี่ยวกับการประยุกต์ใช้ทฤษฎีฟังก์ชันที่ซับซ้อนณ จุดหนึ่งในการออกกำลังกายอินทิกรัลของการแกว่ง

I(λ)=cos(λcosx)sinxxdx

จะต้องมีการประมาณค่าขนาดใหญ่ของโดยใช้วิธีจุดอานในระนาบเชิงซ้อนλ

เนื่องจากธรรมชาติมีความผันผวนสูงอินทิกรัลนี้จึงยากต่อการประเมินโดยใช้วิธีการส่วนใหญ่ นี่เป็นสองส่วนของกราฟของ integrand และสำหรับที่ระดับต่างกัน:λ=10

cos (10 cos (x)) sin (x) / x

ลำดับการประมาณเชิงซีมโทติคคือ

I1(λ)=cos(λ14π)2πλ

และการปรับแต่งเพิ่มเติม (เล็กลงมาก) จะเพิ่มคำศัพท์

I2(λ)=18sin(λ14π)2πλ3

กราฟของค่าที่ประมาณเป็นฟังก์ชันของมีลักษณะดังนี้:λ

ฉัน (แลมบ์ดา) ประมาณ

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

ฉันพยายามประเมินอินทิกรัลสำหรับโดยใช้อัลกอริธึมอื่น แต่มีความสำเร็จน้อยมาก: Mathematica และ Matlab โดยใช้ตัวรวมตัวเลขเริ่มต้นไม่สามารถจัดการเพื่อสร้างค่าที่มีความหมาย (และรายงานสิ่งนี้อย่างชัดเจน), mpmathแทนที่และวิธีการ Gauss-Legendre ให้ผลลัพธ์ที่มีเสียงดังมากแม้ว่ามันจะมีแนวโน้มที่จะแกว่งไปรอบ ๆ ค่าที่วิธีการจุดอานให้เล็กน้อยเนื่องจากกราฟนี้อาจแสดง:λtanh(sinh)

mpmath ประมาณ

ในที่สุดฉันก็ลองเสี่ยงโชคกับผู้รวบรวม Monte-Carlo โดยใช้ตัวอย่างความสำคัญที่ฉันนำไปใช้ แต่ฉันก็ไม่ได้จัดการเพื่อให้ได้ผลลัพธ์ที่มั่นคงเช่นกัน

ใครบ้างมีความคิดว่าอินทิกรัลนี้สามารถประเมินได้อย่างอิสระสำหรับค่าคงที่ของหรือมากกว่านั้น?λ>1


ฟังก์ชั่นเป็นยัง?
nicoguaro

ใช่มันเป็นอย่าง
สม่ำเสมอ

คุณได้ลองเปลี่ยนอินทิกรัลให้เป็น ODE หรือไม่?
nicoguaro

1
ไม่ความแตกต่าง wrtแล้วแก้สมการเชิงอนุพันธ์เชิงตัวเลข x
nicoguaro

1
พล็อตแรกของคุณดูเหมือนจะแสดงฟังก์ชั่นที่แตกต่างจาก integrand ของคุณ กล่าวคือมันดูเหมือนว่าจะมีแทนที่ด้วยx นั่นคือพล็อตของฟังก์ชั่นλx ( cos ( λ x cos x ) sinc x )λxx(cos(λxcosx)sincx)
Ruslan

คำตอบ:


12

ใช้ทฤษฎีบทของ Plancherelเพื่อประเมินอินทิกรัลนี้

แนวคิดพื้นฐานคือว่าสำหรับสองฟังก์ชั่น ,f,g

I=f(x)g(x)dx=F(k)G(k)dk

ที่มีการแปลงฟูริเยร์ G ฟังก์ชั่นของคุณทั้งสองมีการสนับสนุนค่อนข้างน้อยในโดเมนสเปกตรัม นี่และควรมีการวิเคราะห์ฟูเรียร์ (หรือชุด) เช่นJacobi-ความโกรธการขยายตัว คุณสามารถตัดทอนอนุกรมอนันต์ที่ประมาณข้อกำหนดเนื่องจากการสลายตัวแบบทวีคูณของฟังก์ชัน Besselสำหรับ. หวังว่านี่จะช่วยได้F,Gf,gsinx/xrect(k)cos(λcosx)λ | J n ( x ) | n > | x |λ|Jn(x)|n>|x|

แก้ไข : จริง ๆ แล้วคุณควรใช้การแทนค่าอนุกรมฟูริเยร์ที่นี่แทนการแปลง เส้นทางการแปลงจะนำไปสู่การได้รับการแสดงแทนแบบซีมโทติคที่คุณมีอยู่แล้ว (ปรากฎว่านี่เป็นเพียง ) ทฤษฎีบทของ Plancherel ดังกล่าวยังสามารถใช้ได้กับอนุกรมฟูริเยร์ด้วยโดเมนการรวมของในอินทิกรัลสุดท้ายπJ0(λ)[0,2π]


ขอบคุณนี่เป็นความคิดที่ดีมาก!
doetoe

7

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

πN+π2

asymptotics

มันง่ายที่จะเดาได้ว่าซีรีย์ซีมโทติคมีรูปแบบ เพื่อตรวจสอบตัวเลขว่ามันก็เพียงพอแล้วที่จะทำพล็อตความแตกต่างระหว่างนิพจน์แบบอินทิกซีติกและนำหน้า

I(λ)2πλ[cos(λπ4)+c1sin(λπ4)λ+c2cos(λπ4)λ2+c3sin(λπ4)λ3+]
c1=18

int := NIntegrate[Cos[l*Cos[x]]*Sinc[x], {x, 0, 20.5*Pi}]; 
Plot[{l*(Sqrt[2*l/Pi]*int - Cos[l-Pi/4]), Sin[l-Pi/4]/8}, {l, Pi/4, 20}]

ในฐานะที่เป็นผลลัพธ์คุณจะได้รับไซน์ที่ค่อนข้างดีซึ่งสอดคล้องกับสิ่งที่คุณได้รับด้านบน

18

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

J[l_?NumericQ] := Block[{n=500},
  f[k_] := NIntegrate[Cos[l*Cos[x]]*Sinc[x], {x,0,(n+k)*Pi+Pi/2},
  Method->{"DoubleExponential"}, AccuracyGoal->14, MaxRecursion->100];
  1/2*((f[0]+f[1])/2+(f[1]+f[2])/2)
]
t = Table[{l, l^2*(Sqrt[2*l/Pi]*J[l] - Cos[l-Pi/4] - 1/8*Sin[l-Pi/4]/l)}, 
    {l, 4*Pi+Pi/4, 12*Pi+Pi/4, Pi/36}];
Fit[t, Table[Cos[l-Pi/4+Pi/2*n]/l^n, {n, 0, 10}], l]

ที่สร้างคำตอบต่อไปนี้

c2=9128,c3=751024,c4=367532768,

คำอธิบาย

ตัวอย่างง่ายๆ

สำหรับภาพประกอบฉันจะใช้ตัวอย่างที่ง่ายขึ้นของ sine - integral ให้ฉันจินตนาการว่าฉันสนใจคุณค่าแต่ฉันไม่รู้

S(x)=0xsin(y)ydy.
S()=π2

ซายน์

คุณเห็นว่าแกว่งไปมารอบ ๆ ค่า จำกัด เช่นเดียวกับผลรวมของการสลับในซีรีส์สัญญาณบางส่วนที่มีการตัดส่วนบน เมื่อคุณต้องการประมาณผลรวมดังกล่าวตามวิธีการเร่งความเร็วอนุกรมของออยเลอร์คุณควรใช้ หรือในแง่ของฟังก์ชันไซน์ - อินทิกรัลคุณควรรวมมันเข้ากับจุดระหว่างค่าสูงสุดและต่ำสุดของการแกว่ง มันเห็นได้ชัดจากจุดที่เห็นได้ชัดจากจุดนี้ประมาณ สำหรับค่าอาร์กิวเมนต์จำนวนมาก โดยทั่วไปประเด็นนี้คือจุดที่เกิดขึ้นS(x)

SN=n=1N(1)nn.
SSN+12(1)N+1N+1.
S(x)0πN+π2sinxxdx
max|S(x)|

ปัญหาของคุณ

กลับมาที่อินทิกรัลจากเส้นทางของคอนสแตนตินและยาโรสลาฟคุณจะเห็นได้ว่ามันทำงานในลักษณะเดียวกับไซน์ - อินทิกรัลเป็นฟังก์ชันของลิมิตสูงสุด ซึ่งหมายความว่าคุณต้องคำนวณค่า กับ{2} ด้านล่างเป็นพล็อตของค่าหลายอย่างเช่นกับ12

Ix0(λ)=20x0cos(λcos(x))sinc(x)dx
x0=πN+π2λ=12π

tab = Table[{x0, 2*NIntegrate[Cos[12*Pi*Cos[x]]*Sinc[x], {x, 0, x0}, 
     Method->{"DoubleExponential"}, AccuracyGoal->12, MaxRecursion->100]},
    {x0, 10*Pi+Pi/2, 30*Pi+Pi/2, Pi}];
tab1 = Table[(tab[[i]] + tab[[i+1]])/2, {i,1,Length[tab]-1}];
ListPlot[{tab, tab1}]

ตามมาตรฐาน

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

SN=12(SN+SN+1)
SN


ดี! อาจารย์ของหลักสูตรเป็นอาจารย์ในชีวิตจริงของคุณหรือไม่? หลักสูตรของพวกเขานั้นยอดเยี่ยมแม้ว่าจะยากและรวดเร็วมาก
doetoe

@dojo ใช่ฉันเป็นนักเรียนของ Konstantin เขาแบ่งปันลิงก์ไปยังคำถามของคุณกับฉัน
David

6

วิธีการของ Ooura สำหรับการรวมฟูริเยร์ไซน์ทำงานที่นี่ดู:

Ooura, Takuya และ Masatake Mori สูตรเลขชี้กำลังสองชั้นที่แข็งแกร่งสำหรับอินทิกรัลชนิดฟูริเยร์ วารสารการคำนวณและคณิตศาสตร์ประยุกต์ 112.1-2 (1999): 229-241

ฉันเขียนการใช้อัลกอริทึมนี้ แต่ไม่เคยทำงานเพื่อให้มันรวดเร็ว (โดยพูดว่าโหนด / น้ำหนักแคช) แต่อย่างไรก็ตามฉันได้รับผลลัพธ์ที่สอดคล้องกันทุกอย่างเกินความแม่นยำลอย:

float     = 0.0154244
double    = 0.943661538060268
long dbl  = 0.943661538066058702
quad      = 0.943661538066060288748574485677942
oct       = 0.943661538066060288748574485680878906503533004997613278231689169604876
asymptotic= 0.944029734

นี่คือรหัส:

#include <iostream>
#include <boost/math/quadrature/ooura_fourier_integrals.hpp>
#include <boost/math/constants/constants.hpp>
#include <boost/multiprecision/float128.hpp>
#include <boost/multiprecision/cpp_bin_float.hpp>

template<class Real>
Real asymptotic(Real lambda) {
    using std::sin;
    using std::cos;
    using boost::math::constants::pi;
    Real I1 = cos(lambda - pi<Real>()/4)*sqrt(2*pi<Real>()/lambda);
    Real I2 = sin(lambda - pi<Real>()/4)*sqrt(2*pi<Real>()/(lambda*lambda*lambda))/8;
    return I1 + I2;
}

template<class Real>
Real osc(Real lambda) {
    using std::cos;
    using boost::math::quadrature::ooura_fourier_sin;
    auto f = [&lambda](Real x)->Real { return cos(lambda*cos(x))/x; };
    Real omega = 1;
    Real Is = ooura_fourier_sin<decltype(f), Real>(f, omega);
    return 2*Is;
}

template<class Real>
void print(Real val) {
   std::cout << std::defaultfloat;
   std::cout << std::setprecision(std::numeric_limits<Real>::digits10);
   std::cout <<  val <<  " = " << std::hexfloat << val;
}

int main() {
    using boost::multiprecision::float128;
    float128  s = 7;
    std::cout << "Asymptotic = " << std::setprecision(std::numeric_limits<float128>::digits10) << asymptotic(s) << "\n";
    std::cout << "float precision = ";
    print(osc(7.0f));
    std::cout << "\n";
    std::cout << "double precision= ";
    print(osc(7.0));
    std::cout << "\n";
    std::cout << "long double     = ";
    print(osc(7.0L));
    std::cout << "\n";
    print(osc(s));

    print(osc(boost::multiprecision::cpp_bin_float_oct(7)));
    std::cout << "\n";
}

คุณไม่เห็นความแตกต่างระหว่างการสร้างพื้นที่สี่เหลี่ยมจัตุรัสและ asymptotic จริง ๆ เพราะมันอยู่ด้านบนของกันและกันยกเว้น : λ0ป้อนคำอธิบายรูปภาพที่นี่


ขอบคุณนี่เป็นสิ่งที่ดีจริงๆ! ฉันยังไม่สามารถใช้งานได้การติดตั้งบูสต์ของฉันไม่รองรับ แต่ตอนนี้ฉันกำลังดาวน์โหลดเวอร์ชันล่าสุดแล้ว
doetoe

เพียงเพื่อให้แน่ใจว่า: ใน 23 คุณมี cos (lambda * cos (x)) / x โดยไม่มีปัจจัย sin (x) จากอินทิก มันคือ ooura_fourier_sin ซึ่งสันนิษฐานว่าปัจจัยบาป (x) เพื่อเพิ่มจำนวนอินทิเกรตและส่งไปให้หรือไม่?
doetoe

ฉันทำให้มันทำงานได้ มันและการอ้างอิงของมันดูเหมือนจะเป็นแค่ส่วนหัวเท่านั้นดังนั้นฉันจึงไม่ต้องติดตั้งหรือคอมไพล์ (ยกเว้นสำหรับการปฏิบัติการ) ฉันหวังว่ามันจะได้รับการรวมเข้าด้วยกัน!
doetoe

@doetoe: ใช่ปัจจัยมีความหมายโดยนัยและรวมอยู่ในน้ำหนักพื้นที่สี่เหลี่ยมจัตุรัส ฉันกำลังพิจารณาที่จะทำให้มันเร็วขึ้นโดยการปรับโครงสร้างใหม่เพื่อแคชโหนดและน้ำหนัก เราจะเห็น! sin(x)
user14717

@doetoe: มันถูกรวมเข้ากับ Boost 1.71 API แตกต่างจากคำตอบนี้เล็กน้อย
user14717
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.