Gleichungen lösen.

Hallo.
Ich hab ein Programm selbst geschrieben, welches Gleichungen löst (Funktionsgleichungen....).

Jetzt hab ich nur ein Problem.... Hier der Code
#include <iostream>
#include <stdlib.h>
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <ctime>
#include <fstream>




using namespace std;



int main(int argc, char *argv[])
{

float x, a, b, c, z, l;

cout << "Die Gleichung hat den Aufbau y = a*(x*x) + b*x + c" << endl;
cout << "Wobei y = 0" << endl;
cout << endl;

getch();
cout << "Bitte ale Zahlen mit ihrem Vorzeichen angeben." << endl;

cout << "Bitte a eingeben: ";
cin >> a;
cout << endl;

cout << "Bitte b eingeben: ";
cin >> b;
cout << endl;

cout << "Bitte c eingeben: ";
cin >> c;
cout << endl;


x=0;

do
{
x=x+0.1;

l=((a*(x*x))+(b*x))+c;
cout << l << " l ist so groß" << endl;
cout << x << " l ist so groß" << endl;
getch();


} while (l != 0);

cout << endl;
cout << "Bei der Gleichung: " << a << "*(x*x)+" << b << "*x+" << c <<endl;
cout << "Ist x= " << x << endl;
cout << endl;
system("PAUSE");
}


x wird immer um o,1 erhöht... Ich habs mal mit der Gleichung a=+1 b=-6 und c=+9 probiert, ich weiß, dass da 3 hinmuss, um die Gleichung auf Null zu bringen (Es geht um Nullstellen in Parabeln)

Aber wenn er dann bei 3 angekommen ist, so steh folgenes als Ergebnis da:
5,11591e-013

Wird x immer um 0,2 erhöht, so steht etwas ähnliches da und wenn es immer um 0,5 erhöht wird, dann funktionierts.... aber dann habe ich leider keine garantie, dass wirklich alle möglichkeiten mit einer nachkommarstelle getestet wurden....

Wo liegt da der Fehler?


Danke schonmal im voraus...
Gruß, D31~$0u1
 
Das Ergebnis ist richtig. Gib mal 5,11591*e^-13 im Taschenrechner ein... fast! 0
Ich denk mal, dass das Ausgabeformat eines Floats ist (hab grad erst mit C angefangen).

Mal abgesehen davon...
Eine Funktion kann ja auch nur negative Nullstellen haben. Also mit x=0 kanns passieren das du keine Nullstellen findest.
Warum benutzt du eigentlich nicht die Lösungsformel?
 
Fließkommazahlen kannst du nicht einfach wie Ganzzahlen auf Gleichheit prüfen, da es zu Rundungsfehlern kommen kann. So eine Abfrage wie if ( l != 0 ) kann somit ziemlich in die Hose gehen, denn du vergleichst einen Float (der auch so gut wie niemals exakt 0 sein wird) mit einem Integer. Wenn du da auf Gleichheit prüfen willst, dann haut das nur über Toleranzbereiche hin, dass du diese Aussage also beispielsweise als wahr betrachtest, wenn l hinreichend weit unterschiedlich von 0 ist.

Die Schreibweise 5,11591*e^-13 bedeutet übrigens nichts anderes als 5,11591 * 10^-13, also 0,000000000000511591, was ja schon ziemlich klein ist ;)
 
Hallo,
hier der Insider-Tipp um Nullstellen zu finden:
Bei Parabeln kann man die PQ-Formel verwenden, lässt sich sehr leicht programmieren und führt immer zum richtigem Ergebnis.

Bei Funktionen höheren Grades speichert man das Ergebnis des vorherigen durchlaufes zwischen.
Wenn das alte Ergebnis * dem neuen Ergebnis eine negative Zahl (<0) ergibt, so war zwischen diesen beiden Ergebnissen eine Nullstelle.
Natürlich sollte man auch überprüfen, ob das Ergebnis von vornherein 0 ist.
 
Zurück
Oben