Entwickler-Ecke

Sonstiges (Delphi) - Hilfe bei Kurvendiskussion!!!


evofan - Mo 05.03.07 21:06
Titel: Hilfe bei Kurvendiskussion!!!
Hallo Leute,
mach grad ein programm,was die nullstellen, polstellen und eine wertetabelle(wenns geht noch definitionsbereich) einer gebrochen rationalen Funktion(ax²+bx+c/dx²+ex+f) ausgeben soll, komm aber im moment net weiter,die nullstellen und polst. gibt es schon aus, aber den sonderfall, das die summe unter der wurzel nicht negativ werden darf, hab ich noch nicht raus!
und der wertebereich geht auch noch net perfekt!(quelltext ist weiter unten!!)
wäre echt nett, wenn ihr mir helfen könntet!!!
Danke im Vorraus!!

Gruß Evofan


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:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
var
  Form1: TForm1;
  a,b,c,d,e,f,x,y:real;

  implementation

{$R *.dfm}



{----------------------------------------------------}

function g(a,b,c,d,e,f,x:real):real;
begin
         g:=(a*x*x+b*x+c)/(d*x*x+e*x+f);
    
end;

{----------------------------------------------------}

procedure TForm1.Button1Click(Sender: TObject);
begin
  close;
end;

{---------------------------------------------------}

procedure TForm1.Button2Click(Sender: TObject);  //erkennen der funktion
begin
 a:=StrToFloat(Edit1.Text);
 b:=StrToFloat(Edit5.Text);
 c:=StrToFloat(Edit6.Text);

 d:=StrToFloat(Edit7.Text);
 e:=StrToFloat(Edit8.Text);
 f:=StrToFloat(Edit9.Text);

end;

{---------------------------------------------------}

procedure TForm1.Button5Click(Sender: TObject);  //wertetabelle
var x,y:real;
    i:integer;
begin
  for i:=-5 to 5 do
     begin
        x:=i;
        y:=g(a,b,c,d,e,f,x);
        memo1.Lines.add(inttostr(i));
   if d*x*x+e*x+f=0 then memo2.Lines.Add('nicht definiert')
   else
        memo2.Lines.Add(FloatToStrF(y,ffFixed,10,2));

//ende sonst
     end;


end;

{-------------------------------------------------}

procedure TForm1.Button4Click(Sender: TObject); //polstelle
var p1,p2,m,z:real;
begin

    z:=e*e/(4*d*d)-f/d;

    if z<0 then edit3.Text:='keine polstelle'

      else
             begin

                p1:=-e/(2*d)+sqrt(z);
                p2:=-e/(2*d)-sqrt(z);

              end;

          edit3.text:=Floattostr(p1);
          edit10.text:=floattostr(p2);



end;

procedure TForm1.Button3Click(Sender: TObject); //definitionsbereich
begin

  if a*x*x+b*x+c=0
      then edit2.Text:=floattostr(y)

      else edit2.text:='';
end;

procedure TForm1.Button6Click(Sender: TObject);   //nullstelle
var n1,n2,m,z:real;
begin

z:=b*b/(4*a*a)-c/a;
   if z<0 then edit11.Text:='keine nullstelle'
          else

                begin
                   n1:=-b/2*a+sqrt(z);
                   n2:=-b/2*a-sqrt(z);
                end;

           edit11.text:=Floattostr(n1);
           edit12.text:=floattostr(n2);


end;



procedure TForm1.Button7Click(Sender: TObject);
begin
edit1.Clear;
edit2.Clear;
edit3.Clear;
edit5.Clear;
edit6.Clear;
edit7.Clear;
edit8.Clear;
edit9.Clear;
edit10.Clear;
edit11.Clear;
edit12.Clear;
memo1.Clear;
memo2.Clear;


Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt


Kroko - Di 06.03.07 06:27

(a) Deine Frage verstehe ich nicht ganz, dein Sonderfall erzeugt komplexe Lösungen:

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:
function QuadNull(const A,B,C: Double; var Nr1,Nr2,Ni1,Ni2: Double): Integer;
var
  P,Q,Dis: Double;
const 
  Epsilon = 1E-10;
begin
  P := B/A;
  Q := C/A; //x²+px+q
  Dis := P*P-Q; //Diskriminante
  Nr1 := -P*0.5;
  Nr2 := Nr1;
  if Dis<0 then
    begin
      Ni1 := Sqrt(Abs(Dis));
      Ni2 := -Ni1;  
      Result := 0;
    end
  else
    begin
      if Abs(Dis)<Epsilon then Result := 1
      else
        begin
          Nr1 := Nr1+Sqrt(Dis);
          Nr2 := Nr2-Sqrt(Dis);
          Result := 2;
        end;   
    end;
end;

heißt wenn
(1) Result=0 2 komplexe Nullstellen Nr1+Ni1*i und Nr2+Ni2*i
(2) Result=1 1 reelle Nullstelle Nr1
(3) Result=2 2 reelle Nullstellen Nr1 und Nr2

(b) in deine Quellen sind noch ein paar Fehlerchen
Zeilen 79/80 ; 108/109 gehören ins begin/end davor

(c) die Wertetabelle würde ich mit

Delphi-Quelltext
1:
.Add(FloatToStr(X)+#9+floatToStr(Y));                    

füllen


evofan - Di 06.03.07 18:26

danke erstmal,
weißt du zufällig noch wie man die ableitungen dieser Fkt. macht?
[f(x)=(ax²+bx+c)/(dx²+ex+f)]
das andere geht jetzt alles schon!


Christian S. - Di 06.03.07 18:30

user profile iconevofan hat folgendes geschrieben:
danke erstmal,
weißt du zufällig noch wie man die ableitungen dieser Fkt. macht?
[f(x)=(ax²+bx+c)/(dx²+ex+f)]
das andere geht jetzt alles schon!
Daher hier weitermachen, wo Du schon einen Thread erstellt hast: http://www.delphi-forum.de/topic_Ableitung_70691.html

Hinweis: Du hast es ganz richtig gemacht, einen neuen Thread zu erstellen, aber bitte dann die Frage nicht auch nochmal woanders stellen :-)