Einzelnen Beitrag anzeigen

Crattely

Registriert seit: 26. Sep 2012
4 Beiträge
 
#5

AW: Übergabe von Zahlen an Prozedur

  Alt 29. Apr 2013, 19:44
Vielen Dank !!!
Da schreibt man die kompliziertesten Programme und dann so ein dummer Fehler
NST6 ist eigentlich gar keine Nullstelle, sondern da werden Dinge wie "unendlich viele Nullstellen" oder "keine NSTs", also Sonderfälle reingeschrieben und später ausgewertet.
Die Nullstellen Funktion sieht so aus:

Delphi-Quellcode:
//Beginn Prozedur Funktion
function fktn(a,b,c,d,e,f,x:real):real;

             function pot(x:real;n:integer):real;
             var i:integer;
                 y:real;
             begin
                  y:=1;
                  for i:=1 to n do y:=y*x;
                  pot:=y;
             end;

begin
     fktn:=(a*pot(x,5)+b*pot(x,4)+c*pot(x,3)+d*pot(x,2)+e*x+f);
end;
//Ende Prozedur Funktion

//Beginn Prozedur NS_numerisch
procedure NS_numerisch(a,b,c,d,e,f:real; var NULL_1,NULL_2,NULL_3,NULL_4,NULL_5:real;var i:integer);
var //i:integer;
    x_MIN,x_MAX,x:real;

    function BerechneNullstelle_Numerisch(x_MAX,x_MIN:real):real;
    var Mitte:real;
    begin
         repeat
               Mitte:=(x_MAX + x_MIN)/2;
               if fktn(a,b,c,d,e,f,x_MIN)*fktn(a,b,c,d,e,f,Mitte)>0 then x_MIN := Mitte
               else x_MAX := Mitte;
         until x_MAX - x_MIN < 0.0001;
         BerechneNullstelle_Numerisch := (x_MIN + x_MAX)/2;
    end;

begin
x_MIN := -20;
i := 0; //Gefundene Nullstellenanzahl [Index]

While x_MIN < 20 do begin
      x_MAX := x_MIN + 0.1;
      if fktn(a,b,c,d,e,f,x_MIN)*fktn(a,b,c,d,e,f,x_MAX) < 0 then begin
         x := BerechneNullstelle_Numerisch(x_MAX,x_MIN);
         i:=i+1;
         case i of
              1: NULL_1:= x;
              2: NULL_2:= x;
              3: NULL_3:= x;
              4: NULL_4:= x;
              5: NULL_5:= x;
         end;
      end;
      x_MIN := x_MAX;
end;
end;
//Ende Prozedur NS_numerisch


//Beginn Prozedur Nullstellen allgemein
procedure Nullstellen(a,b,c,d,e,f:real; var NST1,NST2,NST3,NST4,NST5:real; var NST6:string; var Anzahl_NST:integer);
var g:real;
begin
NST6:='0';
If (a=0) and (b=0) and (c=0) then begin
   If d=0 then begin
      If e=0 then begin
             If f=0 then NST6:='x beliebig';
                If f<>0 then NST6:='Keine Nullstellen!';
                end
             else begin
                       Anzahl_NST:=1;
                       NST1:=(-f/e);
             end;
      end
   else begin
     g := (e*e) - (4*d*f);
     If g < 0 then NST6:='Keine Nullstellen!'
     else if g = 0 then begin
                             Anzahl_NST:=1;
                             NST1:=(-e/(2*d))
     end
     else begin
        NST1:=((-e + sqrt(g)) / (2*d));
        Anzahl_NST:=1;
        NST2:=((-e - sqrt(g)) / (2*d));
        Anzahl_NST:=2;
     end;
  end;
end
else begin
Anzahl_NST:=0;
NS_numerisch(a,b,c,d,e,f,NST1,NST2,NST3,NST4,NST5,Anzahl_NST);

end;
end;
//Ende Prozedur Nullstellen allgemein

Relativ kompliziert, komischerweise gibt er, wenn die Nullstelle bei x=0 liegt immer 4,8... als Nullstelle aus
Weiß jemand woran das liegen könnte ? Konnte sich auch mein Lehrer nicht erklären
  Mit Zitat antworten Zitat