Gauss-Algorithmus
lima-city → Forum → Programmiersprachen → C/C++ und D
algorithmus
anzahl
beitrag
dreiecksform
dritte
ergebnis
erste
faktor
funktion
gau
gaus
gleichung
laufzeit
main
miteinander
quelltext
rechenschritt
sen
variable
versuchen
-
Hallo Leute,
ich habe versucht mit C einen Gauss-Algorithmus zu proggen. Habe es soweit geschafft, dass ich mit 3 Variablen hantieren kann. Habe auch zur dynamik ein 3-Dimensionales Feld deklariert. Jetzt aber sto?e ich an ein Problem:
Ich m?chte, dass ich selber die anzahl der Variablen eingeben kann. Daf?r muss ich ja die malloc-Funktion benutzen. Aber beim Gauss-Algorithmus werden ja die Anzahl der Rechenschritte pro weitere Variable mehr.
Hat jemand vielleicht schonmal soetwas programmiert und wei?, wie ich es schaffe, dass die for-Schleifen und deren K?rper bei jedem durchlauf die Anzahl der Rechenschritte ?ndert. (*Schwer zu formulieren*)
Vielleicht hat ja jemand schonmal sowas geproggt und kann mir seine Erfahrungen mitteilen.
blackpanther-online -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Poste mal den Quelltext, dann kann man Dir vielleicht helfen.
-
Na nicht das jetzt jemand behauptet ich sei bekloppt, dass ich so ein mega teil schreibe. ich bin noch nichtmals sehr weit. Die malloc-fehlt noch und es ist noch mindestens ein Fehler drin. Aber es geht mir nur darum, dass das Programm je nach Anzahl der Variablen auch die Anzahl der Durchl?ufe der Angleich- und KGV-Teile steuert. Das Prog:
/* blackpanther-online, Gau?-Rechner , 14.10.2004*/
#include <stdio.h>
#include <conio.h>
void main()
{
int ii, ij;
double dVar[4][3][6]; //Variablen-Speicher: dVar[Anzahl der Variablen + Ergebnis][Anzahl der Gleichungen][Velaufsspeicher]
printf("Gau\341-Algorithmus 3 Variablen - Version 1.0\n");
printf("--------------------------------------------------------------------\n");
printf("\270 by blackpanther-online 2004\n\n\n");
//Eingabe Faktoren
for(ii=0;ii<3;ii++)
{
printf("\n--------------------------------------------------------------------\n");
printf("Geben Sie bitte die die Werte f\201r die %i. Gleichung ein.\n",ii+1);
for(ij=0;ij<4;ij++)
{
printf("\nFaktor f\201r %i. Variable: ",ij+1);
scanf("%lf",&dVar[ij][ii][0]);
}
printf("\nGleichung %i: %0.2lfx + %0.2lfy + %0.2lfz = %0.2lf \n",ii+1,dVar[0][ii][0],dVar[1][ii][0],dVar[2][ii][0],dVar[3][ii][0]);
}
//Rechenprozess
//KGV 1
printf("\n--------------------------------------------------------------------\n");
for(ii=0;ii<3;ii++)
{
dVar[0][ii][1] = dVar[0][0][0]*dVar[0][1][0]*dVar[0][2][0];
for(ij=1;ij<4;ij++)
{
dVar[ij][ii][1] = dVar[0][ii][1] / dVar[0][ii][0] * dVar[ij][ii][0];
}
printf("%0.2lf %0.2lf %0.2lf %0.2lf\n",dVar[0][ii][1],dVar[1][ii][1],dVar[2][ii][1],dVar[3][ii][1]);
}
//Erster Angleichschritt
for(ii=0;ii<4;ii++)
{
dVar[ii][0][2] = dVar[ii][0][1];
dVar[ii][1][2] = dVar[ii][1][1] - dVar[ii][0][1];
dVar[ii][2][2] = dVar[ii][2][1] - dVar[ii][0][1];
}
printf("\n--------------------------------------------------------------------\n");
printf("%0.2lf %0.2lf %0.2lf %0.2lf\n",dVar[0][0][2],dVar[1][0][2],dVar[2][0][2],dVar[3][0][2]);
printf("%0.2lf %0.2lf %0.2lf %0.2lf\n",dVar[0][1][2],dVar[1][1][2],dVar[2][1][2],dVar[3][1][2]);
printf("%0.2lf %0.2lf %0.2lf %0.2lf\n\n",dVar[0][2][2],dVar[1][2][2],dVar[2][2][2],dVar[3][2][2]);
//KGV 2
printf("\n--------------------------------------------------------------------\n");
for(ii=0;ii<3;ii++)
{
dVar[1][ii][3] = dVar[1][0][2] * dVar[1][1][2] * dVar[1][2][2];
dVar[0][ii][3] = dVar[1][ii][3] / dVar[1][ii][2] * dVar[0][ii][2];
dVar[2][ii][3] = dVar[1][ii][3] / dVar[1][ii][2] * dVar[2][ii][2];
dVar[3][ii][3] = dVar[1][ii][3] / dVar[1][ii][2] * dVar[3][ii][2];
printf("%0.2lf %0.2lf %0.2lf %0.2lf\n",dVar[0][ii][3],dVar[1][ii][3],dVar[2][ii][3],dVar[3][ii][3]);
}
//Zweiter Angleichschritt
printf("\n--------------------------------------------------------------------\n");
for(ii=0;ii<4;ii++)
{
dVar[ii][0][4] = dVar[ii][0][3];
dVar[ii][1][4] = dVar[ii][1][3];
dVar[ii][2][4] = dVar[ii][2][3] - dVar[ii][1][3];
}
printf("%0.2lf %0.2lf %0.2lf %0.2lf\n",dVar[0][0][4],dVar[1][0][4],dVar[2][0][4],dVar[3][0][4]);
printf("%0.2lf %0.2lf %0.2lf %0.2lf\n",dVar[0][1][4],dVar[1][1][4],dVar[2][1][4],dVar[3][1][4]);
printf("%0.2lf %0.2lf %0.2lf %0.2lf\n\n",dVar[0][2][4],dVar[1][2][4],dVar[2][2][4],dVar[3][2][4]);
//Aufl?sung
dVar[3][2][5] = dVar[3][2][4] / dVar[2][2][4];
dVar[3][1][5] = (dVar[3][1][4] - (dVar[2][1][4] * dVar[3][2][5])) / dVar[1][1][4];
dVar[3][0][5] = (dVar[3][0][4] - (dVar[1][0][4] * dVar[3][1][5]) - (dVar[2][0][4] * dVar[3][2][5]))/dVar[0][0][4];
printf("\n\n\n--------------------------------------------------------------------\n");
for(ii=0;ii<3;ii++)
{
printf("%i. Variable = %lf\n",ii+1,dVar[3][ii][5]);
}
getch();
}
Beitrag ge?ndert am 25.11 23:05 von blackpanther-online -
Ich wei? zwar nicht woran es liegt, aber gibt es niemanden, der eine Idee hat? Oder will sich keiner die M?he machen, eine Idee zu bringen. Ich will nicht, dass ihr mir gleich die L?sung postet. Mir w?rde es schon reichen, wenn jemand mir 'ne Idee gibt, wie sich das realisieren lassen k?nnte.
blackpanther
Beitrag ge?ndert am 27.11 10:55 von blackpanther-online -
blackpanther-online schrieb:
Ich wei? zwar nicht woran es liegt, [...] will sich keiner die M?he machen, eine Idee zu bringen.
Genau daran liegt es...
Kannst du den Gauss Algorithmus mal auf verst?ndliche Art und Weise beschreiben?
Nachtrag:
Und zuk?nftig bitte keine Doppelposts mehr, die Editfunktion ist dir ja bekannt.
Beitrag ge?ndert am 27.11 15:30 von 0-checka -
Also nun erkl?re ich das ganze noch mal. Ist glaube ich jetzt der 4. Versuch. Das Problem ist, dass es sich bei meinem Programm um reine Mathematik handelt und es sich deshalb unheimlich schwer erkl?ren l?sst. Dennoch versuche ich es:
Gehen wir mal davon aus, dass wir 3 Variablen haben, deren Wert wir nicht kennen. Wir benennen sie x, y und z. Wenn wir diese Variablen mit einem bestimmten Faktor multiplizieren und dann alle miteinander addieren erh?lt man eine Gleichung. Und damit wir ein Gleichungsl?sungsverfahren bekommen machen wir 3 Gleichungen. Ich w?hle dieses Beispiel:
2*x + 4*y + 6*z = 8
3*x + 2*y + 1*z = 2
3*x + 1*y + 4*z = 5
Der ?bersicht halber lassen wir die Variablen einfach weg und denken sie uns. Damit sieht die Gleichung wie folgt aus:
2 + 4 + 6 = 8
3 + 2 + 1 = 2
3 + 1 + 4 = 5
Ziel des Gau?-Algorithmus ist es, am Ende die ?Dreiecksform? zu erhalten. Diese sieht wie folgt aus:
? + ? + ? = ?
0 + ? + ? = ?
0 + 0 + ? = ?
Um das zu erreichen suchen wir als erstes das kleinste gemeinsame Vielfache (KGV) aller x-Faktoren. Dazu multiplizieren wir alle x-Faktoren miteinander:
2 * 3 * 3 = 18
Jetzt multiplizieren wir jeden Faktor jeder Gleichung mit einem Wert, damit alle x-Faktoren 18 haben:
18 + 36 + 54 = 72 { Diese Gleichung wurde mit 9 multipliziert }
18 + 12 + 6 = 12 { Diese Gleichung wurde mit 6 multipliziert }
18 + 6 + 24 = 30 { Diese Gleichung wurde mit 6 multipliziert }
Jetzt haben wir alle x-Faktoren = 18. Jetzt subtrahieren wir die Gleichungen so von einander, dass nur bei der ersten Gleichung der x-Faktor nicht 0 ist.
18 + 36 + 54 = 72 { wird nicht ge?ndert }
0 + -24 + -48 = -60 { Ergebnis von Gleichung 2 ? Gleichung 1 }
0 + -30 + -30 = -42 { Ergebnis von Gleichung 3 ? Gleichung 1 }
So jetzt haben wir schon 2 von drei 0en der Dreiecksform. Jetzt fehlt nur noch die dritte. Diese erreichen wir indem wir einfach das KGV der y-Faktoren nehmen:
36 * -24 * -30 = 25920
Jetzt m?ssen wir wieder alle Faktoren aller Gleichungen mit dem Wert multiplizieren, sodass alle y-Faktoren 25920 werden:
12960 + 25920 + 38880 = 51840 { Diese Gleichung wurde mit 720 multipliziert }
0 + 25920 + 51840 = 64800 { Diese Gleichung wurde mit -1080 multipliziert }
0 + 25920 + 25920 = 36288 { Diese Gleichung wurde mit -864 multipliziert }
Jetzt m?ssen wir erneut Gleichungen von einander subtrahieren, sodass wir am Ende die dritte 0 haben:
12960 + 25920 + 38880 = 51840 { wird nicht ge?ndert }
0 + 25920 + 51840 = 64800 { wird nicht ge?ndert }
0 + 0 + -25920 = -28512 { Ergebnis von Gleichung 3 ? Gleichung 2 }
So die Dreiecksform haben wir erreicht. Jetzt stellen wir als erstes die dritte Gleichung nach z um:
0*x + 0*y + -25920*z = -28512
-25920*z = -28512
z = -28512 / - 25920
z = 1,1
Diesen Wert k?nnen wir jetzt in die zweite Gleichung einsetzten:
0*x + 25920*y + 51840*1,1 = 64800
25920*y = 64800 ? 51840*1,1
y = ( 64800 ? 51840*1,1 ) / 25920
y = 0,3
Jetzt haben wir die Wert von y und z. Diese k?nnen wir in der ersten Gleichung einsetzt und damit nach x aufl?sen:
12960*x + 25920*0,3 + 38880*1,1 = 51840
12960*x = 51840 ? 38880*1,1 ? 25920*0,3
x = ( 51840 ? 38880*1,1 ? 25920*0,3 ) / 12960
x = 0,1
So jetzt haben wir alle Variabelen-Werte ermittelt.
-----
Um nun das ganze auf mehr Variablen zu beziehen muss man wissen wie man das System weiterbaut. Dazu ist es erforderlich, die Dreicksform zu erweitern:
? + ? + ? + ? = ?
0 + ? + ? + ? = ?
0 + 0 + ? + ? = ?
0 + 0 + 0 + ? = ?
Daraus folgt, dass man nun umso mehr KGV?s bilden muss. Weiterhin muss man auch um so mehr Variablen man hat, desto mehr Gleichungen muss man voneinander subtrahieren.
Ich hoffe das war jetzt soweit verst?ndlich. Das zu erkl?ren ist eine Mords Aufgabe, aber ich will unbedingt wissen, wie ich den Gau?-Algorithmus erweitern kann.
blackpanther
Beitrag ge?ndert am 28.11 11:17 von blackpanther-online -
Hallo? Mein Programm was ich oben bereits gepostet habe funktioniert. Ich brauche nicht ein Programm schreiben was das "Versucht". Ich will lediglich wissen, ob jemand eine Idee hat, wie ich es l?sen kann, dass die Rechenschritte umso ?fter aufgerufen werden. Mir hat mal jemand was von Rekursiven-Forschleifen gesagt. Damit w?re es m?glich das zu l?sen. Aber ich bin mir nicht sicher wie das gehen soll.
blackpanther -
Du meinst, ich solle f?r alle m?glichkeiten eine eigenst?ndige Funktion schreiben. Der Benutzer gibt dann ?ber die scanf die Anzahl der Variablen ein. Das Programm pr?ft das dann mittels einer switch und startet dann die jeweils zugeh?rige Funktion. Die Idee war mir schon gekommen, aber das finde ich nicht sch?n. Ich w?rde es viel lieber m?glich haben, dass man f?r alle m?glichkeiten ein Programm hat, wass dann je nach Anzahl die gew?nschte funktion durchf?hrt. Aber ich glaube ich stelle zu hohe Erwartungen. Ist egal...
blackpanther -
Nun das was du brauchst ist eine geschachtelte for Schleife und noch die eine oder andere Varibale mehr.
Du hast dann halt eine Laufzeit von O^2, aber das ist der Preis daf?r.
Ich werd mal meine Quelltexte durchforsten und sehen ob ich den Gauss noch habe.
Was ich beim ?berfliegen noch festgestellt habe, du hast alles in der main, es w?re schon etwas kl?ger das Prog in mehrere Funktionen zu unterteilen!
Hab gestern leider vergessen zu schauen, ich hole das heute nach.
Beitrag ge?ndert am 2.12 11:41 von sachsenraecher -
Ey cool, es gibt hier doch noch jemanden der sich dazu ?ussern kann. Wenn du noch 'nen Quelltext h?ttest w?re das super.
Was du angesprochen hast ist vollkommen richtig. Ich habe auch schon ?berlegt alles auszulagern. Aber ich wollte vorerst das ganze fertig haben, um sicherzu gehen, dass es auch alles funktioniert. Mein Problem wird n?mlich beim auslagern sein, dass ich dann call by referenc machen m?sste. Und das bei einem 3-Dimensionalen Feld. Das wird mit sicherheit nicht einfach. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage