FB18 - Das Forum für Informatik

fb18.de / Diplom Informatik / Unterbereich Grundstudium / Praktische Informatik

Scheme - Skript [deriv]! Dringend schnelle HILFE!!!!!

Scheme - Skript [deriv]! Dringend schnelle HILFE!!!!! 2003-02-16 11:57
Frischling
Hi Leute,

die Funktionen Höherer Ordnung machen mich noch fertig:

im Scheme-Skriptteil C, steht zu Anfang diese nette Funktion, die ich einfach nicht nachvollziehen kann:

(define (deriv f)
(let ((dx 0.00001))
(lambda (x)
(/(- (f(+ x dx)) (f x))
dx))))
(define sin' (deriv sin))
>(sin' 0) => 0.9999999983333334

Also eigentlich müßte f doch in diesem Fall (sin 0) sein oder?
lambda (x) müßte lambda (dx) sein, also müßte das ganze in etwa so berechnet worden sein

((deriv sin)0)

(let ((dx 0.00001))
(lambda (0.00001)
(/(-((sin 0(+ 0.00001 0.00001))((sin 0) 0.00001))

So komme ich aber nicht auf das gleiche Ergbnis!

Ist hier eine Rekursion am Start? Wenn ja, wo ist der Rekursionabschluß?

Wie Ihr sehen könnt, hab ich bei dieser Funktion überhaupt kein durch Blick, kann mir jemand von Euch den dahinter steckenden Berechnungsweg erklären. Quasi ein besseres TRACE liefern als Scheme!

LG und Danke Frischling

Re: Scheme - Skript [deriv]! Dringend schnelle HILFE!!!!! 2003-02-16 13:06
Zaphod
So.
Die Funktion deriv liefert zu einer übergebenen Funktion die Ableitungsfunktion. Wie du sicherlich irgendwann mal glernt hast, ist die Ableitung an einer Stelle
lim (f(x)-f(x0)) / (x-x0) für x->x0)

Hier wird jetzt x-x0 = dx = 0.00001 gesetzt, was einigermaßen genau ist. Anschließend wird als Funktionswert die Funktion (!) (Lambda-Ausdruck) (f(x)-f(x0)) /(x-x0) zurückgegeben, wobei f(x0) = f(x + dx) ist.
Bis hierhin ist das alles unabhängig von der Funktion, die man ja erst als Paramater übergeben bekommt.

Anschließend definiert man sich die Ableitungsfunktoin der Sinusfunktion (wobei ich icht weiß, ob man die sin' nennen darf, da das ' eigentlich eine andere Bedeutung in Scheme hat… bei mir klappt das nur, wenn ich das ' durch eine 1 o.ä. ersetze.) Jetzt kann man sin' als ganz normale Funktin aufrufen.

Und das Ergebnis stimmt auch ungefähr. (sin' 0 = cos 0 = 1, die Ungenauigkeit ergibt sich daraus, das 0.00001 = dx eben nicht beliebig klein ist.)

Mit Rekursion hat das ganze nichts zu tun, da die Funktion sich selbst an keiner Stelle aufruft.

Ich hoffe, ich konnte dir helfen, und hab dich nicht noch mehr verwirrt [img]http://www.fb18.de/gfx/22.gif[/img]

Re: Scheme - Skript [deriv]! Dringend schnelle HILFE!!!!! 2003-02-16 15:32
Frischling
Na geholfen hat das auf jeden Fall einbißchen (Die Ableitung von Funktionen ist bei mir lange her, aber da lässt es sich wieder reinfuchsen).

Ich glaube, dass das in Scheme eh nur ein Beispiel war und das die uns bei der geringen Zeit nun nicht auch noch so eine Funktion wie deriv schreiben lassen.

Das mit sin' klappt bei mir im Scheme-Interpreter auch nicht, ist halt unschön im Skript gemacht!

LG und Danke Frischling

Re: Scheme - Skript [deriv]! Dringend schnelle HILFE!!!!! 2003-02-17 02:34
MoKrates
Und das Ergebnis stimmt auch ungefähr. (sin' 0 = cos 0 = 1, die Ungenauigkeit ergibt sich daraus, das 0.00001 = dx eben nicht beliebig klein ist.)

Doch, doch, dx ist sozusagen gleich epsilon [img]http://www.fb18.de/gfx/7.gif[/img]. Allerdings wird hier kein Grenzwert gebildet fuer beliebig viel kleinere dx…

Sorry Zaphod, Du bist so gut, ich kann nur noch an Deiner Ausdrucksweise maekeln…

laughing… MoKrates

Re: Scheme - Skript [deriv]! Dringend schnelle HILFE!!!!! 2003-02-17 14:00
Zaphod
Ich verstehe nicht, was es da zu mäkeln gibt…?


Re: Scheme - Skript [deriv]! Dringend schnelle HILFE!!!!! 2003-02-17 14:13
Tzwoenn
Es geht ihm da wahrscheinlich ums Prinzip…