for schleife
-
hallo,
habe jetzt in meinem studium seit ein paar wochen c und wollte jetzt mal aus spaß etwas probieren und zwar:
gibt es ja das newton'sche nullstellen näherungsverfahren, dies wollte ich in c mit einer for schleifen umsetzen, doch es funktioniert einfach nicht,
habt ihr eine lösung?#include <stdio.h>
#include <stdlib.h>int main()
{
printf ("Newton'sches Naeherungsverfahren zur Nullstellenbestimmung\n");
printf ("für Funktionen Zweiten Grades\n");float a, b, c, x1, y1, x2, y2;
int p;
a=1;
b=0;
c=-2;
x1=1.5;
p=1;
x2=0;for(x2=x1; p>=9; p++)
{
x2=x1-((a*x1*x1+b*x1+c)/(2*x1+b));printf ("----------\n");
}
y2=a*x2*x2+b*x2+c;
printf ("x2: %f\n", x2);
printf ("y2: %f\n", y2);
system("PAUSE");
return 0;
}
-
Hier ist das Forum für C# und .NET und nicht für C!
-
Hallo Simeon222 !
Ich schließe mich den Worten von Dauercoder an, trotzdem will ich versuchen Dir zu helfen. Bei mathematischen Problemen solltest Du grundsätzlich den Datentyp 'double' anstatt 'float' benutzen, da dieser mit doppelter Genauigkeit anstatt mit einfacher rechnet. Dies bedeutet, dass erst bei der 16ten Nachkommastelle aufgerundet wird, was bei dem Newtonschen Annäherungsverfahren nicht gerade unwichtig ist. Zweitens solltest Du Dir angewöhnen Leerzeichen zwischen den Operatoren zu setzen sowie Tabulatoreinrückungen für zusammengehörige Codeblöcke zu setzen - dies unterstützt die Übersichtlichkeit.
Jetzt zum Code :
printf ("Newton'sches Naeherungsverfahren zur Nullstellenbestimmung\n"); printf ("für Funktionen Zweiten Grades\n\n"); double a = 1, b = 0, c = -2, x1 = 1.5, x2 = 0, y2 = 0; int p = 1; for(x2 = x1; p <= 9; p++) { x2 = x1 - ((a * x1 * x1 + b * x1 + c) / (2 * x1 + b)); y2 = a * x2 * x2 + b * x2 + c; printf ("x2: %.16f\n", x2); printf ("y2: %.16f\n", y2); x1 = x2; printf ("----------\n"); } return 0;
Die Bedingung Deiner Schleife mit 'p >= 9' ist falsch. Eine Schleife wird nur solange durchlaufe wie diese Bedingung WAHR ist. Hat p einen Wert erreicht in dem die Bedingung FALSCH wird, wird diese Schleife beendet. Deine Bedingung ist von Anfang an falsch, deshalb wird die Schleife gleich zu Beginn beendet. Weiterhin kannst Du eine Variablendeklaration gleich mit einer Wertedefinition versehen (z. B. double a = 1.5) - dies spart Platz im Quellcode. Dieser Quellcodeabschnitt 'for(x2 = x1; ...)' innerhalb Deiner FOR-Schleifen-Definition wird nur zum Start der Schleife einmal angesprungen; es setzt also nur den Startwert. Wenn Du das Ergebnis der Berechnung von x2 wieder nach x1 übergeben möchtest - was ja zwingend in der Annäherungsrechnung ist - dann musst Du dies innerhalb der FOR-Schleife tun 'x1 = x2;'. Um zu sehen, wie sich der y2-Wert langsam der Abszisse annähert, musst Du die Ausgabe 'printf' von x2 und y2 ebenfalls in den Schleifenblock miteinbauen. Variablen die im Quellcode nicht benutzt werden, z. B. y1, sollten gänzlich aus dem Code verschwinden, da diese nur Warnungen beim Kompilieren hervorrufen.
Ich hoffe ich konnte Dir helfen !?
Gruß Ernst
-
vielen dank