अत्यधिक दोलन अभिन्न का संख्यात्मक मूल्यांकन


11

में जटिल समारोह सिद्धांत के आवेदन पर इस उन्नत पाठ्यक्रम एक बिंदु पर एक व्यायाम अत्यधिक oscillatory अभिन्न में

I(λ)=cos(λcosx)sinxxdx

जटिल विमान में काठी बिंदु विधि का उपयोग करके λ बड़े मूल्यों के लिए अनुमानित किया जाना है।

इसकी अत्यधिक दोलन प्रकृति के कारण, यह अभिन्न अधिकांश अन्य तरीकों का उपयोग करके मूल्यांकन करना बहुत कठिन है। ये विभिन्न पैमानों पर λ=10 लिए इंटीग्रांड के ग्राफ के दो टुकड़े हैं:

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

एक प्रमुख क्रम स्पर्शोन्मुख सन्निकटन है

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

और आगे (बहुत छोटा) शोधन शब्द जोड़ता है

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

λ एक समारोह के रूप में अनुमानित मूल्यों का एक ग्राफ निम्नानुसार है:

I(lambda) approx

अब मेरा सवाल आता है: नेत्रहीन यह देखने के लिए कि सन्निकटन कितना अच्छा है, मैं इसे इंटीग्रल के "वास्तविक मूल्य" से तुलना करना चाहूंगा, या एक स्वतंत्र एल्गोरिथ्म का उपयोग करके एक ही इंटीग्रल के लिए एक अच्छा सन्निकटन के लिए अधिक सटीक रूप से। छोटे आकार के सुधार के कारण, मैं उम्मीद करूंगा कि यह वास्तविक करीब होगा।

मैं कुछ के लिए अभिन्न का मूल्यांकन करने की कोशिश की λ अन्य एल्गोरिदम का उपयोग करते हैं, लेकिन बहुत कम सफलता के साथ: मेथेमेटिका और मैटलैब डिफ़ॉल्ट न्यूमेरिकल इंटीग्रेटर का उपयोग कर एक सार्थक मूल्य का उत्पादन (और स्पष्ट रूप से इस रिपोर्ट में) के लिए प्रबंधन नहीं है, का उपयोग कर mpmath दोनों दोगुना घातीय tanh(sinh) प्रतिस्थापन और गॉस-लीजेंड विधि बहुत शोर परिणाम पैदा करती है, हालांकि इसमें उन मानों के चारों ओर दोलन करने की हल्की प्रवृत्ति होती है जो काठी बिंदु विधि देती है, जैसा कि यह ग्राफ दिखा सकता है:

mpmath approx

अंत में मैंने एक मोंटे-कार्लो इंटीग्रेटर के साथ अपनी किस्मत आजमाई जो महत्वपूर्ण नमूने का उपयोग करता है जिसे मैंने लागू किया था, लेकिन मैंने किसी भी स्थिर परिणाम प्राप्त करने का प्रबंधन नहीं किया।

क्या किसी को इस बात का अंदाजा है कि λ>1 या तो के किसी निश्चित मूल्य के लिए इस अभिन्नता का स्वतंत्र रूप से मूल्यांकन कैसे किया जा सकता है?


समारोह भी है?
nicoguaro

हाँ, यह भी है
doetoe

क्या आपने अपने अभिन्न को ODE में बदलने की कोशिश की है?
nicoguaro

1
नहीं, भेदभाव wrt और फिर संख्यात्मक समीकरण को संख्यात्मक रूप से हल करें। x
निकोगुआरो

1
आपका पहला कथानक आपके अभिन्न अंग से भिन्न कार्य को दर्शाता है। अर्थात्, ऐसा लगता है कि को λ x से बदल दिया गया है । यानी भूखंड समारोह की है x ( क्योंकि ( λ एक्स क्योंकि एक्स ) sinc एक्स )λλxx(cos(λxcosx)sincx)
रुस्लान

जवाबों:


12

इस अभिन्न का मूल्यांकन करने के लिए प्लांचरेल प्रमेय का उपयोग करें ।

मूल विचार यह है कि दो कार्यों के लिए f,g ,

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

जहां F,G के फूरियर रूपांतरण हैं f,g । स्पेक्ट्रल डोमेन में आपके कार्यों का अपेक्षाकृत कम समर्थन है। यहाँ, sinx/xrect(k) और cos(λcosx) में जैकोबी-एंगर विस्तार की तरह एक विश्लेषणात्मक फूरियर रूपांतरण (या श्रृंखला) होना चाहिए । आप बेसेल फ़ंक्शन के सुपर-घातीय क्षय के कारण λ शब्दों के बारे में अनंत श्रृंखला को काट सकते हैं |Jn(x)| लिए n>|x|

