Deutsch
Quelltexte/ Codesnippets

Ellipsenumfang via Legendre-Polynom 2. Art ermitteln, Landen-Transformation

 

p.specht

Elliptische Probleme, etwa die Ermittlung der Bogenlänge von Ellipsen bestimmter Form und Abmessung, können alle auf drei Integrale über Bogensegmente einer Normalellipse mit kleiner oder aber großer Halbachse = 1 in fokaler Nulllage zurückgeführt werden. Dummerweise gibt es viele unterschiedliche Darstellungsformen dieser drei Arten - je nach Mathematiker, der sich damit verewigt hat, etwa die Legendre-Form, Gauss-Form, Jacobi-Form, die Riemann-Form und noch viele andere mehr.

Leider wurde es Technikern dadurch schwer gemacht, die richtige Formel zu finden und mit den jeweils einzusetzenden Parametern und den nötigen Vorfaktoren klarzukommen, sodaß sich bisher keine Standardform als Mainstream durchgesetzt hat. Das Thema "Ellipsenumfangsstrecke" gilt deshalb als sehr exotisch.

Das nachstehende Demo-Progi konzentriert sich auf die Legendre-Form der "Unvollständigen" elliptischen Integrale ...
- 1. Art: F(phi_max,k) = Integral{phi=0..phi_max; 1/SQRT(1+k^2*sin(phi)^2); d_phi}; und
- 2. Art: E(phi_max,k) = Integral{phi=0..phi_max; SQRT(1+k^2*sin(phi)^2); d_phi}.
(Das Integral 3. Art wäre noch deutlich komplizierter!)
"Unvollständig" heißen die nur, weil nicht der ganze Viertelbogen der Ellipse interessiert, sondern eben nur ein zwischen 0° und einem Maximalwinkel liegender Teilbogen - Details siehe Wikipedia.

Den Quellen zufolge (Q: F77-Bibliotheksmodul 1982, HP41C UPN-Programm 1983 und TrueBasic-Modul 1997) beträgt die erreichbare Genauigkeit des Algorithmus 11 Nachkommastellen. In einem ungünstigen Grenzfall wurde allerdings nur eine Genauigkeit 10^-4 verifiziert. Das kommt vermutlich wegen eines Verfahrenswechsels bei Parameterwerten um 0.25 zustande. Basisalgorithmus ist hier die sog. "Landen-Transformation".

Umfang einer realen Ellipse: Sei die Numerische Exzentrizität der Ellipse Epsilon = sqrt(a^2-b^2)/a ; dann ist die Bogenlänge des Ellipsen-Teilbogens zwischen 0 und Phi: L= a * E(Phi, Epsilon) mit E = Unvollst.Ellipt.Integral_zweiter_Art, wie nachstehend berechnet. Anwendung als Private Demo, da Rechtslage dzt. ungeprüft!

WindowTitle "Unvollständige Elliptische Integrale 1. und 2. Art {Legendre-F(phi,k), E(phi,k)}"
' Versuch (Early pre-alpha) - ohne jegliche Gewähr!
'{Q: F77-Bibliotheksmodul 1982, HP41C UPN-Programm 1983 und TrueBasic-Modul 1997
' 2015-07 nach XProfan 11.2a montiert - ACHTUNG: Ausschließlich als Demo!
' *** Möglicherweise bestehen Rechte Dritter! *** MfG Z. Ahnpasta
Windowstyle 24:Cls:font 2:set("decimals",17)
declare q!,k!,a!,d2r! , F!,Ellpci_e! : d2r!=pi()/180

