Gauss Elimination oder wie ich wahnsinnig wurde.

Status
Nicht offen für weitere Antworten.
L

lobotaro

Gast
Ja, hallo erstmal.

Die Aufgabenstellung lautet wie folgt:
- ich habe 2 Arrays, eines für eine Matrix, eines für den dazugehörigen Vektor.
- Der Benutzer soll nun beliebige double-Werte eingeben, die dann in die Matrix und den Vektor eingeordnet werden sollen, als Beispiel wurde folgendes angegeben:

> java GaussElimination 1.9 2.36 3.13 4.8 5.2 6.74 7.94 8.11 9.9 10 11 12.7
1.9 2.36 3.13
5.2 6.74 7.94
9.9 10.0 11.0
4.8 8.11 12.7

Soweit is das ja schon ganz supi toll. Problem an der Sache, meine Programmiererfahrung beträgt 3 Wochen und die Aufgabe ist eindeutig zu schwer für mich.

Was ich bisher habe:

Code:
public class GaussElimination {

	static double[][] matrix;
	static double[] vector;
	
	public static void main(String[] args) {
		convertCoefficients(args);

	}
	
	public static void convertCoefficients(String[] args) {
		double[] a;
		a = new double[args.length];
		
		// Anzahl der Eingabewerte
		int n = 1;
		for (int i = 0; i < args.length; i++) {
			n++;
		}
		System.out.println("Anzahl der eingegeben Werte: " + n);
		
		// Anzahl der Zeilen/Spalten in der Matrix
		int a1 = 0;					
		int b = n - (a1 * a1);			
		for (int i = 0; i <= b; i++) {	
			b = n - (a1 * a1);
			a1++;
		}
		System.out.println(b + " * " + b + " Matrix");
		System.out.println("Zeilen insgesamt mit Vektor: " + a1);
		
		double[][]matrix = new double[b][b];
		double[]vector = new double[b];
		
	}
}

Die System.out's habe ich nur mal für mich selber für Zwischenergebnisse eingefügt und da taucht auch schon ein tolles Problem auf...gebe ich 12 Werte ein werden 12 gezählt und eine 3 x 3 Matrix plus Vektor-Zeile erkannt. bei 20 Werten werden 20 gezählt und eine 4 x 4 Matrix plus Vektor erkannt. Soweit, so richtig...nur...gebe ich 6 Werte ein, werden nicht wie erwartet 6 gezählt mit einer 2 x 2 Matrix plus Vektor, nein...es werden 7 Werte gezählt und ich bekomme eine -2 x -2 Matrix.

Nicht, dass ich sowieso schon seit Tagen am verzweifeln bin, weil ich einfach nicht weiß, wie ich nun die Werte in die Arrays packen soll gibt mir dieses Problem nun den Rest. ;)

Ich hoffe mir kann jemand helfen, und das mit möglichst einfachen Erklärungen, wäre echt super. :)[/code]
 
L

lobotaro

Gast
Ha, okay...inzwischen brauch ich nur noch einen kleinen Denkanstoß...

Aktueller Code:
Code:
public class GaussElimination {

	static double[][] matrix;
	static double[] vector;
	
	public static void main(String[] args) {
		convertCoefficients(args);
	}
	
	public static void convertCoefficients(String[] args) {
		double[] a;
		a = new double[args.length];
		
		// Anzahl der Eingabewerte
		int ewerte = 0;
		for (int i = 0; i < args.length; i++) {
			ewerte++;
		}
		System.out.println("Anzahl der eingegeben Werte: " + ewerte);
		
		// Anzahl der Zeilen/Spalten in der Matrix
		int a1 = 0;					
		int n = ewerte - (a1 * a1);			
		for (int i = 0; i < n; i++) {	
			n = ewerte - (a1 * a1);
			a1++;
		}
		System.out.println(n + " * " + n + " Matrix");
		System.out.println("Zeilen insgesamt mit Vektor: " + a1);
		
		double[][]matrix = new double[n][n];
		double[]vector = new double[n];
		
		// cast von char args nach double
		double[] b;
		b = new double[args.length];
		for (int i = 0; i < args.length; i++) {
		b[i] = Double.valueOf(args[i]).doubleValue();
		}
		
		// Wertzuweisung
		for(int i = 0; i < n; i++) {
			matrix[i][0] = b[i];
			System.out.print(matrix[i][0] + " ");
		}
		
		System.out.println();
		
		for(int i = 0; i <= ewerte; i++, n = n+a1) {
			vector[i] = b[n];
			System.out.print(vector[i] + " ");
		}
	}
}

