Autor Beitrag
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Mo 19.12.05 19:59 
- Das oben war Pseudo-Code; kein Delphi.
- 1e-10 = 0.0000000001

Die Abbruchbedingung verdeutscht: Falls sich bei der Berechnung fast nichts mehr ändert (Änderung kleiner als eine Toleranz), dann wird abgebrochen.

Kleines Programmbeispiel, welches mittels Newton die Wurzel von 2 berechnet (in diesem Fall auch Heron-Verfahren genannt):
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TForm1.Button1Click(Sender: TObject);
 function f(x: Extended): Extended;
 begin
   Result := x*x-2// Von dieser Funktion soll eine Nullstelle gefunden werden
 end;
 function df(x: Extended): Extended;
 begin
   Result := 2*x; // Ableitung von x^2-2
 end;
const
 tol = 1e-10;
var
 x, lastx: Extended;
begin
  x := 2;
  repeat
   lastx := x;
   x := x-f(x)/df(x);
  until abs(x-lastx)<tol;
  ShowMessage('Eine Nullstelle von x*x-2=0 ist an der Stelle '+FloatToStr(x));
end;
Anmerkung: Der Newton funktioniert in dieser Form nur für einfache Nullstellen. Ansonsten braucht's einen Vorfaktor vor f(x)/df(x) (der Vorfaktor enstpricht der Häufigkeit der Nullstelle).
jensa Threadstarter
Hält's aus hier
Beiträge: 12

Windows XP Pro; Debian Sarge
Delphi, TurboPascal, PHP (Eclipse)
BeitragVerfasst: Mo 19.12.05 23:37 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.Button5Click(Sender: TObject);
var x0:Double;
var tol:Double;
var lastx:Double;
begin
tryfunction;
x0:=strtofloat(Edit10.Text);
x := x0; // Startwert
tol := 1e-10;
repeat
 lastx := x;
x := x-FX(fwurzel,x)/<span style="color: red">derive_tree(x)</span>;   {  x:=x-f(x)/f'(x)  }
until abs(x-lastx)<tol;
Form1.Edit11.Text:=floattostr(x);
end;

Beim rotmarkierten Bereich macht er im moment noch einen fehler/
Zitat:
[Fehler] zeichnen.pas(319): Inkompatible Typen: 'Real' und 'fzeigertyp'


woran liegt es?

FX
function FX(fwurzel:fzeigerTyp; x:extended) : extended;

derive_tree
function derive_tree(fWurzel:Fzeigertyp): fzeigertyp;
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Di 20.12.05 03:37 
Probier mal statt x := x-FX(fwurzel,x)/derive_tree(x); folgendes: x := x-FX(fwurzel,x)/FX(derive_tree(fwurzel),x);.
jensa Threadstarter
Hält's aus hier
Beiträge: 12

Windows XP Pro; Debian Sarge
Delphi, TurboPascal, PHP (Eclipse)
BeitragVerfasst: Mo 02.01.06 13:57 
hey danke das klappt jetzt also die Steigung bekomme ich jetzt schonma heraus, jetzt muss ich nur noch versuchen das mit der zeichenroutine von meinem lehrer zeichnen zu lassen:(
jensa Threadstarter
Hält's aus hier
Beiträge: 12

Windows XP Pro; Debian Sarge
Delphi, TurboPascal, PHP (Eclipse)
BeitragVerfasst: Fr 06.01.06 19:24 
also wollte nur mitteilen das mein programm jetzt fertig ist, hab es nun endlich geschafft
die exe unten einmal anschaubar.
evtl hilfts ja dem ein oder anderem ma in mathe:)
Einloggen, um Attachments anzusehen!