| |
|
|
p.specht
| Wenn´s tout autor allez, qui Longueur eines Bogenstückes qui Ellipse entre deux par Zentriwinkel definierten Punkten trop ermitteln, gibt es mangels einfacher analytischer Formel (beim Kreis z.B. L = r * alpha) seulement iterative Ansätze. Weil numerische intégration deutlich plus rapide allez comme qui sonst übliche MacLaurin-Reihenentwicklung avec zusätzlicher Integralrekursion, bemühte je Prof. Werner Rombergs Integrationsalgorithmus.
Titre de la fenêtre "Ellipsenbogenlänge via Romberg-Wegintegral"
'{ initialisation
' (D) Demoware 2012-06 by P. Specht. sans jedwede Gewähr!
Font 2:randomize:set("decimals",18)
Déclarer a!,b!,xu!,xo!,n!,g!,tmp!,Integral!,lambda2!,epsi!,epsi2!
var f!=pi()/180
'}
proc Fnk :parameters x!
declare y!,il%,sq!
sq!=sin(x!):sq!=sq!*sq!
si (epsi2!*sq!)<=1
' ======= PROGRAMMTEIL A =============
y! = a!*sqrt(1 - epsi2!*sq!)
' ====================================
d'autre
y!=-1*10^-35
endif
return y!
endproc
'{ un/Ausgabeteil
Begin:
cls rnd(8^8):
imprimer "\n Ellipsenbogenlänge: "
imprimer "\n Grosse HALBachse a = "; :input a!
cas a!=0 : goto "Begin"
imprimer "\n Kleine Halbachse b = "; :input b!
cas b!=0 : goto "Begin"
cas a!=b!:imprimer " évident un Kreis comme Test! "
epsi2!=1-(b!*b!)/(a!*a!)
epsi!=sqrt(epsi2!)
imprimer "\n Numer. Exzentrizität Epsilon = "; epsi!
imprimer "\n de Zentriwinkel alpha_1[° ] = ";:input xu!
imprimer "\n jusqu'à Zentriwinkel alpha_2[° ] =";:input xo!
imprimer "\n Abbruch-Genauigkeit [se mettre]: ";:input g!
cas g!=0:g!=10
g!=1/10^g!
Integral! = Rhomberg(xu!*f!,xo!*f!,g!)
imprimer "\n Ergebnis:\n"
imprimer " qui Bogenlänge entre "
imprimer " ";xu!;" et ";xo!; " [°Grad]"
imprimer " beträgt ";Integral!;" bzw. "; format$("%e",Integral!)
imprimer " avec einem faute <= ";format$("%e",tmp!)
si (xu!=0) and (xo!=90)
imprimer "\n Kontrolle pour Winkel 0° - 90° avec 1/4 qui Ramanujan-UmfangsFormel: "
lambda2!=(a!-b!)/(a!+b!):lambda2!=lambda2!*lambda2!
imprimer " ";1/4*Pi()*(a!+b!)*(1+3*lambda2! / (10+sqrt(4-3*lambda2!) ) )
imprimer " avec einem rel. faute kleiner ";
cas (epsi! >= 0) and (epsi! < 0.8820): imprimer "10^-9"
cas (epsi! >= 0.8820) and (epsi! < 0.9242): imprimer "10^-8"
cas (epsi! >= 0.9242) and (epsi! < 0.9577): imprimer "10^-7"
cas (epsi! >= 0.9577) and (epsi! < 0,9812): imprimer "10^-6"
cas (epsi! >= 0.9812) and (epsi! < 0.9944): imprimer "10^-5"
cas (epsi! >= 0.9944) and (epsi! < 0.9995): imprimer "10^-4"
cas (epsi! >= 0.9995) and (epsi! < 0.9999): imprimer "< 0.000403"
cas (epsi! >= 0.99999) and (epsi! <=1): imprimer "< -0.5%"
endif
WaitInput
Goto "Begin"
'}
proc Rhomberg : parameters xu!,xo!
var anz&=10' GERADE ZAHL!
Déclarer i&,j&,k&,n&[anz&+1],H![anz&+1],L![anz&,anz&],Q!
n&[0]=2
H![0]=(xo!-xu!)/n&[0]
' benutzt Trapezregel:
L![0,0]=H![0]/2*(Fnk(xu!)+Fnk(xo!)+2*Fnk(xu!+H![0]))
WhileLoop Anz&:j&=&Boucle
H![j&]=H![0]/(2^j&)
n&[j&]=n&[0]*(2^j&)
Q!=0
whileLoop 0,n&[j&-1]-1:i&=&Boucle
Q!=Q! + Fnk(xu!+(2*i&+1)*H![j&])
endwhile
L![0,j&]=L![0,j&-1]/2+H![j&]*Q!
Endwhile
WhileLoop Anz&:k&=&Boucle
whileloop 0,Anz&-1:j&=&Boucle
L![k&,j&]=1/(2^(2*k&)-1)*(2^(2*k&)*L![k&-1,j&+1]-L![k&-1,j&])
endwhile
tmp!=abs(L![k&,0]-L![k&-1,1])
cas tmp!<=g!:pause
Endwhile
' tmp! contient aktuelle Fehlergrenze
return L![k&,0]
endproc
|
|
|
| XProfan 11Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 04.05.2021 ▲ |
|
|
|