Damit kann ich mir den Vektor und immerhin die erste Zeile der Matrix korrekt anzeigen lassen, allerdings komm ich jetzt nicht so ganz drauf, wie ich die restlichen Zeilen korrekt ausgeben lassen kann. Hm...;)
 

Landei

Top Contributor
Denkanstoß:
Code:
import java.util.Arrays;

public class GaussElimination {

   static double[][] matrix;
   static double[] vector;

   public static void main(String[] args) {
      convertCoefficients(args);
   }

   public static void convertCoefficients(String[] args) {
      System.out.println("Anzahl der eingegeben Werte: " + args.length);
      int n = (int) Math.sqrt(args.length);
      if(n*(n+1) !=  args.length) {
          System.out.println("Keine quadratische Matrix und Vektor eingegeben!!!");
          System.exit(1);
      }
      System.out.println(n + " * " + n + " Matrix");

      matrix = new double[n][n];
      vector = new double[n];

      // cast von String args nach double
      double[] b = new double[args.length];
      for (int i = 0; i < args.length; i++) {
         b[i] = Double.valueOf(args[i]).doubleValue();
      }

      // Wertzuweisung
      for(int i = 0; i < n*n; i++) {
         matrix[i/n][i%n] = b[i];
      }
      for(int i = n; i < args.length; i++) {
         vector[i%n] = b[i];
      }
      
      //Ausgabe
      System.out.println("Matrix:");
      for(int row = 0; row < n; row++) {
          System.out.println(Arrays.toString(matrix[row]));
      }
      System.out.println("Vektor:");
      System.out.println(Arrays.toString(vector));
   }
}
 
L

lobotaro

Gast
Landei: Ich habe mal aus Spaß deinen Code einfach versucht zu kompilieren und bekam folgendes:

javac SucheAlter.java
SucheAlter.java:1: cannot find symbol
symbol : class Arrays
location: class java.util
import java.util.Arrays;
^
SucheAlter.java:41: cannot find symbol
symbol : variable Arrays
location: class SucheAlter
System.out.println(Arrays.toString(matrix[row]));
^
SucheAlter.java:44: cannot find symbol
symbol : variable Arrays
location: class SucheAlter
System.out.println(Arrays.toString(vector));
^
3 errors

Nicht wegen dem Dateinamen wundern ;) Nee, aber war nicht das was ich suchte, da ich keine Fremdbibliotheken verwenden soll.

Ariol: Ja, das versuch ich gerade, aber so ganz krieg ich das auch noch nicht hin. Ich verzweifel wirklich noch an der Aufgabe...schon traurig irgendwie...
 

Landei

Top Contributor
du musst die Importanweisung schon mitschreiben. Arrays ist keine "Fremdbibliothek" sondern eine ganz normale Java-Klasse, genauso wie String (und den nimmst du ja auch). Aber wenn dir das nicht gefällt, kannst du dir den Code für die formatierte Ausgabe aus Arrays ja auch "borgen":
Code:
    public static String toString(Object[] a) {
        if (a == null)
            return "null";
        int iMax = a.length - 1;
        if (iMax == -1)
            return "[]";

        StringBuilder b = new StringBuilder();
        b.append('[');
        for (int i = 0; ; i++) {
            b.append(String.valueOf(a[i]));
            if (i == iMax)
                return b.append(']').toString();
            b.append(", ");
        }
    }
 
L

lobotaro

Gast
Boah, also das is mir für meinen Wissenstand derzeit echt noch viel zu schwierig, dann versuch ich's doch lieber mit einer zweiten Schleife außen rum, aber irgendwie klappt das immernoch nicht so richtig.

Mal was ich bisher habe, vermutlich total lustig anzuschauen für Leute die mehr Ahnung haben aber hey...

Code:
// Wertzuweisung
		int k = 0;
		int i = 0;
		int j = 0;
		while (j < n & k <= ewerte) {
			while (i < n) {
				matrix[i][j] = b[i + k];
				System.out.print(matrix[i][j] + " ");
				i++;
			}
		k += a1;
		j++;
		}
		System.out.println();
		
		for(int g = 0; g <= ewerte; g++, n = n+a1) {
			vector[g] = b[n];
			System.out.print(vector[g] + " ");
		}

Ich bin das auf dem Papier durchgegangen, und die Matrix müsste korrekt aufgefüllt werden, aber mir wird weiterhin nur die erste Zeile ausgegeben und ich weiß nicht was ich da noch probieren könnte...
 

nixcheck

Neues Mitglied
Also diese Aufgabe kommt mir sehr bekannt vor^^

