Changes between Version 7 and Version 8 of c-intro


Ignore:
Timestamp:
Feb 20, 2009, 6:49:13 PM (16 years ago)
Author:
msitar
Comment:

Reševanje sistema linearnih enačb

Legend:

Unmodified
Added
Removed
Modified
  • c-intro

    v7 v8  
    476476== Reševanje sistema linearnih enačb ==
    477477
    478 
     478Sistem 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
     479dveh 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
     487Reš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{{{
     490u[0]= 1
     491u[1]= 2
     492u[2]= 3
     493u[3]= 4
     494u[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
     506float 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
     512float b[N]={8, 45, -3, 3, 19};
     513
     514int 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
     533Kodo za reševanje sistema linearnih enačb v jeziku C lupack.c uporabimo kot zunanje podprograme.
     534
     535Programe 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