Whileloop 0,900,1'6

    q!=d2r!* &Loop/10'30 '°
    k!=sin(q!)'Hinweis: Das ist NICHT die 'Modulwinkel'-Version der Legendre-Normalform,
    'k soll hier einfach nur den Definitionsbereich [0..1] durchlaufen!
    print "\n k = ";format$("00.0",&Loop);" °"
    Waitinput 2000' oder auskommentieren ...

    whileloop 0,90,15 : a!=d2r!* &Loop/10'° in Zehntelgrad-Schritten

        '*************************************************************************
        'Proc-Aufruf setzt 2 Ergebnisse:
        F!=Ellpci(a!,k!)
        'Die ausserhalb des Proc definierte Variable Ellpci_E!
        'bringt hier das 2. Ergebnis, E(phi,k) (Legendre-Form 2. Art) zurück.
        '*************************************************************************
        '*************************************************************************
        '  EINZELWERT-TEST, nachträglich eingefügt. Bitte die nachstehende Testzeile
        '  auskommentieren, falls nicht bestimmte Parameter getestet werden sollen!
        'F!=Ellpci( 0.9, 0.9 )  :clearclip:putclip str$(Ellpci_E!):waitinput
        '  Ergebnis in der Zwischenablage 17-stellig verfügbar, um Präzision zu prüfen.
        '*************************************************************************
        '*************************************************************************
        'Ausgabe:
        print " Phi = ";format$("00.0",&Loop);" °";
        print tab(15);"F(phi,k) = ";format$("%g",f!),
        print tab(45);"E(phi,k) = ";format$("%g",ellpci_e!)
        '*************************************************************************

    endwhile

Endwhile

waitinput
END
'{ VERIFIKATIONSTEIL
'*************************************************************************
' Präzisionsausgabe von E(phi,k) online verfügbar auf:
' https://keisan.casio.com/exec/system/1244989948
' Weitere Kontrolle via Maxima-Funktion elliptic_e(phi(=a),m(=k^2))
'*************************************************************************
'E(x,k) = Ellipci_E!
'-----------------------------------
'0.0, 0.0 = 0
'0.0, 0.1 = 0
'0.0, 0.4 = 0
'0.0, 0.9 = 0
'*** OK ! ***
'-----------------------------------
'Keisan 0.6,0.4   = 0.5945980735117437678766
'Maxima 0.6,0.4^2 = 0.59459807351174
'Ellpci(0.6,0.4)  = 0.59459807353087835
'*** OK ! ***
'-----------------------------------
'E(0.9,0.9) =
'Keisan(phi[rad],k):          0.808143018647826110606
'Maxima: elliptic_e(phi,k*k): 0.80814301864783
'Ellipci:                     0.80818524219652310
'*** MATHEMATISCH NICHT OK !!! (Technisch ausreichend) ***
'---------------------------------------------------------
'Ellipci(0.9,sqrt(0.9))           = 0.79659968020564376
'Maxima's_elliptic_e(0.9,0.9=k^2) = 0.79659968020564
'Keisan_E(0.9,Sqrt(0.9))          = 0.796599680205643585782
'*** OK ! ***
'Hinweis: Sqrt(0.9)=0.94868329805051379959966806332982
'-----------------------------------
'1.0, 0.0 = 1.570796326794896619231
'= Pi()/2 = 1.5707963267948966192313216916398
'*** OK ! ***
'}*********************************************************