lobotaro, du bist nicht zufällig von der Uni Erlangen? :p

Beim Problem selbst kann ich dir leider nicht weiterhelfen, weil ich noch weniger peil hab als du :/
 
L

lobotaro

Gast
Haha, erwischt ;) Ja nee, beruhigt mich aber irgendwie, dass ich nicht der einzige bin, den diese Aufgabe killt...
 

Landei

Top Contributor
Boah, also das is mir für meinen Wissenstand derzeit echt noch viel zu schwierig, dann versuch ich's doch lieber mit einer zweiten Schleife außen rum, aber irgendwie klappt das immernoch nicht so richtig.
Was gefällt dir nicht an meinem Code? Die Arrays-Klasse brauchst du doch gar nicht für die Wertzuweisung, und selbige ist einfach und funktioniert einwandfrei. Das einzige, was du noch wissen musst, ist dass bei ints die /-Division nur den ganzzahligen Anteil liefert und dass der %-Operator den Rest der Division ermittelt. Wenn du also ein 3x3 Array hast, und der Schleifenindex ist 5, liefert der 5/3 = 1 als Zeile (also die zweite Zeile, da wir ja mit 0 anfangen, und 5 % 3 = 2 (also die dritte Spalte). Alles klar?
 
L

lobotaro

Gast
Nee leider nicht alles klar, ich versteh deinen Code von Grund auf einfach nicht...z.B. versteh ich nicht wie ich die "Importanweisung mitschreiben" soll, wenn doch "import bla bla bla" für mich schon eine Importanweisung ist...und wo...außerdem weiß ich nicht welche Teile meines Codes ich durch deinen zweiten geposteten Code ersetzen soll/muss/kann und was mir dann noch fehlt. Es ist mir einfach noch viel zu kompliziert, wo ich doch bisher nur das Quadrat einer eingegeben Zahl und solche Scherze berechnet hab.

Wie gesagt, mir wäre WEITAUS lieber wenn man mir einfach sagt was ich an meiner zuletzt geposteten Schleife noch ändern müsste, damit es endlich passt.
 

Landei

Top Contributor
So'n Blödsinn, das Programm unter "Denkanstoß" funktioniert genau so wie es dasteht, aber bitte...
Code:
      int j = 0;
      while (j < n) {
          int i = 0;
          while (i < n) {
            matrix[i][j] = b[i + n*j];
            System.out.print(matrix[i][j] + " ");
            i++;
         }
         j++;
      }
      System.out.println();
      
      for(int g = 0; g <= n; g++) {
         vector[g] = b[n*n + g];
         System.out.print(vector[g] + " ");
      }
 
L

lobotaro

Gast
Nee, tut mir leid aber bei mir gab's beim kompilieren eine Fehlermeldung, wie oben beschrieben.

Ok gut...jetzt gibt's erstmal ein Danke, weil mir zumindest mal alle Werte ausgegeben werden ;)

Aber, zwei kleine Probleme noch...hier erstmal der aktuelle Code:

Code:
public class GaussElimination {

	static double[][] matrix;
	static double[] vector;
	
	public static void main(String[] args) {
		convertCoefficients(args);
	}
	
	public static void convertCoefficients(String[] args) {
		double[] a;
		a = new double[args.length];
		
		//Anzahl Eingabewerte
		int ewerte = 0;
		for (int i = 0; i < args.length; i++) {
			ewerte++;
		}
		
		//Anzahl Zeilen/Spalten
		int a1 = 0;					
		int n = ewerte - (a1 * a1);			
		for (int i = 0; i < n; i++) {	
			n = ewerte - (a1 * a1);
			a1++;
		}
		
		double[][]matrix = new double[n][n];
		double[]vector = new double[n];
		
		//Cast
		double[] b;
		b = new double[args.length];
		for (int i = 0; i < args.length; i++) {
		b[i] = Double.valueOf(args[i]).doubleValue();
		}
		
		//Wertzuweisung Matrix
		int j = 0;
		while (j < n) {
			int i = 0;
			while (i < n) {
				matrix[i][j] = b[i + a1*j];
				System.out.print(matrix[i][j] + " ");
				i++;
			}
		j++;
		}
		System.out.println();
		
		//Wertzuweisung Vektor
		for(int g = 0; g <= ewerte; g++, n = n+a1) {
			vector[g] = b[n];
			System.out.print(vector[g] + " ");
		}
	}
}

Und nun hier, was in der Konsole passiert:
$ java GaussElimination 1.9 2.36 3.13 4.8 5.2 6.74 7.94 8.11 9.9 10 11 12.7
1.9 2.36 3.13 5.2 6.74 7.94 9.9 10.0 11.0
4.8 8.11 12.7 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 15
at GaussElimination.convertCoefficients(GaussElimination.java:53)
at GaussElimination.main(GaussElimination.java:7)

Jetzt die Fragen...woher und warum kommen diese Fehlermeldungen und...wie mache ich es, dass mir die Matrix nicht wie oben als Zeile sondern eben als Matrix (wie im Ausgangsposting zu sehen) ausgegeben wird?
 
R

r4iki

Gast
warum kommt mir die aufgabe nur so bekannt vor? xD
ich habs zwar ganz anders als du, aber bei mir gehts auch net, bekomm auch so ne fehlermeldung und hab keinen plan, warum, hat wohl irgendwas damit zu tun, dass ich das array über ne for schleife abrufe, irgendwie geht des net. also sry, kann dir auch net weiterhelfen, aber sobald ich was weiß post ich mal nen denkanstoß ^^
 
Q

Quark

Gast
Joa, sitze ebenfalls seit Stunden an dem Teil und hab noch keine Lösung. Find das irgendwie hart das die erste richtige aufgabe zu klassen und arrays gleich son hammer is. Hoffe der Schwierigkeitsgrad der Aufgaben steigt net weiter exponentiell so an ^^
 
L

lobotaro

Gast
Wir sollten morgen eine Selbsthilfegruppe starten ;)

