www.mikrocontroller.net

Forum: PC-Programmierung acos / arcos Funktion für C


Autor: Sub>serial<X (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: zotti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was heißt im punkt 0?

und für etwas Genauigkeit sollte nicht bei t hoch 5 Schluß sein

Autor: zotti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Sub>serial<X (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: zotti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: zotti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Letztendlich haben PCs auch eine Fließkomma-Einheit, die extra dafür 
gebaut wurde, sowas schnell ausrechnen zu können.

Autor: Johnny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Sub>serial<X (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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
)

Autor: Theo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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/aussa...

http://math.fullerton.edu/mathews/n2003/pade/PadeA...

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


Autor: arc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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.

Autor: Klaus W. (Firma: privat) (texmex)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Klaus W. (Firma: privat) (texmex)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Klaus W. (Firma: privat) (texmex)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.