Autor Beitrag
Passi077
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 125

Win XP
D7 Pers
BeitragVerfasst: Fr 01.04.05 16:40 
Hi,

die Suche erbrachte mir zwar Ergebnisse, aber leider keine die dieses Problem mit Hilve von Intervallhalbierung löst.

Ich habe schon meinen Code:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
function f(x: extended): extended;
begin
  result := x*x-16// Funktion: f(x)=x^2-16
end;

procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
    li, mi, re: extended;
begin

li := 2;  // In diesem Bereich muss sich die Nullstelle befinden
re := 10;

for i := 0 to 50 do // je nach gewünschter Genauigkeit Rechenvorgang öfters wiederholen
begin

  mi := (li+re)/2;  // Berechnung der Mitte des Intervalls

  if f(li) * f(re) <= 0 then  // Ist eines der Multiplikatoren Negativ ist auch das Produkt negativ, und wir wissen, dass sich die Nullstelle im Linken Bereich des Intervalls befindet
  begin
    re:=mi;
  end
  else
  begin
    li:=mi;
  end;

end;

self.Caption := floattostr(mi);

end;


So. Dieser Code berechnet mir auch eine Nullstelle, aber leider nicht die richtige!? Bei diesem Beispiel (f(x)=x^2-16) befindet sicht die Nullstelle im X-Bereich von 2-10 auf ziemlich genau 4. Aber der Code gibt mir 3 aus.

Habe leider keine Idee was da nun falsch sein könnte? Ich hoffe ihr könnt mir helfen!

Grüße
Passi
zemy
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 207

Win XP Prof.
D7
BeitragVerfasst: Sa 02.04.05 12:03 
probiers mal so...
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
    li, mi, re: extended;
begin

li := 10;  // In diesem Bereich muss sich die Nullstelle befinden
re := 2;

for i := 0 to 50 do // je nach gewünschter Genauigkeit Rechenvorgang öfters wiederholen
begin

  mi := (li+re)/2;  // Berechnung der Mitte des Intervalls

  if f(mi)*f(li) <= 0 then
    re:=mi
  else
    li:=mi;
end;

self.Caption := floattostr(mi);

end;


Es wird immer untersucht, ob zwischen links (bzw. rechts) und MITTE eine Nullstelle liegt und die Grenzen dann entsprechend gesetzt. (ist zumindest hier so ^^)

MfG Zemy

_________________
LifeIsToShortToThinkAboutTheShortness
Passi077 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 125

Win XP
D7 Pers
BeitragVerfasst: Sa 02.04.05 13:31 
Das war's!

Danke :D