Quadratische Gleichung und das Epsilon
Ahoi,
also es geht darum. Aufgabe is das programmieren einer quadratischen Gleichung in normalem C. Das hab ich mir auch irgendwie aus der Nase gezogen. D.h. das Programm funktioniert ohne Probleme und macht auch alles was ich will, bis auf zwei Sachen.
1. In den Fällen wo keine Lösung das Ergebnis ist, würd ich das Ergebnis gerne als komplexe Zahlen darstellen. Und ich hab absolut keinen Schimmer wie ich das machen soll.
2. Als kleiner "Zusatz" gibt es noch das zu implentieren: Zitat: Aufgrund der begrenzten Darstellungsmöglichkeiten in realen Rechnern sind nicht nur Fälle mit genau einem Wert von Null kritisch, sondern auch Werte in unmittelbarer Nähe von Null. Testen sie daher den Fall mittels
|a| < є (Epsilon) ab, wobei є vom Rechner und der gewünschten Genauigkeit abhängt. Ein praktisch meist sinnvoller Wert ist є = 10 Hoch -7."
Hier is der funktionierende Quelltext. Vielleicht hat jemend ne Idee. Hab im Netz nix hilfreiches gefunden. Danke schon mal.
/*Berechnung einer quadratischen Gleichung*/
#include <stdio.h>
#include <math.h>
void main(void)
{
double a=0, b=0, c=0, D=0, x1=0, x2=0, zw1=0, zw2=0;
int auswahl=0;
do { /*Beginn der Programmwiederholungsschleife*/
system("cls");
printf("\nGegeben ist die quadratische Gleichung ax^2 + bx + c = 0 .\n");
printf("\nGeben Sie jetzt die Variablen a, b und c ein.\n\n");
/*Variablendeklaration*/
printf("a = ");
scanf("%lf", &a);
printf("\nb = ");
scanf("%lf", &b);
printf("\nc = ");
scanf("%lf", &c);
/*Berechnung der Lösungen*/
/*if-else-Schleife um Lösungen zu berechnen*/
/*Lineare Funktion*/
if (a == 0) {
if (b == 0) {
if (c == 0)
printf("\n\nErgebnis ist 0=0 --> Ergebnis ist xeR."); /*Wenn a,b,c = 0 dann xeR*/
else printf("\n\nEs gibt keine L\x94sungen."); /*Sonst, wenn c nicht 0 --> keine Lösungen*/
} else if (b != 0 ) { x1 = -c / b; /*Anderenfalls wenn b nicht 0 --> es gibt eine Lösung*/
printf("\n\nEs gibt nur eine L\x94sung.\n\n");
printf("x = %.2lf", x1);
}
}
/*Quadratische Funktion*/
else {
D = ((b*b)-(4*a*c)); /*Berechnung der Diskriminante*/
if (D > 0) {/*Wenn Diskriminante größer 0, dann 2 Lösungen*/
zw1 = -b /(2*a);
zw2 = D /(4*a*a);
x1 = zw1 + sqrt(zw2);
x2 = zw1 - sqrt(zw2);
printf("\n\nx1 = %.2lf", x1);
printf("\n\nx2 = %.2lf", x2);
} else if (D == 0) { /*Wenn Diskriminante = 0, dann eine Lösung*/
x1 = -b / (2*a);
printf("\n\nEs gibt nur eine L\x94sung.\n\n");
printf("x = %.2lf", x1);
} else if (D < 0) { /*Wenn Diskriminante < 0, dann keine Lösung*/
printf("\n\nEs gibt keine L\x94sungen.");
}
} /*Ende der if-else-Schleife*/
printf("\n\n");
printf("Neue Berechnung durch 1, beenden mit 0: ");
scanf("%d",&auswahl);
} while(auswahl==1); /*Ende der Programmwiederholungsschleife*/
}
also es geht darum. Aufgabe is das programmieren einer quadratischen Gleichung in normalem C. Das hab ich mir auch irgendwie aus der Nase gezogen. D.h. das Programm funktioniert ohne Probleme und macht auch alles was ich will, bis auf zwei Sachen.
1. In den Fällen wo keine Lösung das Ergebnis ist, würd ich das Ergebnis gerne als komplexe Zahlen darstellen. Und ich hab absolut keinen Schimmer wie ich das machen soll.
2. Als kleiner "Zusatz" gibt es noch das zu implentieren: Zitat: Aufgrund der begrenzten Darstellungsmöglichkeiten in realen Rechnern sind nicht nur Fälle mit genau einem Wert von Null kritisch, sondern auch Werte in unmittelbarer Nähe von Null. Testen sie daher den Fall mittels
|a| < є (Epsilon) ab, wobei є vom Rechner und der gewünschten Genauigkeit abhängt. Ein praktisch meist sinnvoller Wert ist є = 10 Hoch -7."
Hier is der funktionierende Quelltext. Vielleicht hat jemend ne Idee. Hab im Netz nix hilfreiches gefunden. Danke schon mal.
/*Berechnung einer quadratischen Gleichung*/
#include <stdio.h>
#include <math.h>
void main(void)
{
double a=0, b=0, c=0, D=0, x1=0, x2=0, zw1=0, zw2=0;
int auswahl=0;
do { /*Beginn der Programmwiederholungsschleife*/
system("cls");
printf("\nGegeben ist die quadratische Gleichung ax^2 + bx + c = 0 .\n");
printf("\nGeben Sie jetzt die Variablen a, b und c ein.\n\n");
/*Variablendeklaration*/
printf("a = ");
scanf("%lf", &a);
printf("\nb = ");
scanf("%lf", &b);
printf("\nc = ");
scanf("%lf", &c);
/*Berechnung der Lösungen*/
/*if-else-Schleife um Lösungen zu berechnen*/
/*Lineare Funktion*/
if (a == 0) {
if (b == 0) {
if (c == 0)
printf("\n\nErgebnis ist 0=0 --> Ergebnis ist xeR."); /*Wenn a,b,c = 0 dann xeR*/
else printf("\n\nEs gibt keine L\x94sungen."); /*Sonst, wenn c nicht 0 --> keine Lösungen*/
} else if (b != 0 ) { x1 = -c / b; /*Anderenfalls wenn b nicht 0 --> es gibt eine Lösung*/
printf("\n\nEs gibt nur eine L\x94sung.\n\n");
printf("x = %.2lf", x1);
}
}
/*Quadratische Funktion*/
else {
D = ((b*b)-(4*a*c)); /*Berechnung der Diskriminante*/
if (D > 0) {/*Wenn Diskriminante größer 0, dann 2 Lösungen*/
zw1 = -b /(2*a);
zw2 = D /(4*a*a);
x1 = zw1 + sqrt(zw2);
x2 = zw1 - sqrt(zw2);
printf("\n\nx1 = %.2lf", x1);
printf("\n\nx2 = %.2lf", x2);
} else if (D == 0) { /*Wenn Diskriminante = 0, dann eine Lösung*/
x1 = -b / (2*a);
printf("\n\nEs gibt nur eine L\x94sung.\n\n");
printf("x = %.2lf", x1);
} else if (D < 0) { /*Wenn Diskriminante < 0, dann keine Lösung*/
printf("\n\nEs gibt keine L\x94sungen.");
}
} /*Ende der if-else-Schleife*/
printf("\n\n");
printf("Neue Berechnung durch 1, beenden mit 0: ");
scanf("%d",&auswahl);
} while(auswahl==1); /*Ende der Programmwiederholungsschleife*/
}
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 44208
Url: https://administrator.de/contentid/44208
Ausgedruckt am: 22.11.2024 um 19:11 Uhr
5 Kommentare
Neuester Kommentar
Hallo,
meiner Ansicht nach sind die beiden Lösungen mit deinen Bezeichnungen
x1 = zw1 + i mal sqrt(zw2);
x2 = zw1 - i mal sqrt(zw2);
also zwei konjugiert komplexe Zahlen mit dem Realteil zw1 und dem Imaginärteil +sqrt(zw2) bzw. -sqrt(zw2).
Bsp: x^2 - 2x +6 = 0 ==> x1 = 1+ i sqrt(5); x2 = 1 - i sqrt(5)
Probe:
(1+ i sqrt(5))^2 - 2mal (1+ i sqrt(5)) +6
=1+2 mal i sqrt(5) - 5 - 2 - 2 mal i sqrt(5) +6
=7 - 7
= 0
Probe für die andere Lösung analog.
Schöne Grüße
laberdasch
meiner Ansicht nach sind die beiden Lösungen mit deinen Bezeichnungen
x1 = zw1 + i mal sqrt(zw2);
x2 = zw1 - i mal sqrt(zw2);
also zwei konjugiert komplexe Zahlen mit dem Realteil zw1 und dem Imaginärteil +sqrt(zw2) bzw. -sqrt(zw2).
Bsp: x^2 - 2x +6 = 0 ==> x1 = 1+ i sqrt(5); x2 = 1 - i sqrt(5)
Probe:
(1+ i sqrt(5))^2 - 2mal (1+ i sqrt(5)) +6
=1+2 mal i sqrt(5) - 5 - 2 - 2 mal i sqrt(5) +6
=7 - 7
= 0
Probe für die andere Lösung analog.
Schöne Grüße
laberdasch