Hallo,
ich hoffe mal das mir hier jemand helfen kann.
Ich suche eine Funktion um den arcus cosinus in ANSI C zu berechnen.
Die in C integrierte Funktion ist leider zu langsam.
Sie sollte über die Taylor Reihe funktionieren.
Krieg das irgendwie nicht hin sowas zu schreiben.
Vielleicht hat ja hier jemand eine Idee.
Schonmal THX
Nun, eine Taylorreihe kann man in jedem Punkt entwickeln.
Um die Anzahl benoetigter Terme zu bestimmen muss man eine Genauigkeit
vorgeben. Wie genau soll's denn sein ?
Z.
Hallo,
also estmal danke für die Mühe.
Die exakt benötigte Genauigkeit ergibt sich erst im Einsatz aber bist
t^9 müsste sie gehen.
Allerdings die mathematische Funktion hab ich (etwas anders aufgebaut)
arcos (t) = pi/2- (t + 1/6t^3 + 3/40t^5 + 5/112t^7 + 35/1152t^9)
Mein Problem ist das ich das nicht in eine C Funktion umgebaut kriege.
Fänd es supi wenn hier jemand wüsste wie man das in C-Quellcode
ausdrückt.
Ja, das sollte in der Tat etwas optimiert werden. Die Formel enthaelt
zuviele Multiplikationen. Stichwort Hornerschema. Mit C hat das ganze
gar nichts zu tun. Sollte aber trivial sein.
Z.
Und hinten nach wirst du feststellen,
dass das auch nicht schneller als der mitgelieferte acos()
ist.
Warum glaubt eigentlich jeder Newbie dass die Entwickler
seiner Standardbibliothek alle Vollidioten sind und
sie das vieel besser könnten, wenn sie erst mal die
trivialsten Dinge der Sprache begriffen haben.
Wenn du Probleme mit der Laufzeit hast, dann musst du in
erster Linie versuchen den acos() grundsätzlich wegzukriegen.
Viele Winkelfunktionen können durch mehr Wissen über Geometrie
im Allgemeinen und Vektorrechnung im Speziellen umschifft werden.
Es gibt natürlich auch Ausnahmen. Zb. im User Interface kommt
man meist um Winkelfunktionen nicht rum. Aber ansonsten braucht
man Winkelfunktionen in 3D Euklidscher Geometrie eher selten,
weil man an vielen Stellen die Winkel zwischen verschiedenen
Dingen gar nicht explizit ausrechnen muss.
Schneller als die Standardbibliothek wird man erst wenn man auf
Genaugigkeit verzichtet wo sie nicht benoetigt wird. Oder wenn man nicht
den ganzen Wertebereich benoetigt.
Z.
Du kannst auch eine Lookup Table machen. Meist braucht man die
Genauigkeit wirklich nicht. Aber kommt halt auf die Anwendung an. Am
besten erst simulieren oder testen, obs die vereinfachte Version auch
tut.
Also,
nen Newbie bin ich nun nicht unbedingt.
Trotzdem danke für die Antworten.
Naja hab das Ganze jetzt anders gelöst und zwar über einen LUT, und
diese Variante IST schneller als die integrierte Funktion.
die Genauigkeit reicht für meine Zwecke mit 4 Nachkommastellen sowieso
voll und ganz.
Nebenbei brauche ich das ganze für eine Kantenberechnung und Verfolgung
und da geht es leider nicht anders.
Achja das System wo es jetzt drauf läuft ist a ein Embedded System und
kann b nur integer Zahlen berechnen.
Bevor sich jetzt wieder jemand wundert...einfach das Komma um vier
Stellen nach rechts verschoben und schon is aus ner Flieskomma Zahl ne
Integer geworden.
Trotdem mal THX für die sinnigen unter den Antworten.
> Nebenbei brauche ich das ganze für eine Kantenberechnung und> Verfolgung und da geht es leider nicht anders.
klingt nach einem geometrischen Problem.
Wenn du mir mehr erzählst: Ev. kenne ich einen
geometrischen Trick mit dem das ganze einfacher
und schneller zu Berechnenn geht.
(Ich hab da jetzt im Hinterkopf
Gegeben im 2D 2 Kanten die aneinanderstossen.
Gesucht: Ist das eine Rechts-Abbiegung oder eine
Linksabbiegung, wenn man von oben auf
die Ebene schaut
Sowas könnte man zb. mit einem Kreuzprodukt im 3D
ziemlich leicht lösen. Läuft auf 2 Multiplikationen
und eine Subtraktion hinaus
)
@Karl heinz Buchegger
Erstmal hast du recht im ersten Artikel.
Einmal gibts die Möglichkeit die Taylorreihe via Hornerschema zu
berechnen, was schonmal die Potenzfunktion pow() überfüssig macht, denn
die kostet satt Zeit.
Es gibt aber noch eine Alternative, die ich auch kürzlich erst fand und
die seltsamer weise nicht nicht den üblichen Ing-Mathebüchern steht,
warum ist mir nen Rätsel........
Die Pade-Approximation ist bei weitem genauer als Taylorreihen, obwohl
sie im Regelfall aus einer Taylorreihe entwickelt wird. Wenn man z.B.
e^x auf 10 Stellen haben möchte muss man die Reihe bis ca. x^30
ansetzen.
Pade formt daraus eine gebrochen rationale Funktion Z(x)/N(x) mit
deutlich niedrigerem Grade. Pade-Approximationen schmiegen sich auch
über längere Strecken sehr viel genauer an die Originalfunktion an als
es die Taylorreihe macht.
http://en.wikipedia.org/wiki/Padé_approximanthttp://mo.mathematik.uni-stuttgart.de/inhalt/aussage/aussage152/http://math.fullerton.edu/mathews/n2003/pade/PadeApproximationMod/Links/PadeApproximationMod_lnk_2.html
Ich glaube in deutsch findet man was im Buch von HÄUSER - Analysis.
Anch Pade gibts auch noch die Kettenbruchentwicklung die aber PADE als
Zwischenschritt voraussetzt. Die Konvrgenz istz bei weitem höher als bei
Taylor oder Pade aber eben nicht sooo... einfach zu entwickeln. Man kann
sich ein CAS-System besorgen z.B. Mupad-Light (feier download) und so
eine Kettenbruchentwicklung machen und diese dann in C umsetzen.
Theo
> Man kann sich ein CAS-System besorgen z.B. Mupad-Light (feier download) und> so eine Kettenbruchentwicklung machen und diese dann in C umsetzen.
MuPAD ist seit Ende 2005 nicht mehr frei erhältlich.
Eine freie Variante die auch die Padé-Approximation kennt wäre z.B.
Maxima bzw. mit GUI wxMaxima.
Hallo!
Also erstmal Kompliment an Karl Heinz, dass er sich immer so viel Zeit
nimmt, vermutlich grundsätzlich eher triviale Anfragen zu beantworten.
Karl heinz Buchegger schrieb:
> Viele Winkelfunktionen können durch mehr Wissen über Geometrie> im Allgemeinen und Vektorrechnung im Speziellen umschifft werden.
Ja, ich habe nach intensivem Nachdenken auch bemerkt, dass ich mein
Problem alleine mit Sklar- und Vektorprodukten lösen kann und gar keine
Trigonometrie brauche.
Eine klitzekleine Quadratwurzel bleibt aber doch.
Im Prizip geht es nur um Drehstreckungen von Vektoren. Da oftmals schon
einige Zielpunkte der Abbildung bekannt sind, interessiert mich der
tatsächliche Drehwinkel garnicht. Das Ähnlichkeitsverhältnis muss ich
zwar auch nicht explizit ausrechnen, trotzdem ergibt sich für die
Komponenten der Zielvektoren eine Wurzel.
Ich schätze dass sich das mathematisch nicht vermeiden lässt?
Aber nur deshalb Fließkommazahlen zu verwenden ist auch nicht schön.
Vermutlich gibt es da aber auch keine Alternative?
viele Grüße,
Klaus
Klaus W. schrieb:
> Ich schätze dass sich das mathematisch nicht vermeiden lässt?
Das ist leider die einzige Operation, die man aus Vektoralgebra nicht
rauskriegt. In fast allen Dingen kommt irgendwo die Länge des Vektors
vor und sei es nur um den Vektor auf Einheitslänge zu bringen. Und da
ist die Wurzel so gut wie unvermeidbar.
Karl heinz Buchegger schrieb:
> Das ist leider die einzige Operation, die man aus Vektoralgebra nicht> rauskriegt. In fast allen Dingen kommt irgendwo die Länge des Vektors> vor und sei es nur um den Vektor auf Einheitslänge zu bringen. Und da> ist die Wurzel so gut wie unvermeidbar.
Ok, dann bin ich wohl zumindest nicht ganz auf dem Holzweg.
Vielen Dank!
Blöd ist auch noch, dass durch das Wurzelziehen immer irgendwo ein
Quadrat wegfällt (welches letztendlich von irgendeinem Pythagoras
stammt) und damit auch eine Lösung verschwindet, die man später wieder
irgendwie reinbasteln muss.
Aus den Vorzeichen der Vektorprodukte kann ich zwar die richtige Lösung
erkennen, aber das ist auch unhandlich weil man eine Fallunterscheidung
machen muss. Dummerweise ist der Betrag des Vektorprodukts ja das
Produkt der Beträge der Vektoren (wenn sie senkrecht aufeinander stehen)
und nicht der Quotient.
Aber gut, das ist nun wirklich ein rein geometrisches Problem über dem
ich noch etwas grübeln kann.
Viele Grüße,
Klaus
Klaus W. schrieb:
> Aber gut, das ist nun wirklich ein rein geometrisches Problem über dem> ich noch etwas grübeln kann.
Was ist jetzt eigentlich dein geometrisches Problem?
Karl heinz Buchegger schrieb:
> Klaus W. schrieb:>>> Aber gut, das ist nun wirklich ein rein geometrisches Problem über dem>> ich noch etwas grübeln kann.>> Was ist jetzt eigentlich dein geometrisches Problem?
Hm, also wenn man das auf die Kernproblematik reduziert sieht's so aus:
Gegeben sind zwei Vektoren mit gemeinsamen Fußpunkt. Das fasse ich als
Beschreibung einer Drehstreckung auf. An der Spitze des ersten Vektors
befinden sich mehrere zu ihm senkrechte Vektoren, die mit abgebildet
werden sollen. Ich suche eigentlich nur die Abbildung dieser senkrechten
Vektoren.
Sicher nicht sehr schwierig, aber eine besondere Leuchte in Mathe bin
ich nun nicht. Aber funktioniert ja auch. Abgesehen von der
Wurzelproblematik :-).
Viele Grüße,
Klaus
Ohne Wurzel krieg ich das auch nicht hin :-)
Aber ich merke gerade, dass meine Abhandlung dazu etwas länger ausfallen
wird und ich muss jetzt weg.
Nur soviel. Der Weg geht über 2D-Transformations-Matrizen