divendres, 1 d’abril del 2011

Resolució de sistemes d'equacions lineals d'N incògnites amb Calc (OpenOffice.org - LibreOffice)

Es tracta de l'aplicació directa dels vells apunts d'àlgebra de l'institut.

Si recordem, de càlcul matricial,  teníem que un sistema d'equacions lineals d'N incògnites es podia escriure com el producte de la matriu quadrada A de NxN de coeficients, pel vector d'incògnites X, igual al vector de termes independents B, o sigui A·X = B

I llavors, la resolució del sistema era
Inv(A)·A·X = Inv(A)·B

però Inv(A)·A = I (matriu identitat de NxN: tot zeros i  diagonal d'uns. Recordem dels apunts també: una matriu és invertible si el seu determinant és diferent de zero)

Més dels apunts: el producte de la identitat per "Alguna cosa" és "Alguna cosa". Per tant:

I·X = Inv(A)·B,
és dir X = Inv(A)·B

Si el sistema és "compatible i determinat"  aleshores té solució i és única, i serà el vector X.

Hi han molt bones alternatives per a fer càlcul vectorial i matricial amb programari lliure: immediatament ens ve al cap el nom d'Octave, però també podriem fer servir FreeMat o SciLab (tots ells segueixen l'estil del reconegut, i de pagament, Matlab). Es tracta d'aplicacions instal·lables des del centre de Programari de l'Ubuntu.

Però aquí es proposa una alternativa amb programari més comú i que ja ve instal·lat: El càlcul es pot fer amb cel·les i fòrmules de Calc (OpenOffice.org o LibreOffice)

Obro una fulla i creo les matrius A i B



Calculo la inversa Inv(A), com que és una matriu de 3x3, la inversa també ho serà

Em posiciono a la cel·la a en la que vull que es pocioni la inversa i faig click a l'auxiliar de funcions.

Trio les funcions de Matrius. Trio la funció MINVERSA. Marco el checkbox "matriu" per indicar que l'argument és una matriu.

 
Click a següent i, a continuació, sel·lecciono la matriu que vull invertir.


Click a d'acord i ja tinc la matriu invertida.


Finalment, cal multiplicar la matriu invertida amb el vector de termes independents.

Em posiciono a la cel·la on vull que es mostrin les X, faig click a l'auxiliar de funcions. Trio les funcions de matriu. Trio la funció MULTM. Marco el checkbox "matriu" per indicar que els arguments són matrius.


A continuació sel·lecciono la matriu invertida i el vector de termes independents.


I ja ho tinc calculat.


Aquest seria el procés "manual".

Amb OOoBAsic el càlcul és directe (idea extreta de http://user.services.openoffice.org/en/forum/viewtopic.php?f=20&t=32048). En les zones de color buides és on posaré la invertida i les X. )


Faig servir aquest codi:
sub ResolSistema
   Dim oFuncio as Object
   Dim oFull as Object
   Dim oRangA as Object
   Dim oRangB as Object
   Dim oRangInvA as Object
   Dim oRangX as Object
   Dim matInversa as Object
   Dim matX as Object
   Dim oFila as Object
   Dim i,j as Integer
             
   oFull = ThisComponent.Sheets.getByName("Full1")
   oRangA = oFull.getCellRangeByName("A1:C3")
   oRangInvA  = oFull.getCellRangeByName("E6:G8")
   oRangB = oFull.getCellRangeByName("E1:E3")
   oRangX = oFull.getCellRangeByName("E11:E13")
   oFuncio = createUnoService("com.sun.star.sheet.FunctionAccess")

   matInversa =  oFuncio.callFunction("MINVERSE", Array(oRangA.DataArray))
  
   for i = 0 to 2
      oFila = matInversa(i)
      for j = 0 to 2
         oRangInvA.getCellByPosition(j, i).setValue(oFila(j))
      next j
   next i
  
   matX =  oFuncio.callFunction("MMULT", Array(matInversa, oRangB.DataArray))

   for i = 0 to 2
      oFila = matX(i)
      oRangX.getCellByPosition(0,i).setValue(oFila(0))
   next i
  
End Sub


L'executo i obtinc:


És dir, el mateix resultat, com era d'esperar. Algunes remarques al codi:

- La utilització dels rangs per a fer un posicionament "relatiu" dels resultats, en comptes de fer un posicionament absolut sobre el full.
- En OOoBasic cal posar els noms de les funcions en anglès. MINVERSE en comptes de MINVERSA, i MMULT en comptes de MULTM.
- Les funcions de matriu retornen un vector de vectors, en comptes d'un Array bidimensional, per això cal fer servir oFila per a extreure els resultats.

Cap comentari:

Publica un comentari a l'entrada