/** Liest neue Knotendaten ein. Liefert true, wenn erfolgreich */ public boolean einlesen() { try { dx = Fkt.holZahl(felddx.getText()); dz = Fkt.holZahl(felddz.getText()); stabnr = Integer.parseInt(feldStabnr.getText()); F = Fkt.holZahl(feldN.getText()); } catch (IllegalArgumentException e) { System.out.println(e.toString()); return false; } if (stabnr <= 0 || stabnr > Stabliste.size()) { System.out.println(tr("Stabexistiertnicht")); return false; } if (dx == 0 && dz == 0) return false; vektor[0] = dx; vektor[1] = dz; return true; }
/** Creates new form clKnotenDialog */ public clguiFindeOrt( int p_nr, LinkedList knliste, LinkedList stliste, Fachwerk.treillis parent, Locale lc) { super(parent, "Knotenposition suchen", true); nr = p_nr; Knotenliste = knliste; Stabliste = stliste; kn = (clKnoten) Knotenliste.get(p_nr - 1); // übersetzen locale = lc; addinsRB = ResourceBundle.getBundle("Fachwerk/locales/gui-addins", locale); if (addinsRB == null) { System.err.println("FEHLER: gui-addins für " + locale.toString()); } // Ausgangskoordinaten merken ursprKoord[0] = kn.getX(); ursprKoord[1] = kn.getZ(); parentfw = parent; // Knoteninfos einleisen // Knoten-Nr nrstr = Integer.toString(nr); // bisherige Koord xstr = Double.toString(kn.getX()); zstr = Double.toString(kn.getZ()); // Falls der Knoten belastet ist: Lastrichtung vorschlagen if (kn.getLx() != 0 || kn.getLz() != 0) { double L[] = new double[2]; L[0] = Math.abs(kn.getLx()); L[1] = Math.abs(kn.getLz()); double normierung = Fkt.max(L); dxstr = Double.toString(kn.getLx() / normierung); dzstr = Double.toString(kn.getLz() / normierung); } initComponents(); felddx.setText(dxstr); felddz.setText(dzstr); übersetzen(); pack(); zentriere(parent); setVisible(true); }
public int print(Graphics graphics, PageFormat pageformat, int pageIndex) throws PrinterException { if (pageIndex >= 1) return Printable.NO_SUCH_PAGE; this.pf = pageformat; g = (Graphics2D) graphics; g.scale(printskal, printskal); // auf den sichtbaren Bereich ausrichten g.translate(pf.getImageableX() / printskal, pf.getImageableY() / printskal); // ----------------- // 1. Teil: Graphik // ----------------- antVertikal = antGraph; antHorizontal = 1.0d; schriftgrStd = (int) (schriftgrGraph / printskal); double zusRandabst = 2d * schriftgrText; if (MIT_Lasten || MIT_Auflagerkräften) zusRandabst = maxPfeil; // ----------------------------- // Intermezzo: Massstab abfragen // ----------------------------- if (!MASSSTABABGEFRAGT) { if (ZOOMALL) koord = new clKoord(ZoomPkt1, ZoomPkt2, this, zusRandabst); else koord = new clKoord(ZoomPkt1, ZoomPkt2, this); // maximalen Massstab bestimmen double minzoomfaktor = koord.m(dpi / zoll); // Massstab abfragen clPrintGraphDialog dialog = new clPrintGraphDialog(parent, minzoomfaktor, locale); if (dialog.abgebrochen()) throw new PrinterException( tr("druckenabgebrochen")); // return Printable.NO_SUCH_PAGE; // abgebrochen einheit = dialog.getEinheit(); mst = dialog.getMst(); // debug // mst = 100d; MASSSTABABGEFRAGT = true; // debug // System.out.println("minzoomfaktor " + Fkt.nf(minzoomfaktor,1)); // System.out.println("Massstab 1:" + Fkt.nf(mst,1) + " Einheit " + Fkt.nf(einheit,3) + "m"); } koord = new clKoord(ZoomPkt1, ZoomPkt2, this, true, einheit * (dpi / zoll) / mst); // debug // System.out.println("mst " + Fkt.nf(mst,1)); g.setPaint(Color.black); if (Kn != null) { if (MIT_Hintergrund) darstellenHintergrund(); darstellenFachwerk(true); if (MIT_KnNr) darstellenKnNr(); if (MIT_StabNr) darstellenStabNr(); if (MIT_Lasten) darstellenLasten(MIT_Stabkräften); if (MIT_Auflagerkräften) darstellenAuflagerkräfte(MIT_Stabkräften); if (MIT_Stabkräften) darstellenStabkräfte(); if (MIT_Mechanismus) darstellenMechanismus(); } // ------------------------- // 2. Teil: Text // ------------------------- g.translate(0d, antGraph * pf.getImageableHeight() / printskal); antVertikal = antTxt; antHorizontal = 1.0d; double Feldhöhe = antVertikal * pf.getImageableHeight() / printskal; double Feldbreite = antHorizontal * pf.getImageableWidth() / printskal; int anzmöglzeilen = 2; // mind. eine Zeile am Schluss freilassen int anzmöglbuchst = 30; int schriftgr = schriftskal( Feldhöhe, Feldbreite, anzmöglzeilen, anzmöglbuchst, (int) (schriftgrText / printskal)); float za = (float) faktorza * (float) schriftgr; g.setFont(new Font("Monospaced", Font.PLAIN, schriftgr)); // Zoomfaktor bestimmen double zoomfaktor = koord.m(dpi / zoll) * einheit; g.drawString("1 : " + Fkt.nf(zoomfaktor, 1), 0f, (float) schriftgr + 1f * za); // drucken paint(g); // schongedruckt = true; return Printable.PAGE_EXISTS; }
/** * Gibt die Lösung x des Gleichungssystems zurück: nur eindeutige (d.h. parameterunabhängige xi) * werden zurückgegeben. index 0: Wert = 0 bedeutet xi unbestimmt, Wert = 1 bedeutet xi bestimmt * index 1: eigentlicher Wert (nur wenn xi bestimmt, dh index 0 = 1, sonst Wert 0) */ public final double[][] solve() throws ArithmeticException { // -------------------------------------------------------------------------- // EIGENTLICHER SOLVER für bestimmte Lösungsvariablen in unbestimmen Systemen // -------------------------------------------------------------------------- int gebrauchteUnbestParam = 0; x = new double[A.columns()] [2 + anzUnbestParam]; // Status 1 (bestimmt), kN, alpha, beta (Parameter) int z = A.rows() - 1; // Zeilenvariable, beginnt zuunterst // Gleichungen mit lauter Nullen while (R.viewRow(z).cardinality() == 0 // nachfolgende Tests massgebend, dieser jedoch schnell || (Fkt.max(R.viewRow(z).toArray()) < TOL && Fkt.min(R.viewRow(z).toArray()) > -TOL)) { double cwert; if (z < c.rows()) cwert = c.get(z, 0); else cwert = 0; if (Math.abs(cwert) > TOL) { System.out.println("widersprüchliche Gleichungen im System! Zeile " + z); throw new ArithmeticException("Widerspruch im Gleichungssystem!"); } z--; if (z <= 0) { System.out.println("lauter Nullen im GLS"); break; } } // Verarbeiten der Gleichungen (von unten her) for (z = z; z >= 0; z--) { // finde erste nicht-Null in Zeile (Pivot) int p = -1; // Pivot: erste Zahl welche nicht null ist pivotfinden: for (int i = 0; i < R.columns(); i++) { if (Math.abs(R.get(z, i)) > TOL) { // Versuch, numerische Probleme (Überbestimmtheit) zu vermeiden p = i; break pivotfinden; } } // Fall Kein Pivot gefunden (d.h. linker Teil der Gleichung aus lauter Nullen) if (p < 0) { if (debug) System.out.println("Warnung: kein Pivot gefunden in Zeile " + z); // Kontrolle, ob rechte Seite (c) auch null --> ok, sonst Widerspruch im GLS if (Math.abs(c.get(z, 0)) > TOL) { System.out.println("widersprüchliche Gleichungen im System! Zeile " + z); throw new ArithmeticException("Widerspruch im Gleichungssystem!"); } else { if (debug) System.out.println("Entwarnung: Zeile " + z + " besteht aus lauter Nullen (ok)"); continue; } } // kontrollieren, ob es in der Gleichung (Zeile) eine neue Unbestimmte Variable (i.d.R. Pivot) // hat. boolean alleVarBestimmt = true; int effPivot = p; // effektiver Pivot (1. Unbestimmte Variable der Zeile), i.d.R. Pivot for (int i = p; i < R.columns(); i++) { if (x[i][0] == 0 && Math.abs(R.viewRow(z).get(i)) > TOL) { alleVarBestimmt = false; effPivot = i; // i.d.R. effPivot=p, aber nicht immer. break; } } if (alleVarBestimmt) { // alle Variablen (inkl.Pivot) schon bestimmt! // CHECKEN, ob (Zeile "+z+") nicht widersprüchlich double[] kontrolle = new double[1 + anzUnbestParam]; for (int j = 0; j < kontrolle.length; j++) kontrolle[j] = 0; for (int i = p; i < R.columns(); i++) { for (int j = 0; j < kontrolle.length; j++) { kontrolle[j] += R.viewRow(z).get(i) * x[i][j + 1]; } } kontrolle[0] -= c.get(z, 0); // TODO TESTEN! boolean alleParamNull = true; int bekParam = -1; // Parameter der aus der Gleichung bestimmt werden kann. for (int j = kontrolle.length - 1; j > 0; j--) { if (Math.abs(kontrolle[j]) > TOL) { alleParamNull = false; if (bekParam < 0) bekParam = j; } } // Überprüfen, ob Gleichung widersprüchlich ist if (alleParamNull) { // TODO ev. nochmals prüfen ob alle 0 mit geringerer Toleranz (Problem // fastNull*Param ≠ 0 könnte bedeuten dass Param = 0). Zumindestens // wenn noch Parameter zu vergeben. double obnull = Math.abs(kontrolle[0]); if (obnull > TOL) { System.out.println(""); System.out.println( "Widerspruch im Gleichungssystem! (Zeile " + z + ") " + obnull + " ungleich 0"); // TODO: URSPRÜNGLICH ZEILE (piv) ANGEBEN! System.out.println("eventuell numerisches Problem"); throw new ArithmeticException("Widerspruch im Gleichungssystem!"); } else continue; // nächste Gleichung } // else // Ein schon vergebener Parameter kann ausgerechnet werden // Schlaufe über bisherige Lösung assert bekParam > 0; for (int xi = 0; xi < x.length; xi++) { double faktor = x[xi][1 + bekParam]; if (Math.abs(faktor) < TOL) continue; // Einsetzen assert x[xi][0] > 0; // bestimmt for (int j = 0; j < kontrolle.length; j++) { if (j != bekParam) { x[xi][j + 1] += -kontrolle[j] * faktor / kontrolle[bekParam]; } } } for (int xi = 0; xi < x.length; xi++) { // Parameter nachrutschen if (bekParam < anzUnbestParam) { // d.h. nicht der letzte zu vergebende Parameter. for (int j = bekParam; j < anzUnbestParam; j++) { x[xi][j + 1] = x[xi][j + 2]; x[xi][j + 2] = 0; } } else x[xi][bekParam + 1] = 0; } if (debug) System.err.println( "VORSICHT, wenig GETESTETES Modul des Solvers im Einsatz."); // TODO Warnung // entfernen, da // vermutlich i.O. gebrauchteUnbestParam--; } // Normalfall, unbestimmter (effektiver) Pivot vorhanden else { // unbekannte x[effPivot][1] = c.get(z, 0) / R.viewRow(z).get(effPivot); for (int i = R.columns() - 1; i >= p; i--) { // R.Spalten, da dies AnzUnbek x entspricht if (i == effPivot) continue; if (x[i][0] == 0) { // unbestimmt, aber nicht Pivot if (Math.abs(R.viewRow(z).get(i)) > TOL) { // TODO testen!!! if (gebrauchteUnbestParam >= anzUnbestParam) { System.err.println( "Programmfehler in solver: gebrauchteUnbestParam >= anzUnbestParam"); throw new AssertionError( "Programmfehler in solver: gebrauchteUnbestParam >= anzUnbestParam"); } x[i][gebrauchteUnbestParam + 2] = 1; // neuer Parameter (alpha, beta) setzen x[i][0] = 1; // bestimmt (auch wenn von Parameter abhängig). gebrauchteUnbestParam++; } } x[effPivot][1] += -R.viewRow(z).get(i) * x[i][1] / R.viewRow(z).get(effPivot); for (int j = 0; j < gebrauchteUnbestParam; j++) { x[effPivot][2 + j] += -R.viewRow(z).get(i) * x[i][2 + j] / R.viewRow(z).get(effPivot); } } x[effPivot][0] = 1; } } if (debug) { System.out.println(""); for (int i = 0; i < x.length; i++) { System.out.print("x" + i + " = " + Fkt.nf(x[i][1], 3)); for (int j = 2; j < x[i].length; j++) { System.out.print(", P" + (j - 1) + " = " + Fkt.nf(x[i][j], 3)); } System.out.println(""); } } // ------------------ // Lösung zurückgeben // ------------------ // Lösung x: nur eindeutige (d.h. parameterunabhängige xi) werden zurückgegeben // index 0: Wert = 0 bedeutet xi unbestimmt, Wert = 1 bedeutet xi bestimmt // index 1: eigentlicher Wert (nur wenn xi bestimmt, dh index 0 = 1, sonst Wert 0) xLsg = new double[R.columns()][2]; for (int i = 0; i < x.length; i++) { boolean bestimmt; if (x[i][0] > 0) { bestimmt = true; // schauen, ob Lösungsvariable xi bestimmt, dh unabhängig von überzähligen Parametern for (int j = 2; j < x[i].length; j++) { if (Math.abs(x[i][j]) > TOL) bestimmt = false; } } else bestimmt = false; if (bestimmt) { xLsg[i][0] = 1; xLsg[i][1] = x[i][1]; } else xLsg[i][0] = 0; } solved = true; return xLsg; }