shagrath
Goto Top

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| < &#1108; (Epsilon) ab, wobei &#1108; vom Rechner und der gewünschten Genauigkeit abhängt. Ein praktisch meist sinnvoller Wert ist &#1108; = 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*/


}

Content-Key: 44208

Url: https://administrator.de/contentid/44208

Printed on: April 24, 2024 at 10:04 o'clock

Member: Shagrath
Shagrath Nov 11, 2006 at 16:03:40 (UTC)
Goto Top
Dieses &#1108 war ursprünglich ein reinkopieres Epsilon, soll also ein "e" sein.
Member: laberdasch
laberdasch Nov 12, 2006 at 20:21:48 (UTC)
Goto Top
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
Member: Shagrath
Shagrath Nov 15, 2006 at 19:32:45 (UTC)
Goto Top
Eigentlich wollt ich wissen wie ich das dem Programm klar mache, das der mit komplexe Zahlen ausgibt. In C++ scheint das problemlos über ne complex.h Bibliothek gelöst werden zu können, aber in C gibt es sowas nicht.
Member: laberdasch
laberdasch Nov 15, 2006 at 20:01:37 (UTC)
Goto Top
Tschuldigung, das habe ich missverstanden, weil du schriebst
Und ich hab absolut keinen Schimmer wie ich das machen soll.

Schöne Grüße

laberdasch
Member: Shagrath
Shagrath Nov 25, 2006 at 19:15:12 (UTC)
Goto Top
Hier mal die Lösung...hab es nach dann irgendwann mal hinbekommen...


/*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;
const double e=0.0000001;
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 ) | (fabs(a) < e)) {

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*/


}