Écrivez un programme pour résoudre une série d'équations linéaires aussi courte que possible. Il doit résoudre un nombre arbitraire de problèmes d'équations. Ils peuvent être saisis comme vous le souhaitez, les coefficients de matrice augmentée sont probablement les plus faciles. Le programme n'a pas à gérer les coefficients ou les solutions non entiers. Aucun cas dégénéré ou invalide ne sera testé. Le programme doit afficher la valeur de chaque forme d'échelon de ligne variable ou réduite.
Aucune bibliothèque de résolution d'équations, fonctions matricielles ou aucun moyen de résolution automatique n'est autorisé. Vous pouvez simuler des matrices avec des tableaux ou des listes.
Exemple d'entrée (ou équivalent):
m={{2,1,-1,8},{-3,-1,2,-11},{-2,1,2,-3}}
Cela représente 2x+y-z=8, -3x-y+2z=-11, -2x+y+2z=-3
Exemple de sortie (ou équivalent):
{2,3,-1}
Cela représente x=2, y=3, z=-1
0x=0
ou0x=5
; 4) Cas où le nombre d'équations est différent du nombre de variables; 5) Des cas contradictoires commex+5y=7, x+5y=8
; 6) Cas sans indépendance linéaire, commex+3y=6, 2x+6y=12
. Ai-je raison?Réponses:
Python
169166la mise en oeuvre
Démo
Remarque
Si vous êtes d'accord avec l'approximation du flotteur, vous pouvez supprimer l'appel de la fonction ronde et continuer le golf à 159 caractères
la source
APL, 1 caractère
Je sais que cela ne correspond pas aux exigences (révisées), mais il est trop bon de ne pas publier:
Le symbole "domino"
⌹
(division à l'÷
intérieur d'un rectangle) effectue une division matricielle, il peut donc résoudre tout système d'équations linéaires. Il suffit de le mettre entre le vecteur à terme constant et la matrice avec les autres termes:(si vous voulez l'essayer sur TryApl,
⊃
c'est↑
)la source
Javascript (
284181) - Méthode d'élimination de GaussTester
Le tableau renvoyé combine la matrice d'identité et la solution.
la source
l=A.length;for(i=0;i<l;i++)
utilisationfor(i=0;i<l=A.length;i++)
.for(i=l-1;i>=0;i--)
utilisationfor(i=l;--i;)
.w=A[j][i]
dansfor()
et sauter{}
autour.Cette réponse ne correspond plus à la question après le changement de règle car elle utilise une fonction matricielle. *
Sauge , 32
Exemple d'entrée:
Exemple de sortie:
* Sans doute,
matrix()
est un transtypage, pas une fonction (l'exécutionimport types; isinstance(matrix, types.FunctionType)
donneFalse
). En outre, la~
et*
sont les opérateurs , pas de fonctions.la source
Java -
522434228213 caractèresRésout en vérifiant systématiquement tous les n-tuples entiers possibles par multiplication directe jusqu'à ce que l'on trouve un qui fonctionne.
La fonction prend la matrice augmentée, A, le vecteur de solution d'essai, x, et la dimension, n, comme vecteur de solution d'entrées-sorties, x. Notez que le vecteur x est en fait un plus grand que la dimension pour vous aider à parcourir les solutions possibles. (Si je déclarais les variables A, x, n, j, k, s comme variables d'instance, la fonction serait de 31 caractères plus courte - pour un total de 182, mais cela donne l'impression de trop plier les règles.)
Programme de test (quelque peu non golfé):
Le programme prend les entrées de stdin sous forme d'entiers séparés par des espaces comme suit: premièrement, la dimension du problème, deuxièmement, les entrées de la matrice augmentée par ligne.
Exemple d'exécution:
J'ai rasé plusieurs caractères en suivant les conseils de Victor sur les boucles et le "public", en stockant le RHS dans la matrice augmentée au lieu de séparément, et en ajoutant une entrée supplémentaire à ma solution d'essai pour simplifier la génération de chaque nouvelle solution d'essai. L'OP a également déclaré qu'une fonction est suffisante - pas besoin de compter l'ensemble du programme.
la source
while(true){f=0;for(j=0;j<n;j++)
peut être remplacé parwhile(true){for(f=j=0;j<n;j++)
. De plus, votre classe n'a pas besoin d'être publique. Les boucles pour avec une seule instruction dans le corps n'ont pas besoin des accolades.for(j=0;j<n;j++){for(k=0;k<n;k++){A[j][k]=p.nextInt();}b[j]=p.nextInt();}
peut être remplacé parfor(j=0;j<n;b[j++]=p.nextInt())for(k=0;k<n;)A[j][k++]=p.nextInt();
while(true)
peut être changé enfor(;;)
JavaScript (ES6),
152151 octetsMise en œuvre de la règle de Cramer .
(m)(v)
Essayez-le en ligne!
la source