Bisektion - Ein Verfahren zur Nullstellenberechnung
8. Mai 2006, 12:55
BITTE NICHT ZURÜCKSCHRECKEN VOR DEM LANGEN TEXT IST SEHR WICHTIG!!!!
Hallo an alle!
Ich komme hier echt ins schwitzen und weiß nicht mehr weiter...
Und zwar habe ich die Aufgabe bis zum 15.5.2006 ein Delphi Programm abzugeben,
bei dem das Verfahren der Bisektion angewandt wird um die Nullsetllen zu berechnen...
Unten habe ich als Dateianhang ein Screenshot meines Programmes gemacht...
Das einzige Problem ist das ich den "Rechne"- Button nicht hinbekomme...
Naja was soll ich genau machen? Ich versuch es mal zu erklären und ich hoffe, dass mir dann jemand weiterhelfen kann!
Also wie man auf dem Bild erkennen kann ist das Programm nur für Funktionen bis zum 4. Grad gedacht...
Die ersten 5 Edit Felder sind halt für die Eingabe der Funktion...
Die 2 darunter sind für die Intervallgrenzen
Variablen habe ich so definiert:
a,b,c,d,e,f,g,y,z,:double; //a=Intervallgrenze links; b=Intervallgrenze rechts; c,d,e,f,g=Zahlen in den Edit-Feldern der Funktion; y,z=y-Werte
So wenn man die Funktionswerte und die Intervallgrenzen eingesetz hat soll der Rechnen...
Dazu soll der die Intervallgrenzen a und b jeweils in die Funktion einsetzen...
Dazu habe ich die Variablen y und z definiert (siehe oben)
Das sieht im Programm dann so aus:
a:=strtofloat(edit6.Text); //a bekommt die Zahl aus dem Edit6-Feld zugeordnet
b:=strtofloat(edit7.Text); //b bekommt die Zahl aus dem Edit7-Feld zugeordnet
c:=strtofloat(edit1.Text); //c bekommt die Zahl aus dem Edit1-Feld zugeordnet
d:=strtofloat(edit2.Text); //d bekommt die Zahl aus dem Edit2-Feld zugeordnet
e:=strtofloat(edit3.Text); //e bekommt die Zahl aus dem Edit3-Feld zugeordnet
f:=strtofloat(edit4.Text); //f bekommt die Zahl aus dem Edit4-Feld zugeordnet
g:=strtofloat(edit5.Text); //g bekommt die Zahl aus dem Edit5-Feld zugeordnet
y:=(c*a*a*a*a)+(d*a*a*a)+(e*a*a)+(f*a)+(g);
z:=(c*b*b*b*b)+(d*b*b*b)+(e*b*b)+(f*b)+(g);
So bin hier hin hab ich kein Problem!
So jetzt setzt der die Werte ja bei y und z ein un rechnet das... Dann hat er für y und z zwei Werte die er auf die Vorzeichen untersuchen soll.... Also Positiv oder Negativ...
Das hab ich so gemacht...
if (y>0) and (z<0) or (z>0) and (y<0) then <-- wenn dieses Zutrifft soll er weiterrechnen, indem er das Intervall von a und b teilt....
also: (a+b)/2...
So für diese Intervalltrennung hab ich auch ne Variable p definiert!
also p:=((a+b)/2)
So und dieses p soll er jetzt wieder mit y und z vergleichen...
Wenn dieses dann wieder unterschiedliche Vorzeichen haben soll der das Intervall wieder teilen und wieder auf die Vorzeichen überprüfen und immer so weiter...
Hier fangen die Probleme an! Ich hab keine Ahnung wie ich das im Programm machen soll... Irgendwie mit einer Schleifenform...
Die Schleife muss das intervall immerteilen und das neue P mit den werten davor vergleichen!
Re: Bisektion - Ein Verfahren zur Nullstellenberechnung
8. Mai 2006, 13:41
Grundsätzlich solltest du erst mal den Algorithmus verstanden haben. http://de.wikipedia.org/wiki/Bisektion
Schau dir das Bild an; so wird's einfach verständlich.
Du hast 3 Dinge:
eine Funktion und ein linker und ein rechter Wert.
du beginnst z.B. mit den Grenzen -100 und +100.
Dann wird der Algorithmus so oft angewandt, bis die linke und die rechte Grenze fast gleich sind
oder der Funktionswert 0 ist.
Re: Bisektion - Ein Verfahren zur Nullstellenberechnung
8. Mai 2006, 18:35
So wie ich das verstanden habe, kann man laut diesem Verfahren kann man immer nur eine Nullstelle berechnen.
Wenn das Intervall jedoch 2 Nullstellen beinhaltet kann es zu Fehlern kommen, weil er nämlich aufhört wenn er eine gefunden hat.
function Bisektion(var a, b: double):integer; var
F_a : double; // weitere Variablen begin
result := 0;
F_a := Funcwert(a);
F_b := Funcwert(b);
if Sign(a)=sign(b) then// Vorzeichen vergleichen begin
result := -10;
exit; // gleiches Vorzeichen end;
while(a < b) do begin
Result := Result + 1; // Anzahl der Durchläufe
p := (a+b) / 2; //
F_p := Funcwert(p); if Abs(F_p) < 0.000001 then begin // Nullstelle gefunden
a := p; // in a und in b liegt dann der X-Wert der Nullstelle
b := p;
exit; end;
// so jetzt hab ich dir fast alles hingeschrieben // der Rest ist deine Hausaufgabe // du hast 3 Y-Werte (F_a, F_b, F_p) // jetzt muss du nur noch kucken wie die Vorzeichen sind // und dann entweder a oder b verändern // nicht vergessen, F_a oder F_b auch zu ändern end;
function Horner(x: Extended; coeff: arrayof Integer): Extended; var
i: Integer; begin
Result := 0; for i := Low(coeff) to High(coeff) do
Result := Result * x + coeff[i]; end;
So berechnet man Funktionswerte für Polynome. Die Koeffizienten werden mit absteigendem Grad übergeben. Für die Funktion f(x) = 4x^3 - 10x und x = 2 liefert Horner(2, [4, 0, -10, 0]) den hoffentlich korrekten Funktionswert (12). Das Horner-Schema solltest du aus der Schule kennen.
Re: Bisektion - Ein Verfahren zur Nullstellenberechnung
9. Mai 2006, 06:42
Das Hornersche Schema hatten wir in der 11. Klasse, aber nur so nebenbei.
Das Hornersche Schema ist eigentlich die Vereinfachung der Polynomdivision (zumindest haben wir es als alternative dazu kennengelernt und ich finde es wesentlich einfacher und schneller in der Durchführung).
D.h. wenn man eine Nullstelle kennt, kann man dieses Schema mit dieser Nullstelle anwenden und dann wird die Funktionsgleichung um diese Nullstelle "ärmer", aber dadurch auch einfacher! Irgendwann ist es nur noch eine quadratische Gleichung und man kann über die Diskreminante rechnen.
Marabus Source kann man zwar so nicht benutzen, um die Gleichung zu vereinfachen, aber ich denke mal, dass ich bis heute Nachmittag (wenn sich bis dahin nicht noch jemand anderes gefunden hat) dir einen kleinen Text schreiben kann.