Registriert seit: 26. Sep 2012
4 Beiträge
|
AW: Übergabe von Zahlen an Prozedur
29. Apr 2013, 20: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
|