संख्यात्मक एकीकरण - NaNs को संभालना (C / फोरट्रान)


12

मैं एक मुश्किल अभिन्न के साथ काम कर रहा हूँ जो शून्य के निकट कुछ मानों में NaN को प्रदर्शित करता है और फिलहाल मैं एक ISNAN कथन का उपयोग करते हुए उनके साथ काफी गंभीर व्यवहार कर रहा हूं जो ऐसा होने पर शून्य से इंटीग्रेंड सेट करता है। मैंने एनटीआर पुस्तकालय के साथ फोरट्रान में (क्यू 1 एडा रूटीन - क्यू 1 डेडैक्स अलग नहीं है) और सी में जीएसएल लाइब्रेरी के साथ (क्यूएजीएस रूटीन का उपयोग करके) यह कोशिश की है।

मैंने CQUAD (C के लिए GSL लाइब्रेरी का हिस्सा) में देखा, जो विशेष रूप से इंटीग्रेंड में NaNs और INF को संभालने के लिए बनाया गया है, लेकिन संदर्भ में बहुत कम उपयोगी जानकारी है और ऑनलाइन कोई उदाहरण प्रोग्राम नहीं है जो मुझे मिल सके। क्या किसी को सी या फोरट्रान के लिए कोई अन्य संख्यात्मक एकीकरण दिनचर्या पता है जो काम कर सकती है?


क्रॉस पोस्ट पर math.stackexchange.com/questions/242771/…

^ मैंने वह पोस्ट हटा दी है।
जोश

जवाबों:


10

मैं CQUADजीएसएल में लेखक हूं । इंटरफ़ेस लगभग उसी के समान है QAGS, इसलिए यदि आपने बाद का उपयोग किया है, तो पूर्व की कोशिश करना बिल्कुल भी मुश्किल नहीं होना चाहिए। बस याद रखें कि अपने NaNएस और Infज़ीरो को इंटीग्रांड में परिवर्तित न करें - कोड इन से ही निपटेगा।

नियमित रूप से ओक्टेव में quadcc, और यहां मतलब में भी उपलब्ध है

क्या आप अपने साथ काम कर रहे पूर्णांकों का उदाहरण दे सकते हैं?

अपडेट करें

यहां किसी CQUADसमापन बिंदु पर एक विलक्षणता के साथ एक फ़ंक्शन को एकीकृत करने के लिए उपयोग करने का एक उदाहरण है :

#include <stdio.h>
#include <gsl/gsl_integration.h>

/* Our test integrand. */
double thefunction ( double x , void *param ) {
    return sin(x) / x;
    }

/* Driver function. */
int main ( int argc , char *argv[] ) {

    gsl_function f;
    gsl_integration_cquad_workspace *ws = NULL;
    double res, abserr;
    size_t neval;

    /* Prepare the function. */
    f.function = &thefunction;
    f.params = NULL;

    /* Initialize the workspace. */
    if ( ( ws = gsl_integration_cquad_workspace_alloc( 200 ) ) == NULL ) {
        printf( "main: call to gsl_integration_cquad_workspace_alloc failed.\n" );
        abort();
        }

    /* Call the integrator. */
    if ( gsl_integration_cquad( &f, 0.0 , 1.0 , 1.0e-10 , 1.0e-10 , ws , &res , &abserr , &neval ) != 0 ) {
        printf( "main: call to gsl_integration_cquad failed.\n" );
        abort();
        }

    /* Print the result. */
    printf( "main: int of sin(x)/x in [0,1] is %.16e +/- %e (%i evals).\n" ,
        res , abserr , neval );

    /* Free the workspace. */
    gsl_integration_cquad_workspace_free( ws );

    /* Bye. */
    return 0;

    }

जिसे मैंने संकलित किया gcc -g -Wall cquad_test.c -lgsl -lcblas। आउटपुट है

main: int of sin(x)/x in [0,1] is 9.4608307036718275e-01 +/- 4.263988e-13 (63 evals).

जो, मेपल में 20 अंकों के लिए गणना की गई , 14 अंकों के लिए सही है।0.94608307036718301494

ध्यान दें कि यहां कुछ भी विशेष नहीं है, न ही यह बताने के लिए कि CQUADविलक्षणता कहां है, या किसी भी विशेष उपचार के भीतर ही है। मैं बस इसे वापस लौटने देता हूं NaN, और इंटीग्रेटर स्वचालित रूप से उनकी देखभाल करता है।

यह भी ध्यान दें कि नवीनतम जीएसएल संस्करण 1.15 में एक बग है जो विलक्षणताओं के उपचार को प्रभावित कर सकता है। यह तय हो गया है, लेकिन इसे आधिकारिक वितरण में नहीं बनाया गया है। मैंने सबसे हालिया स्रोत का उपयोग किया, जिसके साथ डाउनलोड किया गया bzr branch http://bzr.savannah.gnu.org/r/gsl/trunk/


महान, उत्तर के लिए धन्यवाद। मैं ग्रीन के फंक्शंस को खोजने के लिए इंटीग्रेटर का उपयोग कर रहा हूं, और मेरे इंटीग्रैंड में घातांक और कुछ साइन / कोजाइन शामिल हैं। फिर मैं इनको फिर से एक अलग चर को एकीकृत करता हूं और यही वह जगह है जहां मुझे NaN पॉपिंग मिलती है। क्या आप CQUAD का उपयोग करके किसी भी उदाहरण कार्यक्रम के बारे में जानते हैं? मैं इस बात को लेकर असमंजस में हूं कि कार्यक्षेत्र के कार्यों में कैसे और कहां लगाया जाए। मुझे इस बात का उल्लेख करना चाहिए कि मैं इस प्रकार की चीज़ों के लिए बहुत शुरुआती हूँ!
जोश

@ जोश: अच्छी बात है, मुझे लगता है कि किसी को इसका उपयोग करने वाला पहला व्यक्ति होना चाहिए, इसलिए मैंने इसका एक न्यूनतम उदाहरण जोड़ा है कि इसे कैसे कहा जा सकता है।
पेड्रो

3

तुम भी डबल घातीय चतुर्भुज सूत्रों की जाँच कर सकते हैं। वे चर का (अंतर्निहित) परिवर्तन करते हैं, जिससे यह सुनिश्चित होता है कि वे "आसानी से दूर" सीमा विलक्षणताएं हैं। Ooura की वेबसाइट पर एक बहुत अच्छा (Fortran77 और C) कार्यान्वयन पाया जा सकता है ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.