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
Die Taylorreihe fuer arccos(t) im punkt 0 ist : (1/2*Pi)-1*t-1/6*t^3-3/40*t^5+O(t^6) Z.
was heißt im punkt 0? und für etwas Genauigkeit sollte nicht bei t hoch 5 Schluß sein
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.
Letztendlich haben PCs auch eine Fließkomma-Einheit, die extra dafür gebaut wurde, sowas schnell ausrechnen zu können.
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é_approximant http://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
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.