Fişierul intrare/ieşire:gauss.in, gauss.outSursăArhiva Educationala
AutorArhiva EducationalaAdăugată deGavrilaVladGavrila Vlad GavrilaVlad
Timp execuţie pe test0.2 secLimită de memorie6144 kbytes
Scorul tăuN/ADificultateN/A

Vezi solutiile trimise | Statistici

Algoritmul lui Gauss

Se da un sistem de N ecuatii liniare cu M necunoscute. Notam necunoscutele cu xi, 1 ≤ i ≤ M. Sa se determine, daca acest lucru este posibil, un set de valori ale necunoscutelor pentru care fiecare ecuatie este adevarata. Sistemul va fi dat sub forma unei matrici A cu N linii si M+1 coloane. Pe linia i a acestei matrici se va afla descrierea ecuatiei cu numarul i din sistem, astfel: Ai,1 * x1 + Ai,2 * x2 + ... + Ai,M * xM = Ai,M+1.

Date de intrare

Pe prima linie a fişierului de intrare gauss.in se vor afla numerele N si M cu semnificatia din enunt. Pe urmatoarele N linii se vor afla cate M+1 intregi, descriind matricea A.

Date de ieşire

În fişierul de ieşire gauss.out se vor afisa M numere reale, cu precizia de 8 zecimale, reprezentand valorile sirului x, in cazul in care sistemul are solutie. In caz contrar, se va afisa mesajul "Imposibil".

Restricţii şi precizări

  • 1 ≤ N, M ≤ 300
  • -1000 ≤ Ai,j ≤ 1000
  • Solutia va fi considerata corecta daca, pentru fiecare i, 1 ≤ i ≤ N, rezultatul expresiei Ai,1 * x1 + Ai,2 * x2 + ... + Ai,M * xM difera prin maxim 0.001 de Ai,M+1.
  • Se recomandă afişarea rezultatului cu o precizie de 10-10
  • Dacă sunt mai multe soluţii posibile, oricare varianta corecta va fi acceptata.

Exemplu

gauss.ingauss.out
3 3
2 1 -1 8
-3 -1 2 -11
-2 1 2 -3
2.00000000 3.00000000 -1.00000000
2 2
1 1 2
2 2 4
0.50000000 1.50000000

Explicatie

  • 2 * 2 + 1 * 3 + (-1) * (-1) = 4 + 3 + 1 = 8
  • (-3) * 2 + (-1) * 3 + 2 * (-1) = -6 - 3 - 2 = -11
  • (-2) * 2 + 1 * 3 + 2 * (-1) = -4 + 3 - 2 = -3

Pentru exemplul 2 exista o infinitate de soluţii, o alta soluţie corecta este: 1.00000000 1.00000000

Indicatii de rezolvare

Eliminarea Gaussiana este cel mai folosit algoritm pentru rezolvarea sistemelor de ecuatii liniare. Metoda reduce succesiv ecuatiile, lasand matricea initiala sub o forma din care vom putea afla usor valorile necunoscutelor. Astfel, notand cu pi pozitia celui mai din stanga coeficient nenul de pe linia i, algoritmul garanteaza obtinerea urmatoarului sir de relatii: p1 < p2 < ... < pN (1). Aceste pozitii vor fi chiar indicii necunoscutelor fixe, cele care pot lua o singura valoare pentru ca sistemul sa aiba in continuare solutie. Celelalte necunoscute, ale caror indici nu se regasesc printre aceste pozitii, pot lua orice valoare si se numesc variabile libere. Pentru a usura calculele, vom considera in continuare ca acestea iau valoarea 0.

In continuare vom descrie algoritmul propriu-zis. Pornim cu un indice pentru linii, sa-l notam i, si un indice pentru coloane, j, initializate initial cu 1. Cautam pe coloana j, o linie x, i ≤ x astfel incat Ax,j ≠ 0. Daca aceasta linie nu exista, inseamna ca necunoscuta cu indicele j este variabila libera, iar noi incrementam indicele j. Altfel, interschimbam liniile i si x si impartim toata ecuatia de pe linia i la Ai,j, pentru a face coeficientul Ai,j egal cu 1, usurand calculele urmatoare. In continuare vom scadea, din toate ecuatiile u, i < u, ecuatia i inmultita cu o valoare zu, astfel incat toti coeficientii Au,j sa devina 0. Avem astfel Au,j - zu * Ai,j = 0 => zu = Au,j / Ai,j, dar cum Ai,j = 1, zu = Au,j. Aceasta reducere este necesara pentru respectarea conditiei (1), avand in vedere ca nu putem avea x ≠ i cu px = pi. Incrementam pe i si j si reluam procedeul de la inceput. Algoritmul se incheie cand i > N sau j > M. Complexitatea acestuia este O(N3) ca timp si O(N2) ca memorie.

Acum matricea respecta relatia (1) si putem incepe sa calculam valorile necunoscutelor. Luam ecuatiile in ordine de la N spre 1, gasim pozitia pi, iar xpi va fi dat de relatia xpi = Ai,M+1 - Ai,M * xM - Ai,M-1 * xM-1 - ... - Ai,pi+1 * xpi+1. Relatia (1) ne garanteaza ca xpi+1, xpi+2, ... , xM vor fi calculate anterior. Daca pe parcurs gasim o linie de forma (0, 0, 0, ... , 0, X) (doar rezultatul ecuatiei este nenul), sistemul nu are solutie.

O implementare de 100 de puncte gasiti aici. Acest algoritm poate fi aplicat cu succes pentru sisteme de ecuatii in care coeficientii, necunoscutele si rezultatele sunt doar 0 si 1, iar operatorul + din ecuatii este inlocuit de XOR.

Probleme propuse

Trebuie sa te autentifici pentru a trimite solutii. Click aici

Cum se trimit solutii?

remote content