Implementation von ln(x) in C < Numerik < Hochschule < Mathe < Vorhilfe
|
Status: |
(Frage) reagiert/warte auf Reaktion | Datum: | 00:40 Mi 01.12.2004 | Autor: | hochl |
Hallo,
Ich will einige der bekannteren und haeufig benoetigten Mathefunktionen in C implementieren. Bei $ [mm] e^x [/mm] $, $ sin(x) $ und $ cos(x) $ habe ich mit der Taylorentwicklung ganz gute Ergebnisse bekommen. [mm] \wurzel[n]{x} [/mm] ist mit Newton auch einfach loesbar. Leider fehlt mir fuer den natuerlichen Logarithmus noch ein gutes Berechnungsschema. Deshalb meine Frage: Hat jemand einen Link wo fuer verschiedene Funktionen gute Berechnungsverfahren vorgestellt werden, am besten mit Fehlerabschaetzung damit man weiss bis wieviele Iterationen man rechnen muss um unterhalb einer gewissen Fehlerschranke zu bleiben? Das waere sehr hilfreich! :) Danke bereits im vorraus!
Ich habe diese Frage in keinem Forum auf anderen Internetseiten gestellt.
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 03:53 Do 02.12.2004 | Autor: | Marc |
Hallo hochl,
> Ich will einige der bekannteren und haeufig benoetigten
> Mathefunktionen in C implementieren. Bei [mm]e^x [/mm], [mm]sin(x)[/mm] und
> [mm]cos(x)[/mm] habe ich mit der Taylorentwicklung ganz gute
> Ergebnisse bekommen. [mm]\wurzel[n]{x}[/mm] ist mit Newton auch
> einfach loesbar. Leider fehlt mir fuer den natuerlichen
> Logarithmus noch ein gutes Berechnungsschema.
In meiner (Schul-) Formelsammlung steht die Reihe:
[mm] $\ln x=2*\summe_{k=0}^{\infty}\left(\bruch{x-1}{x+1}\right)^{2k+1}$
[/mm]
Ich denke mal, dass sich das aus der Taylorentwicklung herleiten läßt, ich hoffe, mit Fehlerabschätzung.
> Deshalb meine
> Frage: Hat jemand einen Link wo fuer verschiedene
> Funktionen gute Berechnungsverfahren vorgestellt werden, am
> besten mit Fehlerabschaetzung damit man weiss bis wieviele
> Iterationen man rechnen muss um unterhalb einer gewissen
> Fehlerschranke zu bleiben? Das waere sehr hilfreich! :)
> Danke bereits im vorraus!
Im Internet gesucht haben wirst du ja wahrscheinlich selbst.
In den Unibibliotheken gibt es bestimmt für alle möglichen numerische Verfahren Programmierbeispiele, jedenfalls habe ich mal so etwas von einer Professorin aus Berlin in PASCAL in der Hand gehalten.
Ansonsten könntest du dir auch die entsprechenden Quelltexte von einer math-library besorgen, im Linux-Kernel habe ich entsprechendes für den logarithmus zur Basis 2 gefunden.
Viele Grüße,
Marc
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 00:25 Mo 06.12.2004 | Autor: | hochl |
Nein, ich habe mit Taylor diese hergeleitet (und nochmal auf mathworld nachgeblaettert):
[mm] ln(x+1)=x-1/2*x^2+1/3*x^3-1/4*x^4+...
[/mm]
Leider ist die Reihe nicht sonderlich gut geeignet zum ausrechnen, sie konvergiert nicht so schoen und schnell wie die z.B. fuer [mm] e^x. [/mm] In den Quellen der Libmath habe ich nachgeschaut, leider ist der Code ziemlich unuebersichtlich und es ist irgendwie nicht klar wie der Author auf seinen Loesungsweg kommt.
Es gibt doch sicher irgendwie Literatur zu dem Thema, ich habe etwas gesucht aber einfach nichts gefunden, ich bin mir aber sicher dass es da bestimmt was gibt und ich es nur nicht finden konnte bis jetzt. Trotzdem danke fuer die Antwort :)
Hat noch jemand ne Idee?
|
|
|
|
|
Hallo hochl,
ich hätte auch zunächst die ln(1+x)-Reihe vorgeschlagen, aber die konvergiert echt sehr schlecht.
Was hältst du davon, wenn du statt y=ln(x) zu berechnen, die Gleichung
exp(y)=x mit dem Newton-Verfahren löst. Da die Ableitung ja auch exp(x) ist, muss du diese Berechnung ja einmal pro Schritt durchführen. Und exp(x) ist linksgekrümmt ohne Extrema, so dass das Verfahren garantiert konvergiert.
Hugo
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 23:33 Mi 15.12.2004 | Autor: | hochl |
Man kann das Argument durch Division mit e nach [-1/2, 1.2] skalieren, da konvergiert sie einigermassen. Aber so besonders schoen finde ich das nicht.
|
|
|
|
|
Hallo hochl, du sprichst doch jetzt von der Taylor-Reihe von ln(1+x), oder?
Hast du mal meinen Vorschlag ausprobiert, und die Nullstelle von f(x)=exp(x)-ARG gesucht? Das ist ja das gleiche Nullstelle wie von x-ln(ARG), nur leichter berechenbar.
(Wenn du x=ln(ARG) berechnen möchtest.)
Hugo
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 13:32 Do 16.12.2004 | Autor: | hochl |
Ja, was besseres als Taylor hab ich noch nicht gefunden, leider. Ok man koennte es mit nem Spline annaehern, aber so richtig gluecklich macht mich das jetzt auch nicht. Das mit Newton und exp(x)-ARG ist leider nicht so gut, weil man ja fuer jede Iteration dann die Exponentialreihe ausrechnen muss, das will ich eigentlich vermeiden weil's extrem lahm wird. Aber klar, das waere schonmal ne Notloesung und muesste gehn (f'(x) und f''(x) beide > 0). Was mir noch in den Sinn kam: Gibt's vielleicht ne geschickte Moeglichkeit wasm it nem Wavelet zu machen? Damit habe ich noch nie was gemacht, aber das kann man doch auch nehmen wenn man ein paar Punkte kennt und damit die Funktion annaehern will.
|
|
|
|
|
Ich fürchte, ich kann dir bei deinem Problem auch nicht richtig weiterhelfen... schade. Allerdings rate ich dir von allzu komplizierten Kostruktionen ab, das ist dann sicher auch zu rechenintensiv.
Hugo
|
|
|
|
|
Hallo hochl,
Zunächst: Hier kann ich auch nur Ansätze liefern. Durch e teilen bedeutet ja im bildbereich der Funktion minus eins abziehen also teile solange durch e(bzw. [mm] \wurzel{e} [/mm] ...) bis du in einem Bereich schöner Konvergenz deiner Reihe landest. Falls es nichts macht einige Funktionswerte parat(gespeichert) zu haben kannst Du natürlich auch Splines nehmen. Aufgrund der hohen Glattheit(x>1) der ln funktion sollten diese ausreichend sein Wavelets braucht man wohl für was anderes (z.B. Bildverarbeitung oder DGL)
gruß
mathemaduenn
|
|
|
|