πJ0(λ)[0,2π]


Thanks, this is a very good idea!
doetoe

7

The key to the evaluation of oscillatory integrals is to truncate integral at the right point. For this example you need to choose upper limit of the form

πN+π2
Before explaining why it should work, let me at first show that it actually produces good results.

Asymptotics

It is easy to guess that asymptotic series has the form

I(λ)2πλ[cos(λπ4)+c1sin(λπ4)λ+c2cos(λπ4)λ2+c3sin(λπ4)λ3+]
In order to check numerically that c1=18 it is enough to plot difference between an integral and leading asymptotic expression.

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}]

As an output you get quite a nice sine which coincides with the one you derived above.

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]

जो निम्न उत्तर उत्पन्न करता है।

सी2=-9128,सी3=-751024,सी4=367532768,...

व्याख्या

सरल उदाहरण है

चित्रण के लिए मैं साइन के अधिक सरल उदाहरण का उपयोग करने जा रहा हूं - अभिन्न

एस(एक्स)=0एक्सपाप(y)yy
मुझे लगता है कि मैं मूल्य में रुचि रखते हैं कल्पना करते हैं एस()=π2, लेकिन मैं यह नहीं जानता।

sine

आपने देखा एस(एक्स) oscillates around its limiting value similarly to how partial sums of alternating in sign series oscillate with upper cut-off.

SN=n=1N(1)nn.
When you want to estimate such sum, according to Euler series acceleration method you should take
SSN+12(1)N+1N+1.
Or in terms of sine--integral function, you should integrate it up to the point between maximum and minimum of oscillations. As it is clearly seen from the plot such point are approximately given by
S(x)0πN+π2sinxxdx
for large values of argument. More generally, such point is the one where max|S(x)| occurs.

Your problem

Coming back to integral from Konstantin and Yaroslav's course you can see that it behaves exactly the same way as sine--integral as a function of upper limit. That means you only need to calculate values

Ix0(λ)=20x0cos(λcos(x))sinc(x)dx
with x0=πN+π2. Below is the plot of several such values with λ=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}]

acc

Here you can see the result of another acceleration method. I rearrange partial sums in the following manner

SN=12(SN+SN+1)
and obtain new sequence SN which converges much faster. That trick also happens to be useful if you want to evaluate integral with high precision.


Nice! Are the instructors of the course your real-life professors? Their course is fantastic, though very tough and fast-paced
doetoe

@doetoe हाँ, मैं कॉन्स्टेंटिन का छात्र हूँ। उन्होंने मेरे साथ आपके प्रश्न का लिंक साझा किया।
डेविड सैकिन

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";
}

आप वास्तव में चतुर्भुज और स्पर्शोन्मुख के बीच का अंतर नहीं देख सकते क्योंकि वे एक दूसरे के ठीक ऊपर झूठ बोलते हैं λ0: enter image description here


धन्यवाद, यह वास्तव में अच्छा है! मुझे यह अभी तक काम करने के लिए नहीं मिला, मेरा बूस्ट इंस्टॉलेशन संगत नहीं है, लेकिन मैं अब नवीनतम संस्करण डाउनलोड कर रहा हूं।
कबूतर

बस यह सुनिश्चित करने के लिए: 23 में आपके पास अखंडता से पाप (x) कारक के बिना cos (लंबो * cos (x)) / x है। क्या यह ooura_fourier_sin है जो इस कारक पाप को मानता है (x) जो इसे पारित किए गए इंटीग्रैंड को गुणा करता है?
कबूतर

मुझे यह काम कर गया। यह और इसकी निर्भरता सभी शीर्षकों के लिए ही प्रतीत होती हैं, इसलिए मुझे स्थापित या संकलित (निष्पादन योग्य को छोड़कर) नहीं करना था। मुझे उम्मीद है कि इसे बढ़ावा मिलेगा!
doetoe

@doetoe: हां, द पाप(एक्स)कारक को निहित और चतुष्कोणीय भार में शामिल किया गया है। मैं इसे नोड्स और वज़न को कैश करने के लिए इसे फिर से शुरू करने पर विचार कर रहा हूं; हम देखेंगे!
user14717

@doetoe: यह बूस्ट 1.71 में विलय हो गया है। एपीआई इस जवाब से थोड़ा अलग है।
user14717
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.