Rechenverhältnis trigonometrischer Funktionen

8

Ich muss die Funktionen berechnen: und g(x)=sinax

f(x)=Sünde- -1xx
wobeia[0,1]undx[0,π
G(x)=SündeeinxSündex
ein[0,1]]und ist oft sehr klein (x1). Gibt es allgemeine Möglichkeiten, hochgenaue Algorithmen für "spezielle" Funktionen wie diese zu generieren?x[0,π2]]x1
Victor Liu
quelle

Antworten:

9

Wenn Sie eine Polynomerweiterung (a la l'Hopital-Regel) für Enumerator und Nenner durchführen, erhalten Sie eine rationale Funktion, die für kleines x die Funktion gut approximiert.

Als Beispiel:

SündeeinxSündexeinx- -13!(einx)3+x- -13!x3+=ein- -13!ein3x2+1- -13!x2+.

xx0=0x

Wolfgang Bangerth
quelle
4

Mein Ansatz ist es, Software wie SymPy wie folgt zu verwenden:

from sympy import var, sin, S
var("x a")
g = sin(a*x)/sin(x)
gseries = g.series(x, 0, 10).removeO()
s = {x: S(1)/100, a: S(1)/2}
print gseries.subs(s).n(30)
print g.subs(s).n(30)
print "%.17f" % g.subs({x: 1./100, a: 1./2})

welche druckt:

0.500006250065104828565736800905
0.500006250065104828565736868886
0.50000625006510480

Die erste Zahl ist eine Taylorreihenerweiterung, die bei 10 Termen abgeschnitten ist, die zweite Zahl ist die genaue Bewertung. SymPy verwendet exakte Arithmetik. In diesem Beispiel habe ich x = 1/100 und a = 1/2 verwendet, aber damit können Sie spielen. Schließlich bewerte ich es mit 30 Dezimalstellen, damit man die Zahlen leicht vergleichen kann. Die dritte Zahl ist eine Bewertung mit doppelter Genauigkeit unter Verwendung der Python-Floats.

In diesem Fall scheint es mir keine Stornierung zu geben. Bei anderen Ausdrücken ist die direkte Bewertung mit doppelter Genauigkeit möglicherweise nicht genau genug, und die Serienerweiterung ist eine Möglichkeit, sie zu bewerten. Die andere ist die rationale Annäherung, die ich MiniMaxApproximationin der Vergangenheit in Mathematica mit großem Erfolg verwendet habe.

Ondřej Čertík
quelle