Ich hätte nur gerne endlich mal diese Aufgabe fertig, damit ich mich vollkommen auf die nächste konzentrieren kann, bei der ich selbstverständlich auch nicht mehr weiter komme...schon böse alles...
 
N

nikky

Gast
//Wertzuweisung Matrix

for (int j=0;j < n;j++) {
for (int i=0;i < n;i++) {
matrix[j] = b[i + a1*j];
System.out.print(matrix[j] + " ");
}
System.out.println();
}
System.out.println();

Wertzuweisung vom Vektor bekomm ich irgendwie net hin..
 
L

lobotaro

Gast
Wertzuweisung vom Vektor kannst du ja aus meinem Code klauen, würde dann auch stilistisch zu deinem passen.
 
Q

Quark

Gast
Okay, mit der Wertzuweisung von nikky in den Code von lobo~ eingebaut krieg ich die richtige Darstellung. Nun müssen nurnoch die Fehler am Ende verschwinden.

ArrayIndexOutOfBounds

heißt das irgendein Array zu klein is für die eingegebenen Werte, oder?
 

Marco13

Top Contributor
Das " :wink: " bei der "Selbsthilfegruppe" ist ungerechtfertigt: Ihr seid ja offenbar alle an der selben Uni. Schließt euch per PN kurz, und trefft euch, und besprecht das ganze mal.
 
Q

Quark

Gast
An sich gut, aber heute is sonntag und morgen um 10 uhr müssen wir das abgegeben haben, also nützt das hier nichtmehr so viel :( wir könnten ja ne große msn/icq-convo machen, haha ^^
 

Marco13

Top Contributor
Dann können sich ja bei den späteren Aufgaben immerhin noch (rechtzeitig vorher!!!) diejenigen treffen, die nicht schon wegen DIESER Aufgabe durch's Raster fallen .... :roll:
 
A

ar

Gast
Die Anzahl der Eingabewerte braucht ihr gar nicht. Man muss:
1. Zeilenzahl n berechnen (Tipp: n*(n+1) = args.length, da quadr. Gleichung)
2. passenden vector & matrix anlegen
3. strings -> double konvertieren, dafür die args in einer extra (eindimensionalen) Reihung speichern
4. Wertzuweisen aus der extra Reihung mittels zwei Schleifen (Hinweis: man benötigt noch eine Variable die Stelle der e.R. angibt, diese muss dementsprechend auch inkrementiert werden):
* Die Äußere gibt [*][] der Matrix an und füllt nach jeder Zeile dann die nächste vector-Stelle.
* Die Innere gibt [][*] der Matrix an.
5. Ausgabe von matrix geht nach (fast) selbigen for-Schleifenschema wie 4., vector braucht dann noch eine einfache for-Schleife selber.
 
A

ar

Gast
Wäre übrigens selber über Hilfe bei der 3.4 dankbar, die schein ich partout nicht lösen zu können...
 
R

r4iki

Gast
also über ne gruppe bilden wär kuhl, dann könnwa uns imma helfen wennwa es allein net schaffn :)
wir sollten mal icq nummern austauschen^^
 
