| 478 | | |
| | 478 | Sistem linearnih enačb lahko rešujemo na različne načine. Klasična Gaussova eliminacijska metoda se pri konkretnih problemih pokaže kot počasna (N^3^ operacij). Predlagana metoda, ki se v praksi tudi največ uporablja za reševanje sistema enačb je ''Lower/Upper'' dekompozicija, ki ima časovno zahtevnost 1/3N^3^. Reševanje sistema po tej metodi se sestoji iz |
| | 479 | dveh korakov: |
| | 480 | |
| | 481 | 1. '''decomposition''', ki razdeli matriko '''M''' na dve matriki (zgornja / spodnja), katerih produkt je '''M'''. |
| | 482 | Obe matriki sta shranjeni v matriki '''M''', le da je zgornji del matrike '''M''' matrika '''U''', spodnji pa matrika '''L'''. |
| | 483 | |
| | 484 | 2. '''backsubstitution''', ki množi desno stran enačbe z zgornjo |
| | 485 | matriko in pri tem izračuna neznane linearne spremenljivke. |
| | 486 | |
| | 487 | Rešujemo sistem enačb velikosti ''N''. Matrika ''M'' predstavlja levo stran sistema enačb. ''N'' opisuje velikost matrike ''M''. ''indx'' je celoštevilčni vektor permutacij v matriki ''M'' in se prenaša naprej v podprogram ''lubksb'', kateri zahteva še desno stran sistema enačb v vektorju ''u''. Po izračunu se rezultat nahaja v vektorju ''u''. Prejšnje vrednosti matrike ''M'' in vektorja ''u'' se ne ohranijo! Potek izračuna sistema linearnih enačb prikazuje naslednji primer, ki izpiše rezultat: |
| | 488 | |
| | 489 | {{{ |
| | 490 | u[0]= 1 |
| | 491 | u[1]= 2 |
| | 492 | u[2]= 3 |
| | 493 | u[3]= 4 |
| | 494 | u[4]= 5 |
| | 495 | }}} |
| | 496 | |
| | 497 | {{{ |
| | 498 | #!c |
| | 499 | /****** M*u=b ******/ |
| | 500 | #include <stdio.h> |
| | 501 | #include <stdlib.h> |
| | 502 | #include "lupack.h" |
| | 503 | |
| | 504 | #define N 5 |
| | 505 | |
| | 506 | float M[N*N]={2, 3, 0, 0, 0, |
| | 507 | 3, 0, 4, 0, 6, |
| | 508 | 0, -1, -3, 2, 0, |
| | 509 | 0, 0, 1, 0, 0, |
| | 510 | 0, 4, 2, 0, 1}; |
| | 511 | |
| | 512 | float b[N]={8, 45, -3, 3, 19}; |
| | 513 | |
| | 514 | int main() |
| | 515 | { |
| | 516 | int i; |
| | 517 | int *indx; |
| | 518 | float d; |
| | 519 | |
| | 520 | indx=(int *)malloc(N*sizeof(int)); |
| | 521 | ludcmp(M, N, indx, &d); |
| | 522 | lubksb(M, N, indx, b); |
| | 523 | free(indx); |
| | 524 | |
| | 525 | for(i=0;i<N;i++) |
| | 526 | { |
| | 527 | printf("u[%d]= %g\n", i, b [i]); |
| | 528 | } |
| | 529 | return 0; |
| | 530 | } |
| | 531 | }}} |
| | 532 | |
| | 533 | Kodo za reševanje sistema linearnih enačb v jeziku C lupack.c uporabimo kot zunanje podprograme. |
| | 534 | |
| | 535 | Programe lahko dobimo s klikom na naslednje povezave: |
| | 536 | |
| | 537 | [http://www.lecad.uni-lj.si:8000/vaje/attachment/wiki/c-intro/example-lin.c example-lin.c] - ''Primer reševanja sistema linearnih enačb'' |
| | 538 | |
| | 539 | [http://www.lecad.uni-lj.si:8000/vaje/attachment/wiki/c-intro/lupack.c lupack.c] - ''Obvezen dokument za reševanje sistema linearnih enačb'' |
| | 540 | |
| | 541 | [http://www.lecad.uni-lj.si:8000/vaje/attachment/wiki/c-intro/lupack.h lupack.h] - ''Obvezen dokument za reševanje sistema linearnih enačb'' |
| | 542 | |
| | 543 | |
| | 544 | |