AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Bisektion - Ein Verfahren zur Nullstellenberechnung
Thema durchsuchen
Ansicht
Themen-Optionen

Bisektion - Ein Verfahren zur Nullstellenberechnung

Ein Thema von moertymoo · begonnen am 8. Mai 2006 · letzter Beitrag vom 9. Mai 2006
Antwort Antwort
Seite 1 von 2  1 2      
moertymoo

Registriert seit: 8. Mai 2006
12 Beiträge
 
#1

Bisektion - Ein Verfahren zur Nullstellenberechnung

  Alt 8. Mai 2006, 11: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!

Außerdem fehlt mir noch eine Abbruchbedingung!

HOFFE MIR KANN JEMAND HELFEN! DANKE!
Miniaturansicht angehängter Grafiken
bisektion1_113.jpg  
  Mit Zitat antworten Zitat
Flo85

Registriert seit: 25. Apr 2006
23 Beiträge
 
#2

Re: Bisektion - Ein Verfahren zur Nullstellenberechnung

  Alt 8. Mai 2006, 12:34
Ich würde jetzt sagen du brechnest einfach alle nulstellen mit einem geeigneten verfahren

Und dan überprüfst du ob die nullstelle(X-Wert von der nullstelle) im intervall liegt.

Du soltest vieleicht noch festlegen ob die grenzen dazugehören oder nicht!
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#3

Re: Bisektion - Ein Verfahren zur Nullstellenberechnung

  Alt 8. Mai 2006, 12: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.
Andreas
  Mit Zitat antworten Zitat
moertymoo

Registriert seit: 8. Mai 2006
12 Beiträge
 
#4

Re: Bisektion - Ein Verfahren zur Nullstellenberechnung

  Alt 8. Mai 2006, 17:15
das Prinzip hab ich ja verstanden nur das verfahren in delphi zu bekommen ist mein problem..
hat niemand ne ahnung wie ich das machen kann?
  Mit Zitat antworten Zitat
Flare

Registriert seit: 26. Jan 2006
Ort: Leipzig
529 Beiträge
 
Delphi 7 Professional
 
#5

Re: Bisektion - Ein Verfahren zur Nullstellenberechnung

  Alt 8. Mai 2006, 17: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.


Flare
Willy Scheibel
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#6

Re: Bisektion - Ein Verfahren zur Nullstellenberechnung

  Alt 8. Mai 2006, 17:50
Zitat von moertymoo:
das Prinzip hab ich ja verstanden nur das verfahren in delphi zu bekommen ist mein problem..
Das ist doch nicht so schwer.
Delphi-Quellcode:
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;
   
end;
Andreas
  Mit Zitat antworten Zitat
moertymoo

Registriert seit: 8. Mai 2006
12 Beiträge
 
#7

Re: Bisektion - Ein Verfahren zur Nullstellenberechnung

  Alt 8. Mai 2006, 20:18
ich danke dir ich hoffe ich bekomm das jetzt hin
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: Bisektion - Ein Verfahren zur Nullstellenberechnung

  Alt 8. Mai 2006, 20:27
Herzlich willkommen in der Delphi-PRAXiS, moertymoo.

Hier noch mein Begrüßungsgeschenk für dich:

Delphi-Quellcode:
function Horner(x: Extended; coeff: array of 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.

Freundliche Grüße vom marabu
  Mit Zitat antworten Zitat
moertymoo

Registriert seit: 8. Mai 2006
12 Beiträge
 
#9

Re: Bisektion - Ein Verfahren zur Nullstellenberechnung

  Alt 8. Mai 2006, 21:12
Horner Schema kenne ich leider net.. bin 11. klasse ich weiß net ab wann man das bekommt :/
trotzdem danke werds mir gleich mal angucken
  Mit Zitat antworten Zitat
Flare

Registriert seit: 26. Jan 2006
Ort: Leipzig
529 Beiträge
 
Delphi 7 Professional
 
#10

Re: Bisektion - Ein Verfahren zur Nullstellenberechnung

  Alt 9. Mai 2006, 05: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.

Oder dürft ihr nur Bisektion anwenden?


Flare
Willy Scheibel
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:20 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz