Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Nullstellen einer Funktion rekursiv berechnen


dominikb - Do 19.10.06 16:24
Titel: Nullstellen einer Funktion rekursiv berechnen
Hallo zusammen,

ich muss für den Info-Unterricht Nullstellen der Funktion f(x):=(x*x+1)*sin(x)
rekursiv berechnen. Zuerst muss ich ja eine Wertetabelle erstellen in der jedem x ein f(x) zugeordnet wird. Und da wo ein Vorzeichenwechsel stattfindet sind die Nullstellen (so hab ich das glaub ich verstanden) und ich hab keine Ahnung wie ich das mit dem Vorzeichenwechsel hinkriegen soll.

Kann mir da jemand helfen???


Allesquarks - Do 19.10.06 16:27

also die Nullstellen sind bei k*pi wobei k eine ganze Zahl ist also k element Z.
Die Gleichung ist ja schon in Linearfaktoren zerlegt, das ist irgendwie total unlustig.


dominikb - Do 19.10.06 16:34

was???????????????????
bitte kein mathe...
ich brauch ein Lösungsvorschlag...


jaenicke - Do 19.10.06 16:37

@user profile iconAllesquarks
Ja, aber das soll ja mit einem Programm berechnet werden, oder? Dass Ausrechnen kein Problem ist, ist ne ganz andere Sache...

Ich häng mal ein Programm von mir an, das ich vor Jahren geschrieben habe. Es ist eine Implementierung des Newton-Verfahrens. Der Quelltext sieht zwar total unordentlich aus, weil ich da noch nicht lange programmiert habe, aber naja.

Das Newton-Verfahren berechnet Nullstellen rekursiv.


Allesquarks - Do 19.10.06 16:39

Hast du doch schon gesagt: Wenn davor positiv und danach negativ dann Nullstelle. Wenn das nicht deine erste Informatikstunde ist oder du noch kein Englisch hattest ist das eine Anleitung.


dominikb - Do 19.10.06 16:42

@ Allesquarks: Ich weiß nicht wie ich das in Pascal "ausdrücken" soll, das ist mein Problem...


jaenicke - Do 19.10.06 16:44

user profile iconAllesquarks hat folgendes geschrieben:
Hast du doch schon gesagt: Wenn davor positiv und danach negativ dann Nullstelle. Wenn das nicht deine erste Informatikstunde ist oder du noch kein Englisch hattest ist das eine Anleitung.

Naja, aber man muss ja auch irgendwoher die Teststellen finden. Deshalb mein auch mein Beispiel mit Newton, das benutzt zwar Ableitungen und probiert nicht einfach aus, aber es ist ein Beispiel wie man von einer Teststelle zur nächsten kommt.

In diesem Fall würde man zwei beliebige Stellen suchen, wo der Funktionswert einmal negativ, einmal positiv ist. Dann würde ich die Mitte prüfen und entweder rechts oder links davon weitersuchen, je nachdem wo die Nullstelle liegt.


dominikb - Do 19.10.06 16:53

damit kann ich ehrlich gesagt nix anfangen, ist viel zu kompliziert für mich.
Ich schreib mal was ich in der Schule von der Tafel übernommen hab:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
implemetation

Function f(x:extended):extended;
Begin
  f:=(x*x+1)*sin(x);
End;

Procedure Wertetabelle(anfang,ende,schrittweite:extended); //Schrittweite:1/10
Begin
//Hausaufgabe

If vzw(f(x),f(x+schrittweite) then
Function vzw(x1,x2:extended):Boolean
Begin
  vzw:=x1*x2<0 // merke hier grade das vzw schon geschrieben ist, brauche also noch            
End;                  die Wertetabelle, die ich auch nich kann...


Moderiert von user profile iconTino: Delphi-Tags hinzugefügt


jaenicke - Do 19.10.06 17:28

Also da wüsste ich jetzt nicht, wie das rekursiv gehen soll...

Bei einer Rekursion gehe ich von Startwerten (hier zweien) aus und rufe dann eine Funktion immer wieder auf.
Also:
Ich nehme beispielsweise x1 = -10 und x2 = 10. Die beiden Werte müssen so gewählt werden, dass f(x1) < 0 und f(x2) > 0.
Die beiden Werte übergebe ich an eine Funktion.
Dann sehe ich nach, ob f(x1 + (x2 - x1) / 2) > 0 ist, das ist ja genau zwischen x1 und x2. Wenn ja, dann is die Nullstelle links davon, sonst rechts. (Gleich 0 musst du natürlich auch testen ;-))
Ist die Nullstelle links davon, dann rufe ich die Funktion wieder mit (x1, x1 + (x2 - x1) / 2) auf, sonst mit (x1 + (x2 - x1) / 2, x2).
Das mache ich so lange bis Abs(f(x1)) < 0,01. (Der Funktionswert also nur noch 0,01 von 0 entfernt ist.)
Dann gebe ich x1 zurück...

Ggf. muss natürlich der linke Funktionswert statt kleiner als Null größer als Null und der rechte kleiner statt größer als Null sein.