Proc Ellpci :Parameters a!,k!

    ' a := Phi_max (sometimes called 'Amplitude')
    ' k := Modulus (In der Literatur wird auch m verwendet, mit m = k^2)
    ' F! = integral of first kind
    ' E! = integral of second kind
    ' Algorithm: Landen transformation with the DiDonato recurrence
    ' in specific ranges of the argument
    ' Proc uses external variable ellpci_e! for output of E!
    declare s! ,c!
    declare s0!,c0!, p0!,q0!
    declare s1!,c1!
    declare p1!,q1!, p2!,q2!
    declare s2!,s3!,s4!,s7!
    declare r0!,r1!,r2!, r7!
    declare n0!,n1!,n2!
    declare t0!,t1!,t2!,t3!,t7!
    declare d0!,d1!,d2!,d3!,d4!,d7!
    declare i1!,i2!,j1!,j2!,k1!,k2!, m7!,n7!
    declare L1!,L2!
    p2!=k!*k!
    q2!=(1-k!)*(1+k!)
    s!=sin(a!)
    c!=cos(a!)
    s0!=s!*s!
    c0!=c!*c!
    p0!=abs(k!*s!)
    q0!=abs(k!*c!)
    case p0!>=sqrt(.5):goto "ellpci_44"
    r1!=a!
    r2!=1
    s1!=0
    s2!=0
    n1!=1
    n2!=2
    t0!=a!*s0!
    t7!=s!*c!
    goto "ellpci_33"
    ellpci_29:
    n1!=n2!+1
    n2!=n1!+1
    t0!=s0!*t0!
    t7!=s0!*t7!
    ellpci_33:
    r0!=s1!
    r1!=(n1!*r1!-t7!)/n2!
    r2!=p2!*r2!/n2!
    s2!=s2!+r1!*r2!
    r2!=n1!*r2!
    s1!=s1!+r1!*r2!
    case abs(t0!)<abs(r0!):goto "ellpci_41"
    case abs(s1!)>abs(r0!):goto "ellpci_29"
    ellpci_41:
    f!=a!+s1!
    ellpci_e!=a!-s2!
    return f!
    print "Never reach 43-error!":waitinput
    ellpci_44:
    d7!=(1-p0!)*(1+p0!)
    d0!=sqrt(d7!)
    i2!=1
    j2!=1
    k2!=0
    m7!=0
    n7!=0
    s1!=0
    s2!=0
    s3!=0
    s4!=0
    t3!=q0!*d0!
    n0!=2
    goto "ellpci_63"
    ellpci_58:
    i2!=i1!
    j2!=j1!
    k2!=k1!
    n0!=n0!+2
    t3!=d7!*t3!
    ellpci_63:
    n1!=(n0!-1)/n0!
    n2!=(n0!+1)/(n0!+2)
    i1!=n1!*i2!
    j1!=n1!*n1!*q2!*j2!
    k1!=k2!+2/(n0!*(n0!-1))
    r0!=t3!/n0!
    m7!=n2!*n2!*q2!*(m7!-r0!*i1!)
    n7!=n1!*n2!*q2!*(n7!-r0!*i2!)'=Orig
    d1!=j1!
    d2!=n2!*j1!
    d3!=m7!-j1!*k1!
    d4!=n7!-n1!*q2!*j2!*k1! + q2!*j2!/(n0!*n0!)
    r0!=s3!
    s1!=s1!+d1!
    s2!=s2!+d2!
    s3!=s3!+d3!
    s4!=s4!+d4!
    case s3!<r0!:goto "ellpci_58"
    t0!=d0!+q0!
    r7!=t0!/4
    L1!= -1*ln(r7!)
    t7!=1+p0!
    s7!=t7!/2
    L2!= ln(s7!)
    'k=1:Kreis, daher Arc=Kreisbogen[rad] 'Meine eigene Änderung!

    if L2!=0:ellpci_e!=sin(a!):beep:return Ln(tan(a!/2+Pi()/4)):End:endif

        t1!=(1+s1!)*L1!+q0!/d0!*L2!
        t2!=(.5+s2!)*q2!*L1!+1-q0!/d0!*(1-p0!)
        f!=t1!+s3!
        ellpci_e!=t2!+s4!
        case a!>=0:goto "ellpci_94"
        f!= -1*f!
        ellpci_e!= -1*ellpci_e!
        ellpci_94:
        return f!

    endproc

 
XProfan 11
Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'...
19.05.2021  
 



Zum Quelltext


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

822 Betrachtungen

Unbenanntvor 0 min.
Ernst21.07.2021
Uwe ''Pascal'' Niemeier13.06.2021
Thomas Zielinski07.06.2021
R.Schneider04.06.2021
Mehr...

Themeninformationen

Dieses Thema hat 1 Teilnehmer:

p.specht (1x)


Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie