Schreiben Sie ein Programm, um eine Reihe von linearen Gleichungen so kurz wie möglich zu lösen. Es muss eine beliebige Anzahl von Gleichungsproblemen lösen. Sie können eingegeben werden, wie Sie möchten. Die Koeffizienten der erweiterten Matrix sind wahrscheinlich am einfachsten. Das Programm muss keine nicht ganzzahligen Koeffizienten oder Lösungen verarbeiten. Es werden keine entarteten oder ungültigen Fälle getestet. Das Programm muss den Wert jeder Variablen oder reduzierten Zeilenebenenform ausgeben.
Es sind keine Gleichungslösungsbibliotheken, Matrixfunktionen oder Möglichkeiten zur automatischen Lösung zulässig. Sie können Matrizen mit Arrays oder Listen simulieren.
Beispieleingabe (oder gleichwertig):
m={{2,1,-1,8},{-3,-1,2,-11},{-2,1,2,-3}}
Dies stellt dar 2x+y-z=8, -3x-y+2z=-11, -2x+y+2z=-3
Beispielausgabe (oder gleichwertig):
{2,3,-1}
Dies stellt dar x=2, y=3, z=-1
0x=0
oder0x=5
; 4) Fälle, in denen sich die Anzahl der Gleichungen von der Anzahl der Variablen unterscheidet; 5) Widersprüchliche Fälle wiex+5y=7, x+5y=8
; 6) Fälle ohne lineare Unabhängigkeit, wie zx+3y=6, 2x+6y=12
. Habe ich recht?Antworten:
Python
169166Implementierung
Demo
Hinweis
Wenn Sie mit der Float-Näherung einverstanden sind, können Sie den runden Funktionsaufruf entfernen und weiter auf 159 Zeichen spielen
quelle
APL, 1 Zeichen
Ich weiß, dass es nicht den (überarbeiteten) Anforderungen entspricht, aber es ist zu gut, um nichts zu posten:
Das Symbol "Domino"
⌹
(Division÷
innerhalb eines Rechtecks) führt eine Matrixdivision durch und kann daher jedes lineare Gleichungssystem lösen. Sie müssen es nur zwischen den konstanten Termvektor und die Matrix mit den anderen Begriffen setzen:(Wenn Sie es auf TryApl ausprobieren möchten,
⊃
ist↑
)quelle
Javascript (
284181) - Gauß-EliminierungsmethodePrüfung
Das zurückgegebene Array kombiniert die Identitätsmatrix und die Lösung.
quelle
l=A.length;for(i=0;i<l;i++)
Gebrauchfor(i=0;i<l=A.length;i++)
.for(i=l-1;i>=0;i--)
Gebrauchfor(i=l;--i;)
.w=A[j][i]
infor()
und überspringen{}
um.Diese Antwort passt nach der Regeländerung nicht mehr zur Frage, da eine Matrixfunktion verwendet wird. * *
Salbei , 32
Beispieleingabe:
Beispielausgabe:
* Ist wohl
matrix()
ein Typecast, keine Funktion (Runningimport types; isinstance(matrix, types.FunctionType)
gibtFalse
). Auch die~
und*
sind Operatoren , keine Funktionen.quelle
Java -
522434228213 ZeichenLöst durch systematisches Überprüfen aller möglichen ganzzahligen n-Tupel durch direkte Multiplikation, bis eines gefunden wird, das funktioniert.
Die Funktion verwendet die erweiterte Matrix A, den Versuchslösungsvektor x und die Dimension n als Eingabe-Ausgabe-Lösungsvektor x. Beachten Sie, dass der Vektor x tatsächlich eins größer als die Dimension ist, um mögliche Lösungen zu durchlaufen. (Wenn ich die Variablen A, x, n, j, k, s als Instanzvariablen deklarieren würde, wäre die Funktion 31 Zeichen kürzer - für insgesamt 182, aber das fühlt sich an, als würde man die Regeln zu weit biegen.)
Testprogramm (etwas ungolfed):
Das Programm nimmt Eingaben von stdin als durch Leerzeichen getrennte Ganzzahlen wie folgt entgegen: erstens die Dimension des Problems, zweitens die zeilenweisen Einträge der erweiterten Matrix.
Probelauf:
Ich habe mehrere Zeichen rasiert, indem ich Victors Ratschlägen zu Loops und "public" gefolgt bin, die RHS in der erweiterten Matrix anstatt separat gespeichert und meiner Testlösung einen zusätzlichen Eintrag hinzugefügt habe, um die Generierung jeder neuen Testlösung zu vereinfachen. Das OP sagte auch, dass eine Funktion ausreicht - es ist nicht erforderlich, das gesamte Programm zu zählen.
quelle
while(true){f=0;for(j=0;j<n;j++)
kann ersetzt werden durchwhile(true){for(f=j=0;j<n;j++)
. Außerdem muss Ihre Klasse nicht öffentlich sein. For-Loops mit nur einer Anweisung im Körper benötigen keine geschweiften Klammern.for(j=0;j<n;j++){for(k=0;k<n;k++){A[j][k]=p.nextInt();}b[j]=p.nextInt();}
kann ersetzt werden durchfor(j=0;j<n;b[j++]=p.nextInt())for(k=0;k<n;)A[j][k++]=p.nextInt();
while(true)
kann geändert werden zufor(;;)
JavaScript (ES6),
152151 ByteImplementierung der Cramer-Regel .
(m)(v)
Probieren Sie es online aus!
quelle