Elliptisches Integral der ersten Ordnung



  • Ich benötige für die Berechnung von Qualitätsparametern eine Formel (besser C-Implementation) für das oben benannte Problem. Kennt sich damit jemand aus?

    Habe zwar in einem Buch das hier gefunden

    K(k)/K(k') ~= 1/(2*Pi) * ln[2*[(sqrt(1+k) + pow(4*k,0.25)) / (sqrt(1+k) - pow(4*k,0.25))]]
    

    aber es korrespondiert nicht mit dem Ergebnis, das mir Mathematica mit EllipticK[] ausspuckt.

    EllipticK[m] gives the complete elliptic integral of the first kind K(m)
    


  • Ich hab mal vor kurzem eine Funktion zur nummerischen Integration implementiert, aber für dieses Spezialfall gibts bestimmt was viel, viel besseres.

    typedef double (*FUNCTION)(double);
    
    // Milne-Regel Koeffizienten (Ansorge, Oberle "Mathe für Ing's" S. 392)
    double k[] = {7.0/90.0, 32.0/90.0, 12.0/90.0, 32.0/90.0, 7.0/90.0};
    
    // Berechne Integral von a bis b über der Funktion fkt
    double integral(FUNCTION fkt, double a, double b)
    {   
        double diff = b-a;
    
        // Intervall halbieren, falls es zu groß ist
        // Fehler = (diff/4)^7 * 8/945 * fkt(Zwischenstelle)
        // Also ist (diff/4 < 1) wünschenswert
        if(diff >= 3)
        {
            double mid = diff/2 + a;
            return integral(fkt, a, mid) + integral(fkt, mid, b);
        }
    
        double result = 0;
        double h      = 0.25 * (b-a);  // Schrittweite der Stützstellen
    
        for(int i = 0; i != 5; ++i)
          result += k[i] * fkt(a + i*h);
    
        return diff * result;
    }
    


  • Damit funktioniert es leider nicht. Es gibt ein Buch, das heißt Numeric Recipes in C, da wurde solch eine Funktion implementiert. Leider habe ich dieses Buch nicht, außerdem basiert es auf Bibliotheken, die nicht frei verfügbar sind. Und dazu Ist mir obendrein auch nicht klar, warum dieser Funktion drei Parameter übergeben werden und nicht nur einer.



  • zwette schrieb:

    Und dazu Ist mir obendrein auch nicht klar, warum dieser Funktion drei Parameter übergeben werden und nicht nur einer.

    😕 on welcher Funktion sprichst du? Bei Taurins' Vorschlag geht es um eine numerische Integration; der Funktion

    double integral(FUNCTION fkt, double a, double b);
    

    wird die Abbildungsvorschrift und die Integrationsgrenzen a und b übergeben; was sonst! Ist wahrscheinlich bei jeder Funktion, die ein bestimmtes Integral berechnet, genau so *lol*
    Kennst du die Newton-Cotes-Verfahren? Schau dir die mal an, dann verstehst du wahrscheinlich auch die Idee, die hinter seiner Lösung steckt. to be remembered: es handelt sich natürlich nur um eine Annäherung!



  • zwette schrieb:

    Damit funktioniert es leider nicht. Es gibt ein Buch, das heißt Numeric Recipes in C, da wurde solch eine Funktion implementiert. Leider habe ich dieses Buch nicht, außerdem basiert es auf Bibliotheken, die nicht frei verfügbar sind. Und dazu Ist mir obendrein auch nicht klar, warum dieser Funktion drei Parameter übergeben werden und nicht nur einer.

    Hier gibt es eine Online-Version: http://www.library.cornell.edu/nr/cbookcpdf.html

    Guck dir doch da einfach den Sourcecode an (, was die Parameter bedeuten und welches Verfahren benutzt wird). Dann kannst du das so abtippen oder am besten noch ein wenig verbessern/anpassen ...



  • zwette schrieb:

    Damit funktioniert es leider nicht.

    Warum nicht? Es ist bestimmt keine hübscher weg, meine Implementation der Newton-Coates-Regel ist wahrscheinlich auch höchst naiv, und es gibt wohl bessere Wege, aber funktionieren tut es 🙂



  • Ok, anders herum:

    Ich brauche keine Näherung, sondern die Umsetzung der EllipticK-Funktion aus Mathematica, mit der funktoniert es nämlich.

    Ich habe einen Wert, z.B. 0.38517165, und wenn ich den bei Mathematica in diese EllipticK-Funktion eingebe, bekomme ich

    N[EllipticK[0.38517165]] --> 1.76737

    Und die Umsetzung dieser Funktion mit genau einem Wert bräuchte ich. Näherungen sind auch nicht brauchbar, da hier kleine Abweichungen fatale Auswirkungen aufs Endergebnis haben.


Anmelden zum Antworten