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 | |