| |
|
|
p.specht
| Wenn´s por lo tanto va, el Longitud uno Bogenstückes el Ellipse zwischen zwei por Zentriwinkel definierten Punkten a ermitteln, hay mangels einfacher analytischer Formel (beim Kreis z.B. L = r * alpha) sólo iterative Ansätze. Weil numerische Integration deutlich más rápido va como el sonst übliche MacLaurin-Reihenentwicklung con zusätzlicher Integralrekursion, bemühte Yo Prof. Werner Rombergs Integrationsalgorithmus.
Título de la ventana "Ellipsenbogenlänge via Romberg-Wegintegral"
'{ Initialisierung
' (D) Demoware 2012-06 by P. Pájaro carpintero. Ohne jedwede Gewähr!
Font 2:randomize:set("decimals",18)
Declarar a!,b!,xu!,xo!,n!,g!,tmp!,Integral!,lambda2!,epsi!,epsi2!
var f!=pi()/180
'}
proc Fnk :parámetros x!
declarar y!,él%,sq!
sq!=sin(x!):sq!=sq!*sq!
if (epsi2!*sq!)<=1
' ======= PROGRAMMTEIL A =============
y! = a!*sqrt(1 - epsi2!*sq!)
' ====================================
más
y!=-1*10^-35
endif
volver y!
ENDPROC
'{ Ein/Ausgabeteil
Begin:
cls rnd(8^8):
imprimir "\n Ellipsenbogenlänge: "
imprimir "\n Grosse HALBachse a = "; :input a!
caso a!=0 : goto "Begin"
imprimir "\n Kleine Halbachse b = "; :input b!
caso b!=0 : goto "Begin"
caso a!=b!:imprimir " Offenbar una Kreis como Test! "
epsi2!=1-(b!*b!)/(a!*a!)
epsi!=sqrt(epsi2!)
imprimir "\n Numer. Exzentrizität Epsilon = "; epsi!
imprimir "\n Von Zentriwinkel alpha_1[° ] = ";:input xu!
imprimir "\n a Zentriwinkel alpha_2[° ] =";:input xo!
imprimir "\n Abbruch-Genauigkeit [Stellen]: ";:input g!
caso g!=0:g!=10
g!=1/10^g!
Integral! = Rhomberg(xu!*f!,xo!*f!,g!)
imprimir "\n Ergebnis:\n"
imprimir " El Bogenlänge zwischen "
imprimir " ";xu!;" y ";xo!; " [°Grad]"
imprimir " beträgt ";Integral!;" o. "; format$("%e",Integral!)
imprimir " con un Fehler <= ";format$("%e",tmp!)
if (xu!=0) and (xo!=90)
imprimir "\n Kontrolle para Winkel 0° - 90° con 1/4 el Ramanujan-UmfangsFormel: "
lambda2!=(a!-b!)/(a!+b!):lambda2!=lambda2!*lambda2!
imprimir " ";1/4*Pi()*(a!+b!)*(1+3*lambda2! / (10+sqrt(4-3*lambda2!) ) )
imprimir " con un rel. Fehler kleiner ";
caso (epsi! >= 0) and (epsi! < 0.8820): imprimir "10^-9"
caso (epsi! >= 0.8820) and (epsi! < 0.9242): imprimir "10^-8"
caso (epsi! >= 0.9242) and (epsi! < 0.9577): imprimir "10^-7"
caso (epsi! >= 0.9577) and (epsi! < 0,9812): imprimir "10^-6"
caso (epsi! >= 0.9812) and (epsi! < 0.9944): imprimir "10^-5"
caso (epsi! >= 0.9944) and (epsi! < 0.9995): imprimir "10^-4"
caso (epsi! >= 0.9995) and (epsi! < 0.9999): imprimir "< 0.000403"
caso (epsi! >= 0.99999) and (epsi! <=1): imprimir "< -0.5%"
endif
WaitInput
Goto "Begin"
'}
proc Rhomberg : parámetros xu!,xo!
var anz&=10' GERADE ZAHL!
Declarar 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&=&Loop
H![j&]=H![0]/(2^j&)
n&[j&]=n&[0]*(2^j&)
Q!=0
whileLoop 0,n&[j&-1]-1:i&=&Loop
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&=&Loop
whileloop 0,Anz&-1:j&=&Loop
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])
caso tmp!<=g!:romper
Endwhile
' tmp! enthält aktuelle Fehlergrenze
volver 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 ▲ |
|
|
|