Newsgroup: it.comp.lang.pascal
Titolo: SISTEMI LINEARI

Ciao a tutti.
 Ho fatto un programma (in Pascal) per la risoluzione dei sistemi lineari di
3 equazioni in 3 incognite con il teorema di Rouchè-Capelli...
E' un po' lungo in quanto deve calcolare i determinanti delle varie matrici
però
è tutto ben spiegato...
Se a qualcuno interessa me lo dica che glielo faccio avere...
Se no lo posto direttamente qua sul news se si può...
Grazie dell'attenzione. Ciao a tutti...

 è tutto ben spiegato...
e io l'ho fatto in delphi... prrrrrrrrrr :-))))
scherzo, scherzo. cmq vorrei chiederti di postare solo la parte che calcola
la matrice dei determinanti, io ti posto la mia, tanto per confrontarli, ok?
  for K:=1 to 3 do
  begin
     if k=1 then AX:=2
               else AX:=1;
     CX:=6-AX-K;         {fino a qua mi calcolo gli indici ax e cx}
     for j:=1 to 3 do
     begin
        if j=1 then BX:=2
                 else BX:=1;
        DX:=6-BX-j;       {fino a qua calcolo gli indici bx e dx}
        DetAT[j,k]:=(A[ax,bx]*A[cx,dx]-A[ax,dx]*A[cx,bx]);  {calcolo il
determinante che si trovera' nella posizione DetAT[j,k], sfruttando gli
indici calcolati in precedenza}
        if ((k+j)mod 2)<>0 then DetAT[j,k]:=-1*DetAT[j,k];    {se la somma
degli indici e' dispari, allora rendo negativo il determinante}
     end;
  end;
mettiamo una bella legenda:
K,J: contatori dei for
Ax,Bx,Cx,Dx: indici della matrice
DetAT: matrice trasposta che conterra' i determinanti della matrice A
in ingresso ho la matrice A, di cui devo calcolare i determinanti. in uscita
avro' la matrice  DetAT che sara' la trasposta della matrice dei
determinanti della matrice A
--
Ciao
Gianfranco Marchese
e-mail dgruma@NOPUBBLICITA'
tin.it
 (Da togliere NOPUBBLICITA' se vuoi
rispondermi in privato)
sito internet personale: 
http://www.turbo-pascal.cjb.net
  Tutto sul Turbo
Pascal  1.5

   end;
già che c'eri potevi farlo in asm...
comunque ciao
e poi mi spiegherai bene come hai fatto tu che non c'ho capito molto...
bella...

 e poi mi spiegherai bene come hai fatto tu che non c'ho capito molto...
effettivamente e' un po' complicato, ho impiegato un po' di tempo a
scriverlo, e siccome non ho il tempo (adesso) per spiegarlo, mi faro'
sentire prensto a riguardo, ok? ciao ciao


  for K:=1 to 3 do
  begin
     if k=1 then AX:=2
               else AX:=1;
     CX:=6-AX-K;
     for j:=1 to 3 do
     begin
        if j=1 then BX:=2
                 else BX:=1;
        DX:=6-BX-j;
        DetAT[j,k]:=(A[ax,bx]*A[cx,dx]-A[ax,dx]*A[cx,bx]);
        if ((k+j)mod 2)<>0 then DetAT[j,k]:=-1*DetAT[j,k];
     end;
  end;
eccomi qua, allora, il mio prof di mate ci ha spiegato che la matrice dei
determinanti si trova in un certo modo. mettiamo caso che voglio sviluppare
il determinante della posizione 1,1, non devo fare altro che trovarmi il
minore di 2°. lo stesso per tutti gli altri elementi della matrice. scirvo
qua per intero il procedimento :
b(1,1)=a(2,2)*a(3,3)-a(2,3)*a(3,2)
b(1,2)= -1*[a(2,1)*a(3,3)-a(2,3)*a(3,1)]
b(1,3)=a(2,1)*a(3,2)-a(2,2)*a(3,1)
b(2,1)= -1*[a(1,2)*a(3,3)-a(1,3)*a(3,2]
b(2,2)=a(1,1)*a(3,3)-a(1,3)*a(3,1)
b(2,3)= -1*[a(1,1)*a(3,2)-a(1,2)*a(3,1)]
b(3,1)=a(1,2)*a(2,3)-a(1,3)*a(2,2)
b(3,2)= -1*[a(1,1)*a(2,3)-a(1,3)*a(2,1)]
b(3,3)=a(1,1)*a(2,2)-a(1,2)*a(2,1)
salvo errori nella scrittura
il tutto puo' essere ricondotto alla seguente formula:
b(x,y)=a[a,b]*a[c,d]-a[a,d]*a[c,b]);
come vedete basta conoscere solo gli indice della prima parte (a,b,c,d), per
conoscere automaticamente gli altri.
se la somma x+y e' dispari, basta moltiplicare il tutto per -1. il mio
problema era quello di scoprire se ci fosse una relazione tra gli indici di
b (x,y) e quelli di a (a,b,c,d); essendo molto testardo ho deciso di
"cimentarmi nell'impresa". dopo aver visto e rivisto quei numeri sono
arrivato a scrivere quel codice. la parte piu' importante e' quella che
calcola gli indici di a partendo da quelli di b. infatti se ci fate caso,
l'indice a di a (scusate la confusione...), il primo, prende solo i valori 1
oppure 2, e precisamente l'indice e' due quando k e' uguale ad 1, in casi
diversi allora e' uguale a due, infatti:
          if k=1 then AX:=2
               else AX:=1;
mi posso subito calcolare l'indice c, in questo modo: se ci fate caso la
somma degli indici x,a e c da sempre sei, conoscendo x ed a, mi posso
trovare c:
     CX:=6-AX-K;
gli indici b e d sono legati al valore del secondo indice di b, cioe' y. per
il calcolo di b, vale lo stesso discorso di a, quindi:
        if j=1 then BX:=2
                 else BX:=1;
e per d, lo stesso di di c
        DX:=6-BX-J;
trovato gli indici della matrice a, posso sistemare il valore del
seterminante all'interno della sua variabile, e moltiplicarlo per -1 se la
somma di x e y da un numero dispari
        DetAT[j,k]:=(A[ax,bx]*A[cx,dx]-A[ax,dx]*A[cx,bx]);
        if ((k+j)mod 2)<>0 then DetAT[j,k]:=-1*DetAT[j,k];
penso che sia proprio finito (finalmente direte voi :-))) cmq questo e' il
ragionamento che mi ha portato a scrivere quel codice... dubbi, domande,
critiche (siate buoni...) ??