L

lobotaro

Gast
Wäre definitiv eine sehr gute Idee...nur hier so öffentlich die Nummern reinposten is vielleicht nich so cool ;)

Ich schreib mir meine aber mal auf, wer mich morgen sieht (lange Haare, Zopf (wobei das ja eh standard is ;)) und höchstwahrscheinlich weißer Nike Kapuzenpulli, ansonsten schwarzer Kap.pulli von irgendner obskuren Band die keine Sau kennt ;)) kann mich ja mal anhaun...bin auch direkt vorher in der Mathe C1 Übung...

Zusammenfassung: Hässlicher Informatiker sucht Freunde...;)
 
G

Guest

Gast
Heyho, alles ich peil das hier auch nicht, und da dieses nächste Aufgabenblatt noch vieeel schlimmer ist, weiß ich ehrlich gesagt nicht, wie ich das schaffen soll. Finde das für Leute die vorher noch nie programmiert haben ziemlich unschaffbar, wenn sich also ein paar Leute finden würden um sich dann gemeinsam zu beraten, wär ich auf jeden Fall dabei.^^ Naja erstmal morgen in den Intensivübung...^^

Aufschreiben...^^ Icq Nummern kann man auswendig.^^
 
Q

Quark

Gast
okay,hab ganz neu angefangen und bin mit teilweise hier mal spicken soweit gekommen, dasses alles komplett richtig anzeigt...

nur nicht wenn ich ne "falsche" anzahl an parametern anfangs eingeb, dann kommt der outofbound-error :(

weiß einer wie man die parameter die zuviel sind ignorieren kann?
 
R

r4iki

Gast
das ist das mit dem hinweis, dass du eine for schleife erstellen sollst, der dir dann die maximal mögliche anzahl an parametern ausspuckt. nehm dir dabei zuhilfe, dass du eine nxn, d.h. i*i matrix hast ;)
 
Q

Quark

Gast
Danke, hatte das am Anfang irgendwie machen wollen aber dann vergessen und nur unvollständig hingeschrieben und nu richtig ergänzt ^^ Bin sogar ein bischen stolz auf mich nu :)
 
R

r4iki

Gast
jo ging mir genauso, hab das im ganzen gewühl dann total vergessen gehabt ^^ xD
 
Q

Quark

Gast
Hm, bei der 3.4 versteh ich garnet welche 2 Konstruktoren die meinen. Wollen die net einfach einen der die 2 Parameter die man übergibt als x und y einträgt?
 

aha

Mitglied
moin zusammen. Ich zähle mich auch zu den glücklichen. Ich bin jetzt auch in etwa soweit wie ihr, aber kriege auch diesen Outofbounds error und versuche mich gerade an dieser for schleife...

Zum Thema 3.4 bin ich mir auch nicht sicher @ Quark...
 
Q

Quark

Gast
inzwischen arbeite ich mich stück für stück vorran, aber komisch ohne ausgabe was zu programmieren. und eclipse zeigt seit vorhin irgendnen fehler bei mir an wenn ich das zeile für zeile ablaufen lassen will... ^^
 

aha

Mitglied
quark hast du ne icq nummer unter der man sich mal mit dir kurzschließen kann? Wenn ja meld dich mal bitte bei mir #190187267
 

Landei

Top Contributor
Nee, tut mir leid aber bei mir gab's beim kompilieren eine Fehlermeldung, wie oben beschrieben.

Ist zwar schon ein wenig her, aber nochmal zum Mitmeißeln:
Wenn du das
Code:
import java.util.Arrays;
ausnahmsweise nicht wegläßt, kompiliert und läuft das Programm. Wie kann man denn nur so... ach, ich lass es besser - elimiere deinen Gauss doch selber :p
 
L

lobotaro

Gast
Also entschuldige mal...ich hatte deinen Code inklusive "import blabla" 1 zu 1 in Eclipse kopiert und gespeichert.

Glaub doch was du willst...

Ich habs gerade nochmal versucht, diesmal werde ich von Eclipse aufgefordert den "unused import" zu entfernen...

Alternativ kann ich bei "System.out.println(Arrays.toString(matrix[row]));" das Argument entfernen damit es zu toString passt.

Aber nee, ich bin ja so... mh...ja was denn nun?
 

Landei

Top Contributor
Das Programm funktioniert einwandfrei in NetBeans und JBuilder (gerade nochmal probiert).

Was eventuell noch sein kann ist, dass Eclipse Probleme hat wenn das Programm in der Default-Package liegt, packe es mal in ein definiertes Package...
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben