Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Funktionszeichner Newton hinzufügen...


jensa - Mi 30.11.05 00:06
Titel: Funktionszeichner Newton hinzufügen...
Also ich soll für die Schule als aufgabe dem beigefügten programm das newtonverfahren einbauen wie kann ich das am kleversten machen?! es soll eingezeichnet werden & der wert sollte in nem editfeld ausgegeben werden... kann mir einer tipps geben ?!


Narses - Mi 30.11.05 01:39

Moin!

Wie dir vielleicht schon aufgefallen ist, machen wir hier nicht so gerne Hausaufgaben... :roll: (ja, ich weiß, du hast ja gar nicht explizit danach gefragt, es läuft aber darauf hinaus) :wink:

Wenn du konkrete Probleme oder Fragen hast, dann stell den Code, der das Problem macht, hier rein; es wird sich dann sicher jemand finden, der dir hilft, Fehler zu beseitigen.

cu
Narses


Tilman - Do 01.12.05 18:03

Hi Jensa, hat dir mein programm das ich dir (im andern Forum) per Mail zukommen ließ genutzt?


jensa - Do 01.12.05 18:37

also dein programm hat mir insofern geholfen zu verstehen was ich in etwa bei dem zeichnen2 machen müsste jedoch muss ich hlat dort noch schauen da ich die rbaumder unit nicht verstehe und ich da die abl habe derive_tree und halt noch schauen muss die newton-tangente mit der paint_it procedure auf das label zu zeichnen...
wäre nett wenn einer mir evtl die rbaumder unit aus dem programm zeichnen2
dokumentiert so das es einer versteht der nicht verstanden hat was "bäume" sind und wozu man sie nutzen kann etc:(


Tilman - Do 01.12.05 18:55

Also erstmal hast du mir dein zeichnen2.rar ja schon geschickt, ich hab aber aktuell kein RAR-Programm aufm Rechner weshalb ich nicht nachprüfen kann ob sich da was geändert hat (wenn dus als zip raufstellst guck ichs mir nochmal an).

2. Bäume: Wenn es das ist was ich vermute (Zeigerkonstruktion), dann kann ich dir dazu ein leicht verständliches Beispiel schreiben. Wollte ich ohnehin schonmal für die Library machen.

ABER: ich verstehe beim besten Willen (und ohne deine Sources zu lesen) nicht was man bei dem Problem mit Bäumen will. Höchstens eine Liste könnte man brauchen, die kann man so ähnlich deklarieren. In meinem Beispielprogramm hatte ich die Terme und Ableitungen aber mit dem Typ TList realisiert, der einfachheit halber.

3. Du schreibst das du so manches an deinem Programm nicht vertshest. Hat der lehrer euch die hälfte schon vorgegeben? Was davon hast du selber Programmiert?


jensa - Do 01.12.05 21:29

also wir haben die unit world 2 screen selbst machen müssen und halt das zusammenklicken, die rbaumder unit hat er gemacht und die paint funktion hat er uns so halb (in teamarbeit) miterarbeiten lassen.


delfiphan - So 04.12.05 02:17

Ist das Problem gelöst?
Für die klassische Newton-Methode brauchst du zusätzlich zur Funktion noch die erste Ableitung der Funktion. Ich nehme nicht an, dass Ihr den eingegebenen Term zuerst symbolisch ableiten müsst. Müsst Ihr da eine modifizierte Newton-Methode anwenden, oder eine numerische Ableitung einsetzen?


jensa - So 04.12.05 19:23

ähm problem noch nciht gelöstz, da ich noch nicht durch die rbaumder unit durgestiegen bin, darin steckt bereits die function derive_tree (ableitung der funktion) nur weiß nicht was & wofür die anderen da sind etc.:(


delfiphan - So 04.12.05 21:37

Na wenn's vorgegeben ist, dann ist ja alles klar. Könntest du dein Problem nochmals ganz konkret stellen? ...


Amateur - So 04.12.05 21:43

ich werf einfach mal das stichwort rekursion in die runde... der rest fürs newtonverfahren sollte einfach sein wenn der parser und die ableitung und alles schon steht...
ich wollte sowas auch mal schreiben bin aber beim parser gescheitert weil ich einfach nicht die zeit habe mich in sowas reinzuknien...
aber newton sollte mit ner funktion und rekursion eigentlich recht einfach gehen wenn ihr schon so viele grundlagen mit parser und so habt...


jensa - So 04.12.05 22:24

mein problem: das verstehen der unit rbaumder.pas diese gesamte sache mit bäumen etc ist mir unverständlich und die paint_it methode in der zeichen unit ist mir auch nicht so ganz klar was da geamcht ist und warum es so gelöst ist wenn mir da das einer kommentieren könnte oder erklären könnte wäre super


Tilman - Mo 05.12.05 14:52

Für alle interessierten mal meine Lösung für das Newton-Verfahren (ohne Grafische Ausgaben). Jensa hatte ich diese Lösung schon vor ca. einer Woche geschickt.


jaenicke - Mo 05.12.05 15:15

Auf meiner Homepage steht eine Version mit grafischer Ausgabe:
http://www.sj-berlin.de
(Links unter Delphi -> Projekte, dann NewtonSim in der Liste)

Kleine Warnung: Das Programm habe ich geschrieben, kurz nachdem ich mit Delphi angefangen hatte, die Code-Formatierung ist dementsprechend schlecht...


delfiphan - Mo 05.12.05 15:16

Pseudo-Code für Newton:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
x = x0; // Startwert
tol = 1e-10;
repeat
 lastx = x;
 x = x-AuswertungDerFunktion(x)/AuswertungAbleitungDerFunktion(x);
until abs(x-lastx)<tol;
Funktionen auswerten kannst du ja offenbar, und die Ableitung berechnen auch. Falls du Fragen zum Code deines Lehrers hast, fragst du vielleicht am besten gleich ihn.


jensa - Mo 05.12.05 18:59

hmm danke erstma werd die tage mal schauen im moment hab ich private Angelegenheit aber werd mir das ma von euch hoffenltich hilfreiche zu gemüte führen & euch dann erfolg oder misserfolg mitteilen:)
danke schonma an alle


jensa - So 18.12.05 22:09


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
x = x0; // Startwert
tol = 1e-10;
repeat
 lastx = x;
 x = x-AuswertungDerFunktion(x)/AuswertungAbleitungDerFunktion(x);
until abs(x-lastx)<tol;


dazu habe ich fragen.

x0 ist der Wert, andem man das Newtonverfahren beginnen will?! richitg?!
dann was ist tol? kann mir das einer sagen oder was generell diese zeile bewirken soll?!

auswertungderfunktion = meine procedure/function, mit der ich den y wert eines x wertes finde?!
auswertungAbleitungDerFunktion = die funktion die mir den ableitungswert von f(x) liefert richtig?
und dann soll abs?! (was ist das?) solange gemacht werden, bis abs(xxxx) kleiner ist als die toleranz?!

hab ich das soweit richtig verstanden?!

Moderiert von user profile iconraziel: Quote- durch Delphi-Tags ersetzt


delfiphan - Mo 19.12.05 00:27

abs(x) = |x| = Betrag von x.
In Worten: Wiederhole, bis die Differenz zwischen x und lastx kleiner als eine gegebene Toleranz ist.


jensa - Mo 19.12.05 16:17


Delphi-Quelltext
1:
tol = 1e-10;                    

was heißt das genau okay tol ist ne art toleranz aber was wird da berechnet 1e-10?! ist mir unklar:(
und weiß einer ob ich bei den restlichen Problemen/Fragen richtig liege?


Amateur - Mo 19.12.05 16:56

1e-10 ist das gleiche wie 1 * 10^-10 oder 1 * 1/(10^10) also ne ziemlich kleine zahl.


jensa - Mo 19.12.05 19:41

ausserdem kann es sein das delfiphan anstatt := immer nur = gemacht hat?!


delfiphan - 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):

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 - Mo 19.12.05 23:37


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 - 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 - 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 - 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:)