Index [stark.udg.edu]stark.udg.edu/~perico/docencia/cursos_anteriors/MMAQ_0607.pdfInternament,...
Transcript of Index [stark.udg.edu]stark.udg.edu/~perico/docencia/cursos_anteriors/MMAQ_0607.pdfInternament,...
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
1
Index
1.- PROGRAMACIÓ EN FORTRAN ...................................................................................................... 4
1.1- ORDINADORS, LLENGUATGES D'ALT NIVELL, COMPILADORS ............................................................. 4
Els ordinadors digitals ........................................................................................................................ 4
FORTRAN ........................................................................................................................................... 7
1.2- FONAMENTS DEL FORTRAN 77 ....................................................................................................... 8
Tipus de dades .................................................................................................................................... 9
Input/output standard........................................................................................................................ 11
Assignació ......................................................................................................................................... 12
Operacions aritmètiques ................................................................................................................... 13
1.3 INSTRUCCIONS DE EXECUCIÓ CONDICIONAL ..................................................................................... 15
1.4- INSTRUCCIONS DE EXECUCIÓ REPETITIVA (BUCLES) ........................................................................ 18
1.5- ALTRES DISPOSITIUS INPUT/OUTPUT ............................................................................................... 22
1.6- VECTORS I MATRIUS ....................................................................................................................... 25
1.7 SUBPROGRAMES: FUNCIONS I SUBRUTINES ...................................................................................... 29
Funcions ........................................................................................................................................... 29
Subrutines ......................................................................................................................................... 34
Crides a les subrutines ...................................................................................................................... 35
Procés de compilació ........................................................................................................................ 38
2.- ÀLGEBRA LINEAL ........................................................................................................................... 39
2.1 ESPAIS VECTORIALS .......................................................................................................................... 39
2.2 COMBINACIÓN LINEAL, INDEPENDENCIA LINEAL Y BASE .................................................................. 39
2.3 PRODUCTE ESCALAR ......................................................................................................................... 40
2.4 MATRIUS: PROPIETATS I OPERACIONS ............................................................................................... 42
Definicions i propietats elementals. .................................................................................................. 42
Tipus de matrius ................................................................................................................................ 43
2.5 CANVIS DE BASE. .............................................................................................................................. 46
3.- RESOLUCIÓ D’EQUACIONS D’UNA VARIABLE ...................................................................... 47
3.1. RECERCA DE ZEROS DE FUNCIONS.................................................................................................... 47
3.2 MÈTODE DE LA BISECCIÓ .................................................................................................................. 47
Algorisme .......................................................................................................................................... 48
3.3 MÈTODE DE LA REGULA-FALSI O DE LA FALSA POSICIÓ ................................................................... 50
Algorisme .......................................................................................................................................... 50
3.4. MÈTODES DE NEWTON-RAPHSON I DE LA SECANT. .......................................................................... 52
Algorisme de Newton-Raphson ......................................................................................................... 52
Algorisme de la secant ...................................................................................................................... 54
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
2
4.- RESOLUCIÓ DE SISTEMES D'EQUACIONS LINEALS. ........................................................... 56
4.1. ALGORISME DE RESOLUCIÓ DE SISTEMES D’EQUACIONS LINEALS PEL MÈTODE DE GAUSS-JORDAN. 56
4.2. LA TÈCNICA DEL PIVOTATGE EN L’ALGORISME DE GAUSS-JORDAN ................................................. 61
Exemple ............................................................................................................................................. 63
4.3. ALGORISME DE RESOLUCIÓ DE SISTEMES D’EQUACIONS LINEALS PEL MÈTODE DE GAUSS-SEIDEL .. 65
5.- AJUSTE DE CURVAS E INTERPOLACIÓN ................................................................................. 68
5.1. REGRESIÓN LINEAL .......................................................................................................................... 69
5.2. AJUSTE POLINÓMICO POR MÍNIMOS CUADRADOS. ............................................................................ 73
5.3. REGRESIÓN MULTILINEAL ................................................................................................................ 75
5.3. COEFICIENTE DE DETERMINACIÓN ................................................................................................... 76
6.- INTEGRACIÓ NUMÈRICA DE FUNCIONS ................................................................................. 77
6.1 MÈTODE DELS RECTANGLES ............................................................................................................. 78
6.2 MÈTODE DELS TRAPEZIS ................................................................................................................... 80
6.3 MÈTODE DE SIMPSON (1/3) ............................................................................................................... 84
6.4 MÈTODE DE ROMBERG ..................................................................................................................... 89
6.5 ANÀLISI D’ERRORS I PÈRDUA DE PRECISIÓ ........................................................................................ 92
6.6 INTEGRACIÓ NUMÈRICA DE FUNCIONS: INTEGRALS IMPRÒPIES ......................................................... 95
Límits d’integració no avaluables ..................................................................................................... 95
Límits d’integració no finits .............................................................................................................. 97
6.7 INTEGRACIÓ NUMÈRICA DE FUNCIONS DE UNA O MÉS VARIABLES: MÈTODE DE MONTE CARLO ..... 101
Mètodes Monte Carlo ..................................................................................................................... 103
Generació de nombres aleatoris en FORTRAN .............................................................................. 106
7. -MINIMITZACIÓ DE FUNCIONS I DERIVACIÓ ....................................................................... 108
7.1. DERIVACIÓ NUMÈRICA PER DIFERÈNCIES FINITES .......................................................................... 108
7.2. PUNTS ESTACIONARIS. ................................................................................................................... 112
7.3. MÈTODES DE GRADIENT................................................................................................................. 112
7.4. MÈTODE NEWTON-RAPHSON......................................................................................................... 112
8.- INVERSIÓ DE MATRIUS ............................................................................................................... 113
8.1 ALGORISME GENERAL D’INVERSIÓ DE MATRIUS QUADRADES ......................................................... 113
9.- EQUACIONS SECULARS .............................................................................................................. 116
9.1. DEFINICIONS .................................................................................................................................. 116
9.2. PROPIETATS ................................................................................................................................... 118
9.3. ALGORISME DE DIAGONALITZACIÓ DE MATRIUS PEL MÈTODE DE LES ROTACIONS ELEMENTALS DE
JACOBI. ................................................................................................................................................. 122
Exemple 1: ...................................................................................................................................... 129
Exemple 2: ...................................................................................................................................... 130
Altres consideracions: .................................................................................................................... 131
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
3
9.4. APLICACIONS DE LA DIAGONALITZACIÓ DE MATRIUS QUADRADES SIMÈTRIQUES .......................... 132
Determinant d’una matriu .............................................................................................................. 132
Matriu Inversa ................................................................................................................................ 134
Potències d’una matriu ................................................................................................................... 135
Aplicacions avançades: Ortonormalització d’una base de vectors ................................................ 136
BIBLIOGRAFIA .................................................................................................................................... 139
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
4
1.- Programació en FORTRAN
1.1- Ordinadors, llenguatges d'alt nivell, compiladors
Els ordinadors digitals
Les aplicacions principals d’un ordinador podríem dir que són dues:
Càlcul numèric
Emmagatzematge, processament i anàlisi de dades.
En l’actualitat existeixen infinitat d’aplicacions (software) que permeten realitzar
tasques específiques com processament de textos, edició d’imatges, bases de dades, o
fins i tot programes de càlcul simbòlic matemàtic com el Mathematica o Maple.
Nosaltres ens dedicarem més aviat a les aplicacions de càlcul numèric i, en concret, a la
programació en el llenguatge FORTRAN. Els avantatges que comporta tenir uns
coneixements de programació en son vàries:
Permet resoldre problemes específics que potser no serien resolubles amb el
software standard de què es disposi.
S’elimina la dependència del software comercial i potencialment costós, a més
d’haver d’adaptar-se a les successives revisions i versions.
Amb la programació es fomenta el desenvolupament intel·lectual, el pensament
lògic i estructurat. De fet, difícilment es pot programar un mètode o algorisme que
no s’entengui prèviament. Per tant, si fer un programa per realitzar una tasca podem
estar segurs que haurem entès com es fan les coses.
El FORTRAN (FORmula TRANslator) és un dels llenguatges de programació d’alt
nivell més utilitzats en l’actualitat en l’àmbit científic i tècnic, juntament amb el C.
L’avantatge del FORTRAN respecte al C, és que és relativament més senzill
d’aprendre. Pels objectius d’aquest curs, el FORTRAN es més que suficient.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
5
Una de les característiques dels ordinadors actuals és la representació binària de la
informació. Internament, l’ordinador està composat de commutadors que poden tenir
posició oberta o tancada, i serveixen per representar els nombres 0 i 1. Per tant, dos és
la base natural de representació dels nombres en l’entorn informàtic. És a dir, mentre
que en base deu representem el nombre 113 com
113 = 1(102) + 1(10
1)+ 3(10
0)
en base dos tindríem
113 = 1(26)+ 1(2
5)+ 1(2
4)+ 0(2
3)+ 0(2
2)+ 0(2
1)+ 1(2
0) = 64 + 32 + 16 +1 = (1110001)2
Val a dir que també es poden representar de la mateixa manera altres tipus de dades,
com per exemple lletres (caràcters alfanumèrics) , simplement assignant-ne un valor a
cada lletra de l’abecedari.
Cada unitat d’informació binària rep el nom de bit. Normalment els bits s’agrupen en
blocs de 8 unitats formant un byte. Les dades que s’emmagatzemen i amb les que
treballarem a l’ordinador poden ser de 1 fins a 16 bytes, segons el tipus.
Per exemple, en FORTRAN el nombres sencers (integer) es representen per defecte
amb 4 bytes (o 32 bits). Això vol dir que amb aquest tipus de dades poden representar
nombres en el rang +231
-231
(cal un bit per especificar el signe).
Pels caràcters alfanumèrics només ens caldrà un byte, amb el que podem codificar 28 =
256 caràcters diferents.
La memòria principal d’un ordinador està formada per milions de circuits integrats
capaços emmagatzemar zeros o uns. Hi ha dos valors associats a cada element de la
memòria: la dada que conté i la direcció de la mateixa que ens permet accedir a la
mateixa.
El temps d’accés a la dada es un paràmetre molt important en la informàtica actual. De
fet, un suma es fa en menys temps que es triga en trobar els sumands a la memòria. En
les memòries RAM, el temps d’accés es independent de la posició que ocupa l’element
(random access memory).
Els PC’s actuals tenen també l’anomenada memòria cache, situada físicament a prop del
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
6
processador on es realitzen les operacions, que té un temps d’accés molt mes curt que la
memòria RAM i on s’emmagatzemen les dades més recentment accedides a la memòria
principal. Aquesta memòria ultraràpida és molt petita (típicament 256-1024 Kb). Una
bona estratègia de programació avançada és aconseguir que les dades estiguin el major
temps possible a la memòria cache.
A més de la memòria principal, hi ha altres llocs on s’emmagatzema la informació de
manera permanent però a canvi d’un temps d’accés superior. Són els dispositius de
memòria massiva o secundaria (discs durs, CD-ROM, DVD, diskettes, pen drives,
etc...). Per tant, un altra estratègia de programació eficient és la d’accedir el mínim
numero de vegades possible al disc dur (treballant sempre en memòria RAM o bé
llegint les dades necessàries en grans blocs).
En la comunicació amb l’ordinador cal tenir presents el dispositius d’entrada i sortida
(Input/output devices). Com a dispositius d’entrada tenim el teclat i les memòries
massives (disk dur, etc...), i són les vies per les quals li entrem les dades a l’ordinador.
Pel que fa a la sortida, tenim la pantalla, la impressora i les mateixes memòries
massives.
A l’hora d’escollir un dispositiu o un altre cal tenir en compte l’ús que en fem de la
informació. Per exemple, moltes vegades els nostres programes tindran unes opcions
típiques que ens pot interessar no introduir mitjançant el teclat cada vegada que
l’executem sinó que poden ser llegides d’un fitxer creat prèviament.
De la mateix manera, ens pot interessar guardar de manera permanent la sortida del
programa (output), per exemple per fer-la servir com a entrada (input) d’un altre
programa. En aquest cas convé, doncs, fer servir el disc dur com a dispositiu de sortida.
Per últim comentarem com li comuniquem a l’ordinador què volem fer. De fet, el
llenguatge primari de l’ordinador consta d’instruccions del tipus:
Porta el numero X de la direcció de memòria Y
Emmagatzemar-lo a la CPU
Suma dos nombres
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
7
Aquest llenguatge màquina (ensamblador, assembler), però, no resulta gaire útil per
l’usuari. Els anomenats llenguatges d’alt nivell el que permeten es codificar de manera
més “humana” les instruccions, de manera que siguin, a més, independent de la màquina
on es treballi. El conjunt d’instruccions escrites en aquest llenguatge rep el nom de codi
font.
El programa que realitza la traducció a llenguatge màquina és el compilador, i el
resultat de la traducció es codi objecte. Per últim, el procés de creació del fitxer
executable final rep el nom de link i el duu a terme, generalment, el propi compilador
després de la compilació (exitosa).
Tant el codi objecte com el programa executable final depenen de l’arquitectura de
l’ordinador de treball (i per tant només podrà executar-se en aquell tipus de màquina i
sistema operatiu) mentre que només el codi font és universal.
FORTRAN
En l’actualitat existeixen vàries revisions del llenguatge FORTRAN original:
FORTRAN 77, FORTRAN 90 i FORTRAN 95. Les versions 90 i 95 es poden
considerar, de fet, com ampliacions del FORTRAN 77, pel què la pràctica totalitat de
les instruccions de FORTRAN 77 estan incloses en les versions posteriors.
Per tant, tot i que farem servir el compilador de FORTRAN 95, ens limitarem a fer
servir instruccions de FORTRAN 77. De fet, l’actualització dels programes científics
existents a versions posteriors és pràcticament inexistent avui en dia. A més, existeixen
compiladors de FORTRAN77 gratuïts pel sistema operatiu Linux (GNU g77).
Bibliografia
Programación en FORTRAN77, G. J. Borse, Ed. Anaya 1989.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
8
1.2- Fonaments del FORTRAN 77
A l’hora d’elaborar el codi font en FORTRAN77 hi ha una sèrie de pautes que cal
seguir:
Les instruccions o expressions (sentencies) s’escriuen en línies independents,
de tal manera que les instruccions s’executen seqüencialment (una darrera de
l’altra).
El compilador ignora les línies en blanc
Cada línia té una amplada màxima de 80 caràcters.
Les instruccions han de situar-se entre les columnes 7 i 72 de cada línia.
Les columnes 1 a 5 estan reservades per etiquetar les sentencies amb
números (opcional).
La columna 6 és de continuació. Si una sentencia és massa llarga es pot
continuar a la següent línia (a partir de la columna 7) escrivint un caràcter
diferent del 0 en la columna 6 (típicament es fa servir “+” o “1”, “2”, etc...)
Qualsevol línia que contingui a la columna 1 el caràcter “C” o bé “*” es
considera comentari i el compilador l’ignora. És molt important incloure
comentaris en el codi font per tal de millorar la seva comprensió
posterior!
Tot programa escrit en FORTRAN comença per la sentència PROGRAM i termina amb
la sentència END (o END PROGRAM).
La comanda PROGRAM pot venir acompanyada d’una paraula, que dóna nom al
programa. És important recalcar que aquest nom no te res a veure amb el nom del fitxer
que conté el codi font o el nom del fitxer executable final.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
9
Tipus de dades
El FORTRAN ofereix una certa varietat en la referència i emmagatzematge de dades.
En concret n’hi ha de cinc tipus: INTEGER, REAL, COMPLEX, CHARACTER i
LOGICAL que serveixen per codificar nombres enter, decimals (o de coma flotant) i
complexes, caràcters alfanumèrics i expressions booleanes (vertader o fals).
Per defecte les variables de tipus INTEGER, REAL i COMPLEX ocupen 4 bytes,
mentre que les LOGICAL i CHARACTER n’ocupen 1 byte.
Molt sovint es treballa amb dades de tipus DOUBLE PRECISION, que de fet son
variables de tipus REAL però de 8 bytes. De fet, REAL*8 és un sinònim de DOUBLE
PRECISION. Això és així perquè amb dades de tipus REAL de 4 bytes podem
emmagatzemar números decimals dins el rang 10-38
– 1038
amb 8 dígits de precisió. En
canvi, amb les DOUBLE PRECISION s’arriba fins a un rang de 10-308
.- 10308
. amb 16
xifres significatives.
Les dades que s’utilitzen en el programa poden ser constants o variables i han de tenir
un nom. Les constants designen un valor específic que cal introduir i que no canvia al
llarg del mateix. Pera altra banda, el concepte de variable coincideix amb l’habitual, és a
dir, un nom simbòlic que fa referència a una dada que pot prendre diferents valors. Hi
ha algunes restriccions al respecte de quins noms es poden assignar a les variables o
constants:
Han de començar per un caràcter alfanumèric (una lletra).
No poden contenir caràcters especials (accents, signes, asterisc, etc..).
És convenient, tot i que no obligatori, denominar les variables o constants amb
noms que recordin al concepte que representen.
Quan s’escriu un programa en FORTRAN77 s’utilitzen sentencies d’especificació o
declaració on s’explicita quin tipus de dades es faran servir al programa. Aquestes
sentencies s’inclouen en el codi font just després de la sentència PROGRAM.
Les constants es declaren i especifiquen a la vegada mitjançant la sentència parameter
de tal manera que amb l’expressió
parameter (MAXDIM=100, PI = 3.1415926)
estem dient al programa que hem definit dues dades constants amb els noms MAXDIM i
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
10
PI , el valor de les quals queda fixat i no es pot modificar posteriorment.
En el cas de les variables cal tenir en compte el següent:
Per defecte, totes les variables el nom de les quals comenci per les lletres
i, j, k, l, m, n seran considerades com INTEGER. La resta seran de tipus
REAL.
Els casos per defecte es poden modificar amb la sentència implicit. Per
exemple, la sentència següent (desprès de la sentència program):
implicit double precision (a-h,o-z)
fa que es conservi que les variables que comencin per les lletres i fins n siguin
considerades INTEGER però aquelles que comencin per les lletres a fins h i o
fins z seran reals de doble precisió (8 bytes)
Es pot assignar de forma explícita un o més variables. Per exemple, amb les
sentències
real x,y,z
integer dia,mes, any
character linia*80, nom*20
declarem que les variables x, y ,z seran considerades dins el programa de
tipus REAL; les variables dia, mes, any seran de tipus INTEGER; les
variables línia i nom seran de tipus CHARACTER amb longitud 80 i 20
caràcters, respectivament.
Les sentències anteriors s’inclouen en el programa després de la
sentencia program.
La declaració explicita del tipus de les variables no és obligatori. Si no
s‘especifica res, el compilador considera el cas per defecte comentat
anteriorment. Això, de fet, implica que les variables de tipus CHARACTER
o LOGICAL s’hagin de declarar sempre
Amb les sentències de declaració no s’assigna cap valor a les variables,
només es dona un nom determinat a una posició física de la memòria on
s’emmagatzemarà el valor de la variable.
En els exemples següents assumirem que les variables són del tipus determinat per
l’opció per defecte.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
11
Input/output standard
Les comandes input/output standard en FORTRAN són
read(*,*) llista de variables entre comes
write(*,*) llista de variables o cadenes de caràcters entre comes
(Una cadena de caràcters és un conjunt de caràcters entre cometes o apòstrofs. )
Per exemple:
Sentència Resultat
read(*,*) x llegeix del teclat un nombres real
read(*,*) i, j llegeix del teclat dos nombres sencers
write(*,*) x, i escriu per pantalla un nombre real seguit
d’un nombre sencer
write(*,*) ‘El producte x*y = ‘,x*y
escriu per pantalla literalment
El producte x*y = , seguit del resultat del
producte
Quan el programa arriba a una sentència d’input/output es transfereix el control als
dispositius d’input/output. Per exemple, quan s’arriba a un sentència com
read(*,*) x
el programa espera que l’usuari introdueixi mitjançant el teclat (dispositiu d’input
standard) una dada (real, en aquest cas). Les dades s’introdueixen simplement escrivint
el número seguit de INTRO. Quan la sentència read inclou més d’una variable entre
comes, els valors es poden introduir durant l’execució del programa bé entre comes o
bé un a un prement INTRO cada cop.
Per altra banda, quan s’ arriba a una sentència com
write(*,*) x
el programa escriu per pantalla (dispositiu d’output standard) el valor que tingui
assignat en aquell precís moment la variable x
Més endavant veurem com es pot controlar el format de input/output dels nombres i
caràcters alfanumèrics mitjançant les sentències de format (format). També veurem
com definir altres dispositius d’input/output diferents als standard, i en concret, com
escriure i llegir de fitxers als discs locals.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
12
Assignació
De fet, el procés d’assignació en FORTRAN ja ho hem anat veient. Bàsicament, hi ha
dues maneres d’assignar un valor a una variable
Externament, mitjançant la comanda read : Per exemple, amb la sentència
read(*,*) x
aconseguim assignar-li a la variable x un valor mitjançant el teclat
Per assignació directa. Per exemple, amb la sentència
y = 3.0d0*x +4.0d0
li assignem a la variable y el resultat de multiplicar el valor de la variable x
per tres i sumar-li quatre.
En aquest cas d’assignació directa cal tenir en compte alguns punts:
Si fem servir una variable a la que no se li ha assignat cap valor, el resultat
por ser qualsevol. Per exemple, si fem
y = 3.0d0*x +4.0d0
sense haver donat cap valor a x, el resultat que es guardarà a y pot ser
qualsevol (tot i això molts compiladors assignen per defecte el valor 0 a totes
les variables).
Expressions del tipus
y = 3.0d0
y = 3.0d0*y +4.0d0
son perfectament vàlides. De fet estem dient que y inicialment conté el valor
3 i, posteriorment, s’hi emmagatzema el resultat de multiplicar el valor
anterior de y per 3.0 i sumar-li 4.0. Recordeu que son sentencies
d’assignació! No implica igualtat.
Exemple: Escriu un programa que intercanviï el valor de dues variables. És a dir,
que si inicialment i=3 i j =2, al final tinguem i=2 i j = 3.
El valor que quedi emmagatzemat a la variable depèn del tipus de variable.
Per exemple si fem
i = 4.0d0/3.2d0
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
13
a la variable INTEGER i s’hi emmagatzemarà el valor 1
x= 1/2
a la variable REAL x i s’hi emmagatzemarà el valor 0.0
Operacions aritmètiques
Els operadors aritmètics típics són els següents
+ suma
- resta
* multiplicació
/ divisió
** potència
Els operands poden ser números, constants o variables, sempre i quan siguin del tipus
escaient. Cal tenir en compte que:
El resultat de les operacions on intervenen nombres sencers (INTEGER) és un
nombre sencer. Així, per exemple, 10/3 = 3, mentre que 10.0d0/3 = 3.33333...
La barreja de variables o nombres de diferents tipus en una mateixa operació es
potencialment perillosa. Per exemple1
Expressió Resultat
a = 10/3 a = 3.000000
b = 10.0d0/3 b = 3.3333332
c = 10.0d0/3.0d0 c = 3.33333333
i = 10/3 i = 3
j = 10.0d0/3.0d0 j = 3
Comparant els valors a b i c es pot veure com es pot perdre precisió. Si escrivim 10.0d0
estem indicant que el número és de doble precisió (a diferència de 10.0 o 10.0e0).
Podem veure també que si la variable on s’assigna el resultat es de tipus INTEGER el
valor que emmagatzema serà sempre de tipus enter.
1 D’ara endavant suposarem que s’han definit variables reals de doble precisió.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
14
A les variables de tipus CHARACTER també se’ls pot assignar valors. Per exemple, si
fem
character nom*10, cognom*10, tot*30
nom = ‘Armando’
cognom = ‘Bronca’
assignem a les variables nom i cognom valors alfanumèrics.
L’operació que es pot fer amb aquest tipus de dades es la concatenació. amb l’operador
“//”
tot =nom//cognom//”Segura”
Així, a la variable tot tindrem assignat
Armando___Bronca____Segura____
Si l’expressió és més llarga que la variable, aquesta es trunca a la mida
necessària
Si l’expressió és mes curta que la variable s’afegeixen espais en blanc fins
arribar a la mida declarada de la variable
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
15
1.3 Instruccions de execució condicional
L’ordinador, a més de realitzar operacions aritmètiques és capaç de fer comparacions i
executar determinades instruccions en funció del resultat. Per realitzar les comparacions
s’utilitzen expressions o sentències lògiques acompanyades dels corresponents
operadors lògics. Veiem primer aquests últims:
Operador lògic Significat
.EQ. igual a
.NE. diferent de
.LT. més petit que
.LE. més petit o igual que
.GT. més gran que
.GE. més gran o igual que
.AND. i lògic
.OR. o lògic
.NOT. negació lògica
És important tenir en compte que els punts formen part de l’operador lògic.
La sentència if , una de les estructures de control clau, es la que permet realitzar les
comparacions. Veiem com funciona:
El cas més senzill seria la sentència
if (expressió_lògica) sentència1
En aquest cas, s’avalua l’expressio_logica i si es vertadera s’executa la sentència1.
Per exemple, amb la sentència
if(x.LT.0.0) x = -x
si el valor de la variable x és negatiu li canviem el signe (obtenim el valor absolut). De
fet, ja hem vist que la funció intrinseca abs( ) faria també aquesta feina.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
16
Si volem incloure més d’una instrucció dins el bloc if llavors hem de fer
if (expressió_lògica) then
sentència1
sentència2
...
end if
Per altra banda, també podem dirigir l’execució del programa en funció del resultat de
l’expressió lògica (i no només realitzar una sèrie d’instruccions només en cas que sigui
vertadera, com fins ara). Veiem-ho:
if (expressió_lògica) then
sentència1
...
else
sentència2
...
end if
En aquest cas, si l’expressió lògica es vertadera s’executa la sentència1 i de més
sentències escrites abans de la paraula else. En cas que hagués estat falsa, l’execució
del programa salta a la sentència immediatament posterior a else i posteriors fins end if.
Per exemple:
if (x.GT.-3.0.AND.x.LE.10.0) then
write(*,*) ‘El nombre esta dins l’interval (–3 , 10]
else
write(*,*) ‘El nombre esta fora de l’interval (–3 , 10]
end if
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
17
Per últim, es poden incloure dins la sentència if més d’una opció, mitjançant altres
expressions lògiques:
if (expressió_lògica1) then
sentència/es 1
else if (expressió_lògica2) then
sentència/es 2
...
else if (expressió_lògica n) then
sentència/es n
else
sentència/es que s’executen cas que totes les expr. lògiques
anteriors siguin falses
...
end if
De tal manera que, per exemple, el bloc de sentències 2 només s’executarà si
l’expressió lògica 1 es FALSA i l’expressió lògica 2 és VERTADERA. Desprès
d’això el programa continuarà amb la sentència immediatament posterior a end if.
Fixeu-vos també que, tot i que no és cap obligació, les sentències que queden entre les
sentències pròpies de control (if..else...end if), s’indenten per millorar la comprensió
del programa.
Exemple: Fes un programa que trobi les solucions d’una equació de segon grau del tipus ax2 +
bx + c = 0. El programa hauria de distingir entre els possibles casos que es poden donar (no hi
ha solució real, una solució doble, dues solucions) i escriure’n el resultat en funció del cas.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
18
1.4- Instruccions de execució repetitiva (bucles)
Els bucles son una de les tècniques de programació més utilitzades. Bàsicament
consisteixen en repetir un numero determinat (finit) o indeterminat (infinit) de vegades
les sentències que s’executen dins el propi bucle.
En FORTRAN existeixen dos tipus de instruccions per fer bucles, segons el numero de
vegades que es repeteixen sigui determinat o indeterminat (depenent d’una condició).
Res millor que un exemple. Veiem com funciona
do while(expressió_lògica) (1)
sentència 1
....
end do (2)
En aquest cas tenim un bucle on el nombre de vegades que es repeteix és indeterminat i
dependent de la condició lògica. Quan el programa entra en el bucle (1) avalua
l’expressió lògica. Si es vertadera, entra dins el bucle i executa les sentències fins
arribar al punt final del bucle (2). Si fos falsa no entraria en el bucle i el control del
programa tornaria a la sentència immediatament posterior al punt final del bucle (2).
Cas d’haver estat vertadera, el programa tornaria al començament del bucle (1) i
tornaria a avaluar l’expressió lògica. Si fos vertadera, entraria al bucle, etc...
Per exemple, el següent és un programa que suma els N primers nombres.
read(*,*) N
i=1
isuma=0
do while (i.LE.N)
isuma=isuma + i
i= i+1
end do
write(*,*) ‘La suma dels ‘,N, ‘ primers nombres enters es: ‘,isuma
Analitzem-ho. Primer es llegeix el nombre final N, de tipus INTEGER. Tot seguit
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
19
inicialitzen dues variables INTEGER (i, isuma). La variable i ens servirà de
comptador, mentre que a isuma n’acumularem el resultat final. Quan el control del
programa arriba a l’entrada del bucle, comprova si i és menor o igual que N. En cas
afirmatiu entra al bucle. A dins, el que fem es sumar el valor de i al total (isuma) i,
posteriorment, incrementar en una unitat el valor del comptador i. Quan s’arriba al final
del bucle (end do) el programa torna al principi a comprovar que i encara es menor o
igual que N.
És important incrementar la variable i dins el bucle perquè sinó tindríem un bucle
infinit i bàsicament podríem “penjar” l’ordinador.
Si, per exemple, haguéssim donat a N un valor de 7, el programa entraria fins a 7
vegades el bucle i aniria sumant a isuma els valors 1, 2,3 ..., fins a 7.
Valor de i Valor de isuma
1 1
2 3
3 6
4 10
5 15
6 21
7 28
Però, de fet, també podríem haver fet el programa utilitzant una estructura de bucle
determinat, ja que si N és 7 cal que el bucle es repeteixi exactament 7 vegades.
En aquest cas seria
read(*,*) N
do i=1,N
isuma=isuma+i
end do
write(*,*) ‘La suma dels ‘,N, ‘ primers nombres enteres es: ‘,isuma
Ara la sentència inicial del bucle té l’estructura
do comptador_INTEGER = valor_inicial, valor_final, (valor_pas)
No hi ha, doncs, expressió lògica. Quan el programa entra per primer cop al bucle li
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
20
assigna a la variable comptador_INTEGER el valor_incial (per tant, no hi ha necessitat
de inicialitzar-la com abans). Tot seguit s’entra dins el bucle i s’executen les sentències.
Quan s’arriba al final del bucle (end do) es torna a la sentència inicial i s’incrementa en
valor_pas2 el valor de la variable comptador _INTEGER. Aquest procés es repeteix fins
que la variable comptador _INTEGER prengui el valor_final o, en tot cas, no el superi.
És important no modificar el valor de la variable comptador_INTEGER dins
l’estructura del bucle. De fet, molts compiladors no ho permeten i donen error.
Els bucles també es poden aniuar. Per exemple, si volem generar els 99 primers
nombres inclòs el 0, podem fer
do i = 0,99
write(*,*) i
end do
o bé
do i=0,9
do j=0,9
write(*,*) 10*i + j
end do
end do
En aquest segon cas, inicialment la variables i prenen els valor 0 i entra en el bucle.
Llavors ens troben un altre bucle, on el valor inicial de j és 0 i va variant fins a 9, per a
cada valor possible de i. Per tant, la instrucció
write(*,*) 10*i + j
s’executarà un total de 9x9 = 81 vegades.
Fixeu-vos també que, de la mateixa manera que amb les sentències de control (if...end
if), les sentencies dintre de cada bucle es solen indentar per millorar la comprensió del
programa.
2 De fet, valor_pas és optatiu. Si no s’especifica assumeix que la variable incrementa en una unitat.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
21
Finalment, també es poden simular els bucles mitjançant sentencies de decisió i de salt,
tipus go to. Veiem un exemple
read(*,*) N
isuma=0
i=1
1 if(i.LE.N) then
isuma=isuma+i
i=i+1
go to 1
end if
write(*,*) ‘La suma dels ‘,N, ‘ primers nombres enteres es: ‘,isuma
Aquest programa també realitza la suma dels N primers nombres enters. La repetició de
les sentències s’aconsegueix amb la sentència go to 1. El que fa és transferir el control
de l’execució a la línia etiquetada amb el numero 1.
De tota manera, és molt recomanable no utilitzar mai les sentencies de salt tipus go to.
La raó principal és que dificulten la comprensió del codi font.
Exemple: Un mètode per resoldre equacions no lineals és el de les substitucions successives. Si
tenim una equació del tipus f(x)=x , es dóna un valor inicial a x i es calcula la seva imatge f(x).
Si f(x)=x, vol dir que x és la solució. Cas contrari, s’utilitza el valor de f(x) com a nova
aproximació a la solució i s’itera fins que la diferència entre el valor de x i la seva imatge f(x)
sigui menor que un nombre suficientment petit (precisió). Fes un petit programa que trobi la
solució a l’equació ln(x)=x.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
22
1.5- Altres dispositius Input/Output
Ens podem comunicar amb l’ordinador a traves d’altres dispositius a banda del teclat i
la pantalla. En concret, és molt freqüent fer servir fitxers per emmagatzemar les dades ,
tant d’entrada (input) com de sortida (output).
Això pot ser útil per introduir ràpidament gran quantitat d’informació al programa (una
matriu, per exemple) o per emmagatzemar els resultats directament per posteriors
aplicacions.
En FORTRAN l comanda open ens serveix per obrir un fitxer. La sintaxi bàsica és la
següent
open(nombre_INTEGER, file=cadena_CHARACTER)
on cadena_CHARACTER és el nom del fixer i nombre_INTEGER el número que se li
assignarà internament. Per exemple amb
open(1, file=”dades.dat”)
obrim un fitxer al directori de treball que es diu dades.dat, i internament li assignem el
nombre 1.
El nom del fitxer es pot introduïr també mitjançant una variable de tipus
CHARACTER. Per exemple aquest petit tros de codi
CHARACTER*20 nomfitxer
write(*,*) ‘Escriu el nom del fitxer que vols obrir/crear “
read(*,*) nomfitxer
open(1,file=nomfitxer)
ens demana (per pantalla) el nom del fitxer que volem obrir, el guarda en una variable
de tipus CHARACTER anomenada nomfitxer i finalment obre el fitxer amb el nom que
hem entrat (per teclat) , tot assignant-li la unitat 1.
Podem tenir accés a tants fitxers com vulguem, escrivint cada cop una sentència de tipus
open per cadascun.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
23
Un cop tenim un fitxer obert (accessible) podem llegir dades que haguéssim
introduït anteriorment o bé escriure dades noves.
Per llegir dades existents al fitxer, fem servir al comanda read. Així,
read(1,*) N,x0
llegeix un nombre enter i un nombre real del fitxer que li hem assignat el nombre 1, és a
dir, en aquest cas dades.dat. És clar que al fitxer hauríem d’haver escrit prèviament els
valors de les variables per què els llegeixi el programa de la mateixa manera que ho
hauríem fet mitjançant el teclat.
Per tant, el fitxer dades.dat haurà de contenir, per exemple
10, 0.57d0
o bé
10
0.57d0
Si, per contra, el fitxer no existia prèviament (o el volem sobreescriure) i hi volem
escriure dades, faríem, per exemple
write(1,*)’Aquesta línia sortirà al començament del fitxer’
write(1,*)’Tot seguit escric un nombre sencer i un de real’, N,x0
Si obrim el fitxer dades.dat amb un editor simple com el Bloc de Notes del Windows hi
trobaríem el següent
Aquesta línia sortirà al començament del fitxer
Tot seguit escric un nombre sencer i un de real 10 0.57d0
És molt important tenir en compte que l’accés als fitxers és seqüencial.
És a dir, que per accedir a la línia n-sima d’un fitxer haurem d’haver llegit les n-1 línies
anteriors. Quan obrim un fitxer amb la comanda open, el programa esta preparat per
llegir/escriure de/a la primera línia del fitxer. Conforme anem llegint o escrivint anem
avançant línia a línia.
Un comanda que pot ser útil en algunes circumstàncies és rewind(nombre_fitxer), de
manera que si fem
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
24
rewind(1)
tornem al programa a la posició inicial del fitxer (primera línia).
Tot i que no és necessari pel correcte funcionament del programa, és recomanable
tancar el fitxer un cop hàgim escrit/llegit tota la informació amb la comanda
close(nombre_fitxer)
close(1)
Finalment, val a dir que les unitats 5 i 6 estan reservades per defecte i corresponen a
“teclat” i “pantalla”. Es a dir que
write(*,*) és equivalent a write(6,*) i
read(*,*) és equivalent a read(5,*)
Per exemple, per fer que el programa escrigui un llistat dels N primers nombres sencers
amb els corresponents quadrats en un fitxer podríem fer el següent
open(2,file=”llista.out”)
read(*,*) N
do i=1,N
write(2,*) i, i*i
end do
end
Es molt recomanable donar extensió típica diferent als fitxers que han de ser
essencialment d’input i d’ouput. Per exemple, els fitxers d’input es solen anomenar
*.in o *.dat , mentre que pels d’output es solen fer servir extensions del tipus *.out
o *.log.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
25
1.6- Vectors i Matrius
En programació, un array o vector no és més que una manera ordenada
d’emmagatzemar un conjunt d’elements del mateix tipus sota un mateix nom. Aquests
elements, en FORTRAN 77 poden qualsevol dels tipus de variables que hem vist.
Per indicar en un programa que volem fer servir un array, primer de tot l’hem de
declarar amb una sentència DIMENSION. Com totes les sentencies de declaració, les
haurem de introduir sempre abans de les sentències d’execució. Veiem un exemple
DIMENSION a(10)
DIMENSION b(10,10), imat(10,15)
Amb la primera de les sentències anteriors hem declarat una variable array
monodimensional (vector) de dimensió 10 al què hem assignat el nom a. A la segona
hem declarat dos arrays bidimensionals (matrius) b i imat de dimensions 10x10 i 10x15,
respectivament.
A més, els elements del vector a i la matriu b seran variables de tipus REAL mentre que
la de la matriu imat seran de tipus INTEGER (perquè el nom comença per i, i sempre i
quan no hàgim sobreescrit les opcions per defecte).
És important entendre que, de nou, el fet de declarar no implica assignar cap valor als
elements dels vectors o matrius. Només n’informem al ordinador de la seva existència i,
en aquest cas, en fixem el nombre màxim d’elements per dimensió que en poden
emmagatzemar.
Per assignar valors als elements del vectors o matrius ho podem fem de la següent
manera amb sentències d’assignació:
a(1) = 2.0d0
read(*,*) b(2,3)
imat(1,15) = 2
En el primer cas emmagatzemem el valor 2.0d0 al primer element del vector a, al què es
fa referència com a a(1). En el segon accedim a l’element que es troba en la segona fila,
tercera columna i li assignem el valor que l’usuari entra externament mitjnaçat el teclat,
etc...
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
26
En FORTRAN 77, per assignar un valor a cada element d’un vector o una matriu s’ha
de fer element per element. Afortunadament, per això tenim els bucles. Per exemple, si
volem inicialitzar els elements del vector a a zero faríem simplement
do i=1,10
a(i) = 0.0d0
end do
Per entrar els elements de la matriu b externament mitjançat el teclat podríem fer
do i=1,10
do j=1,10
read(*,*) a(i,j)
end do
end do
Fixa’t que en aquest cas els elements de la matriu s’introdueixen un per un i per
columnes. Existeix una manera alternativa que permet llegir (i escriure) matrius de
manera semblant a com ho fem sobre el paper, introduint els valors filera per filera. Per
fer això cal escriure el següent.
do i=1,10
read(*,*) (a(i),i =1,10)
end do
i
do i=1,10
read(*,*) (a(i,j),j =1,10)
end do
En el primer cas entraríem els elements del vector un a un i entre comes. En el segon,
entraríem els elements d’una mateixa filera un a un i entre comes, i això per les 10
fileres de la matriu (començant per la primera).
i vectors.
A l’hora d’escriure la matriu per pantalla podem fer, de la mateixa manera
do i=1,10
write(*,*) (a(i,j),j =1,10)
end do
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
27
En FORTRAN podem definir hipermatrius de fins a 7 dimensions, tot i que rarament en
necessitarem més de dues i excepcionalment 3 o 4.
És també molt important veure que, de la mateixa manera que els elements de les
matrius s’introdueixen un a un, no es poden fer operacions directament amb les
matrius/vectors. És a dir, si volem sumar dues matrius A i B (que es puguin sumar) no
ho podem fer com
C = A +B
sinó que haurem de calcular els elements de la matriu resultant un per un. De nou, els
bucles faciliten molt la feina. Primer de tot, escrivim l’expressió corresponent a un
element qualsevol de la matriu suma
c(i,j) = a(i,j) + b(i,j)
Ara, assumint que les matrius anteriors A i B han estat declarades de dimensió 10x10, el
codi que ens permetria calcular la suma de les matrius seria simplement
do i=1,10
do j=1,10
c(i,j) = a(i,j) + b(i,j)
end do
end do
És a dir, escrivim l’expressió general i mitjançant els bucles que calguin ho estenem per
tots els valors possibles.
Val a dir, finalment, que la dimensió amb què és declarat un array representa només la
dimensió màxima de l’array. De fet, és pràctica habitual declarar un array de dimensió
suficientment gran per als nostres propòsits, generalment amb una constant
PARAMETER(MAXDIM=100)
DIMENSION A(MAXDIM,MAXDIM), B(MAXDIM,MAXDIM)
i després fer servir en realitat una dimensió més petita pels nostres càlculs
...
READ(*,*) N,M
do i=1,N
read(*,*) (A(i,j),j =1,M)
end do
....
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
28
El codi següent
DIMENSION A(N,M), B(N,M)
...
READ(*,*) N,M
do i=1,N
read(*,*) (A(i,j),j =1,M)
end do
....
no es possible en FORTRAN77 i donarà error. La raó és que, en el moment de
declarar les matrius A i B , les variables N i M no tenen assignat cap valor (i de cap
manera es pot escriure la sentència READ abans de les sentencies de declaració!).
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
29
1.7 Subprogrames: Funcions i Subrutines
El llenguatge FORTRAN té dos tipus de subprogrames: la subrutina i la funció externa.
L’objectiu és el de definir subprogrames o blocs que realitzin tasques específiques.
Aquests blocs realitzaran part del programa i poden ser utilitzat per a la construcció
d’un programa major o futur. Per tal que es pugui segmentar el programa cal
comunicació entre els diferents subprogrames. Aquesta comunicació es fa mitjançant els
paràmetres dels subprogrames. Les regles per passar la informació del programa
principal als subprogrames són les mateixes tant per les funcions com per les subrutines.
La principal diferencia entre una funció i una subrutina és que la primera torna al
programa principal, un valor emmagatzemat en el seu propi nom, mentre que la
subrutina ho fa a traves dels paràmetres.
Funcions
Una utilitat obvia de les funcions en FORTRAN és precisament la de definir funcions
matemàtiques complexes. De fet, el FORTRAN té una sèrie de funcions matemàtiques
bàsiques per defecte. Son les funcions intrínseques. Algunes d’aquestes son
Funció Resultat
sin(nombre_real); cos(nombre_real);
tan(nombre_real)
sinus, cosinus o tangent d’un nombre real
en radians
asin(nombre_real); acos(nombre_real);
atan(nombre_real)
arcsinus, arcosinus o arctangent en
radians exp(nombre_real) Valor de e elevat a la potència indicada
sqrt(nombre_real) Arrel quadrada d’un nombre real
log(nombre_real) Logaritme neperià d’un nombre real
log10(nombre_real) Logaritme en base 10 d’un nombre real
abs(nombre_real_o_integer) Valor absolut d‘un nombre real o sencer
mod(sencer1,sencer2) Resta entera de la divisió entre sencer1 i
sencer2
real(nombre_sencer) Equivalent real d’un nombre sencer
Quan l’argument de la funció sigui un nombre real de doble precisió (REAL*8,
DOUBLE PRECISION) s’afegeix una “d” al nom de la funció.
sin(0.56) dsin(0.56d0)
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
30
sqrt(37.8) dsqrt(4.0d0)
Tot i això alguns compiladors ajusten automàticament la precisió al tipus de dada que
s’utilitza com a argument sense necessitat d’afegir aquesta “d” extra.
Podem fer servir les funcions intrínseques en sentencies d’assignació o mostrar el
resultat directament
x = sin(3.0)
write(*,*) dsqrt(x)
Nosaltres podrem definir funcions (que poden ser matemàtiques o de qualsevol tipus) en
FORTRAN de manera que les puguem fer servir de manera anàloga a com s’utilitzen
les funcions intrinseques.
Per fer-ho hem de crear un subprograma de tipus funció. En aquest cas la nomenclatura
és la següent
function nom_funció (llista d’arguments)
declaració dels arguments
sentencies....
nom_funcio=expressió
end
És important tenir en compte que, com a subprograma, cal escriure la funció de manera
externa al programa principal. És a dir, normalment escriurem les funcions al final de
programa i sempre desprès de la sentencia end. (Fixeu-vos que al final de la
declaració de la funció també cal afegir la sentencia end).
Un cop definida la funció la podem fer servir dins el programa com una funció
intrínseca més. En aquest cas podríem fer
x = nom_funcio(llista d’arguments)
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
31
Veiem un exemple: Podríem definir la funció f(x) =2 e- 2x
+ sin(x)
function y(x)
IMPLICIT DOUBLE PRECISION (a-h,o-z)
PARAMETER(PI=dacos(-1.0d0))
y = 2.0d0*exp(-2.0d0*x)-sin(PI*x)
end
(Fixa’t en la manera d’introduir el valor de . Així s’aconsegueix el màxim de precisió)
i dintre del programa podem cridar a la funció amb sentencies del tipus
val = y(2.0)
read(*,*) x0
write(*,*) ‘El valor de la funció a x0 = ‘,x0, ‘es ‘,y(x0)
Exemple: Definirem una funció entera que comprovi si un nombre N1 es divisible per
un altre N2. Cas que si, la funció ha de prendre el valor 1 i 0 en cas contrari. En aquest
cas li hem de passar a la funció dos arguments (N1i N2) que seran dues variables de
tipus INTEGER. Ho podríem fer de la següent manera
FUNCTION idiv(N1,N2)
ir = mod(N1,N2)
IF(ir.EQ.0) then
idiv=0
else
idiv=1
end if
end
Llavors el programa principal quedaria
PROGRAM check_division
WRITE(*,*) ‘Entra dos nombres enters i et dire si son divisibles entre si’
READ(*,*) N1,N2
IF(idiv(N1,N2).EQ.1) then
WRITE(*,*) N1,' i’ ,N2, ‘son divisibles’
else
WRITE(*,*) N1,' i’ ,N2, ‘no son divisibles’
end if
end
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
32
De fet, aquest programa no funcionarà en tots els casos. Es un exemple típic de
programa ben escrit però mal pensat.
Fixa’t que si N2 es més gran que N1 el programa dirà que els números son divisibles!
Per tant ens caldria afegir a la funció un filtre previ que comprovi que el divisor sigui
més petit que el dividend.
Per exemple
FUNCTION idiv(N1,N2)
if(N1.gt.N2) then
ir = mod(N1,N2)
else
ir = mod(N2,N1)
end if
IF(ir.EQ.0) then
idiv=0
else
idiv=1
end if
end
En l’argot informàtic diem que ara la funció és més robusta.
De tota manera, ja que la funció en el fons ens ha de dir si o no, el més adient és definir-
la de tipus LOGICAL. La funció, amb una altra petita modificació podria quedar de la
següent manera.
LOGICAL FUNCTION idiv(N1,N2)
idiv=.true.
if(N1.gt.N2) then
ir = mod(N1,N2)
else
ir = mod(N2,N1)
end if
IF(ir.EQ.0) idiv=.false.
end
Fixeu-vos que la funció idiv és de tipus LOGICAL, de la mateixa manera que la versió
anterior era de tipus INTEGER. Per construir una funció que retorni un nombre
INTEGER només cal que el nom comenci per les lletres i-n.(sempre i quan no hàgim
sobreescrit les opcions per defecte). Si volem una funció de tipus LOGICAL ho hem de
expressar explícitament a l’hora de definir la funció (LOGICAL FUNCTION).
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
33
Cal anar en compte ara. Ja que la funció és de tipus lògic, el seu resultat s’ha d’assignar
o ha de aparèixer en un context de tipus LOGICAL també. Per tant, caldria modificar el
programa principal de la manera següent
PROGRAM check_division
LOGICAL idiv
WRITE(*,*) ‘Entra dos nombres enters i et dire si son divisibles entre si’
READ(*,*) N1,N2
IF(idiv(N1,N2).EQ..true.) then
WRITE(*,*) N1,' i’ ,N2, ‘son divisibles’
else
WRITE(*,*) N1,' i’ ,N2, ‘no son divisibles’
end if
end
Per últim, es important veure que els noms de les variables que es passen com a
argument a la funció i al programa principal no tenen perquè coincidir i, de fet, no ho
solen fer. El que si ha de coincidir és el tipus de variable i l’ordre en que es passen els
arguments. Per tant, escriure la funció anterior com
LOGICAL FUNCTION idiv(K1,K2)
idiv=.true.
if(K1.gt.K2) then
ir = mod(K1,K2)
else
ir = mod(K2,K1)
end if
IF(ir.EQ.0) idiv=.false.
end
no afecta en absolut el funcionament del programa. Simplement, quan el control del
programa es passa a la funció, aquesta pren els valors emmagatzemats a les variables
N1 i N2, els guarda amb altres variables K1 i K2 per utilitzar-los posteriorment. Tot i
això, en FORTRAN, si a la funció es modifiquen els valors assignats a K1 o K2, aquests
canvis es veuran reflectits també a les variables N1 i N2 quan el control del programa
torni al programa principal.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
34
Subrutines
Sovint, les operacions que cal fer son massa llargues o complexes per poder incloure-les
dins una funció3. Si decidim posar-les dins el programa principal podríem fer més difícil
el seguiment de l’estructura lògica del programa. Per exemple, si al mig d’un programa
haguéssim d’invertir una matriu seria més còmode dir-li al ordinador
Deixa per un moment el que estàs fent, inverteix aquesta matriu, i quan estiguis, torna
amb el que feies
Això precisament és el que fan les subrutines. És un programa independent que és cridat
dins el programa principal, i que realitza una feia concreta. Un cop terminada, es retorna
automàticament el control al programa principal. En aquest cas la sintaxi és la següent
subroutine nom_funció (llista d’arguments)
declaració dels arguments
sentencies....
end
És clar que, com a programa independent, necessita comunicar-se amb el programa
principal per a) disposar de les dades inicials necessàries (input) i b) passar-li al
programa principal les noves dades calculades (output). Aquestes variables d’input,
output i input-output4 s’especifiquen a la llista d’arguments. Noteu que aquestes
variables s’han de declarar, de la mateixa manera que es fa al programa principal. És a
dir que si la variable que passem es de tipus CHARACTER o una matriu, cal incloure
les respectives sentències CHARACTER i DIMENSION a la subrutina. De la mateixa
manera, per evitar sorpreses, si hem afegit al programa principal la sentència
implicit double precision(a-h,o-z)
el mateix hauríem de fer als subprogrames (tant de tipus funció com subrutina)
3 A més, podríem necessitar que el subprograma ens retornés més d’un únic valor (una matriu, per
exemple) i per tant la funció no ens serviria.
4 En aquest cas el valor de la variable d’input inicial es sobreescriu dins la subrutina i el seu valor
modificat es passa al programa principal
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
35
Crides a les subrutines
Per poder accedir a una subrutina dins un programa farem servir la sentència CALL. Per
exemple, si hem definit una subrutina determinada
subroutine fes_algo(llista_arguments)
la cridarem des de el programa principal fent
call fes_algo(llista_arguments)
Recordeu que a la subrutina li hem de passar el mateix tipus d’arguments (i en el
mateix ordre), però no tenen perquè tenir el mateix nom. A més, les variables que no
es passen com a arguments dins una subrutina no són visibles pel programa
principal i viceversa. Per tant, podem fer servir variables amb el mateix nom al
programa principal (tipicament i, j, k, etc per als bucles) i als subprogrames sense que
interfereixin.
Cal tenir en compte que l’ús de subrutines respon més a raons estètiques que
computacionals. Res impedeix fer un programa sense subrutines, tot i que sovint es
redueix la complexitat i longitud del codi. Per exemple, suposem que disposem d’una
subrutina que realitza el producte de dues matrius quadrades de dimensió N. La
subrutina es diu multmat i els seus arguments son la dimensió de les matrius (N), les
matrius a multiplicar (A,B) i la matriu on emmagatzemarem el resultat (C).
Les primeres linees de la declaració de la subrutina haurian de ser quelcom com
subroutine multmat(N,A,B,C)
implicit double precision(a-h,o-z)
parameter(maxdim=100)
dimension A(maxdim,maxdim),B(maxdim,maxdim),C(maxdim,maxdim)
Llavors, dins el programa prinicpal, la subrutina s’hauria de cridar de la manera següent
call multmat(N,A,B,C)
Podem veure la utilitat de definir subrutines si ens plantegem determinar la k-essima
potència d’una matriu (Ak). En aquesta cas el programa es podria escriure de la següent
manera
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
36
PROGRAM potencia
PARAMETER(MAXDIM=100)
DIMENSION A(MAXDIM),A2(MAXDIM), AK(MAXDIM)
WRITE(*,*) ‘Entra les dimensions de la matriu quadrada :'
READ(*,*) N
WRITE(*,*) ‘Entra la matriu per files:'
do i = 1,N
READ(*,*) (A(i,j)=j=1,N)
end do
WRITE(*,*) Quina potència vols calcular?'
READ(*,*) k
do i=1,N
do j=1,N
a2(i,j)=a(i,j) !Copiem la matriu A a una matriu auxiliar
end do
end do
do i=1,k-1 ! hem de realitzar k-1 productes...
call multmat(N,A2,A,Ak) !fem Ak=A2xA
do i=1,N
do j=1,N
a2(i,j)=ak(i,j) !Desprès de fer cada producte copiem
end do !el resultat en la matriu auxiliar
end do
end do
WRITE(*,*) ‘Resultat:'
do i=1,N
WRITE(*,*) (Ak(i,j)=j=1,N)
end do
end
És clar que no és el algorisme més eficient! Per altra banda, fixeu-vos que hi ha part de
codi repetida; el necessària per copiar una matriu en una altra. Per fer el codi més
llegible podríem fer una altra subrutina que fes aquesta feina.
SUBROUTINE copiamatriu(N,A,B)
PARAMETER(MAXDIM=200)
DIMENSION A(MAXDIM),B(MAXDIM)
do i=1,N
do j=1,N
B(i,j)=A(i,j) !Copiem la matriu A a B
end do
end do
end
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
37
i llavors al programa principal es podria fer
PROGRAM potencia
PARAMETER(MAXDIM=200)
DIMENSION A(MAXDIM),A2(MAXDIM), AK(MAXDIM)
WRITE(*,*) ‘Entra les dimensions de la matriu quadrada :'
READ(*,*) N
WRITE(*,*) ‘Entra la matriu per files:'
do i=1,N
READ(*,*) (A(i,j)=j=1,N)
end do
WRITE(*,*) Quina potència vols calcular?'
READ(*,*) k
call copiamatriu(N,A,A2)
do i=1,k-1
call multmat(N,A2,A,Ak) ! hem de realitzar k-1 productes...
call copiamatriu(N,Ak,A2)
end do
WRITE(*,*) ‘Resultat:'
do i=1,N
WRITE(*,*) (Ak(i,j)=j=1,N)
end do
end
Totes dues versions fan el mateix però aquesta última queda més compacta i més fàcil
d’entendre.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
38
Procés de compilació
Un cop hem finalitzat un programa principal, cal tenir en compte que el codi
corresponent a les funcions i/o subrutines que utilitzi cal incloure’l en el procés de
creació del programa executable (.exe). Això ho podem fer de dues maneres:
a) Podem incloure al fitxer que conté el programa principal el codi font de les funcions i
subrutines. Si ho fem d’aquesta manera, el procés de compilació és equivalent al que
caldria fer per un codi font sense subprogrames.
b) Si tenim el codi font del programa principal i el dels subprogrames en fitxers
diferents, aleshores hem de compilar tots dos fitxers per separat i ajuntar-los (link)
posteriorment per general el fitxer executable. En aquest cas, caldria obtenir primer els
fitxers OBJECTE (.OBJ) per cada fitxer (generalment amb la opció “–c” del
compilador) i finalment ajuntar els objectes per crear l’executable (generalment amb la
opció “-out” )
Cal tenir en compte que un cop obtingut el corresponent fitxer OBJECTE, si el fitxer
del que prové no es modifica, no cal recompilar-lo cada vegada!
De tota manera, el compilador normalment fa aquesta feina per nosaltres.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
39
2.- Àlgebra lineal
No entrarem en detalls ni en definicions massa formals sinó que veurem únicament
aquells conceptes que necessitarem durant el curs.
2.1 Espais vectorials
Un espacio vectorial es una estructura algebraica que incluye dos tipos de elementos
que cumplen una serie de propiedades y axiomas. Éstos elementos son los escalares y
los vectores.
En general, los escalares serán el conjunto de números reales o complejos.
Los vectores son objetos abstractos que cumplen una serie de propiedades y no tienen
porque ser únicamente los vectores geométricos que conocemos. El término vector
también se usa para describir entidades como matrices, polinomios o funciones. Por
ejemplo, los vectores que se usan en mecánica cuántica son funciones.
2.2 Combinación lineal, independencia lineal y base
Supongamos un conjunto de N vectores de un espacio vectorial determinado
Nvvv ,...,, 21 .
Una combinación lineal de dichos elementos se define como la suma siguiente
N
i
iiNN vavavava ...2211
donde a1, a2,.., an son escalares.
El conjunto de N vectores es linealmente independiente si se cumple que
0N
i
iiva
únicamente cuando a1 = a2 =...= an = 0.
Esto implica que ningún vector del conjunto Nvvv ,...,, 21 puede expresarse como
combinación lineal de los demás.
El conjunto de vectores será un conjunto generador del espacio vectorial si cualquier
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
40
vector w que pertenezca al espacio vectorial puede expresarse como combinación lineal
de ellos
N
i
iiNN vavavavaw ...2211
.
Además, si esta combinación es única el conjunto generador será una base del espacio.
En este caso, los vectores del conjunto serán además linealmente independientes.
Los coeficientes escalares a1, a2,.., an serán las componentes del vector w en la base.
El numero de vectores de una base determina la dimensión del espacio vectorial. En
realidad, los espacios vectoriales pueden ser de dimensión finita o infinita5. El conjunto
de todos los vectores de n componentes reales conforma el espacio vectorial Rn, cuya
dimensión es precisamente n.
Por ejemplo, para el espacio Euclidiano tridimensional, R3. el conjunto de vectores
{(1,2,3), (0,1,2), (−1,1/2,3), (1,1,1)},
son generadores del espacio pero no son base, porque no son linealmente
independientes. Una base del espacio la forman los vectores
{(1,0,0), (0,1,0), (0,0,1)}.
Sin embargo, los vectores
{(1,0,0), (0,1,0), (1,1,0)}
no son generadores (ni base) de R3 porque los vectores cuya tercera componente sea
diferente de cero no pueden expresarse como combinación lineal de ellos.
2.3 Producte escalar
Aparte de las propiedades propias del espacio vectorial se define también un producto
interno que permite introducir las nociones de distancia, ángulo y norma, llamado
producto escalar.
Un producto escalar debe cumplir también una serie de propiedades y de hecho su
definición depende del tipo de espacio vectorial.
5 En los espacios que intervienen en la mecánica cuántica, Espacios de Hilbert, los vectores son
funciones definidas sobre el cuerpo complejo que cumplen una serie de condiciones y la dimensión del
espacio es infinita.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
41
Para el espacio vectorial Rn se define el producto escalar entre dos vectores como
n
i
iinn
T vwvwvwvwvwvw ...2211
és a dir, la suma dels productes de les components dels vectors.
A partir del producte escalar entre un vector amb si mateix
22)( vwvvN
i
i
trobem el concepte de norma
21vvv
Direm que un vector està normalitzat quan la seva norma és la unitat
1v
Es demostra també que el producte escalar entre dos vectors també cumpleix
cosvwvw
a on és l’angle que formen ambdós vectors. Per tant, quan dos vectors són ortogonals
entre si, el seu producte escalar s’anula
vwsivw
0
Si els vectors d’una base iv
són ortogonals ente si i estan normalitzats direm que la
base és ortonormal o que està ortonormalitzada.
Podem escriure ambdues condicions al meteix temps fent servir la funció delta de
Kronecker
ijji vv
on
ji
jiij
1
0
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
42
2.4 Matrius: propietats i operacions
Definicions i propietats elementals.
Una matrius és una taula rectangular de generalment números que poden ésser sumats o
multiplicats. Les línies horitzontals de números es diuen fileres i les verticals
columnes. Una matriu composada per n files i m columnes en diem una matriu de
dimensió n x m.
Donada una matriu A de dimensió n x m , representem l’element que ocupa la i-éssima
fila i j-éssima columna com Aij o bé A(i,j).
Un vector no és més que una matriu on una de les dimensions és 1. Així, un vector
filera és una matriu de dimensió 1 x m i un vector columna una matriu de dimensió
n x 1.
Suma de matrius
Donades dues matrius de dimensió n x m, A i B, podem definir la seva suma C = A + B
com la matriu de dimensió n x m els elements de la qual venen donat per la suma dels
elements corresponents de les matrius suma A i B.
jiBAC ijijij ,
Per poder sumar dues matrius, aquestes han de tenir les mateixes dimensions. La matriu
resultant tindrà també les mateixes dimensions.
Producte de matriu per escalar
Donada una matriu A qualsevol i un escalar definim el producte escalar de per A,
B = ·A com el producte de per cada element de la matriu A
jiAB ijij ,
Producte de matrius
El producte matricial entre dos matrius A i B només es pot dur a terme quan el numero
de columnes de la matriu A és igual al número de files de la matriu B. En aquest cas,
sigui a matriu A de dimensió n x m i la matriu B de dimensió m x p tenim que el
producte matricial A·B és una altra matriu C de dimensió m x p , els elements de la qual
són
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
43
pjmiBABABABACn
k
kjiknjinjijiij ,1,1...2211
El producte de matrius no és conmutatiu, per tant, en general
A·B ≠ B·A
De fet, en l’exemple anterior el producte B·A no és possible perquè el nombre de fileres
de B no coincideix amb el nombre de columnes de A.
Tipus de matrius
Matriu quadrada
Matriu on el nombre de fileres és igual al nombre de columnes. El producte enter dues
matrius quadrades és una altra matriu quadrada. Amb matrius quadrades els productes
matricials A·B i B·A són possible, tot i que en general no donen el mateix resultat.
Matriu simètrica
Una matriu quadrada A és simètrica si compleix que
jiAA jiij ,
Matriu diagonal
Una matriu quadrada A és diagonal si els elements de fora de la diagonal principal són
zero
jiAij 0
Matriu identitat
La matriu identitat és una matriu quadrada diagonal on els elements de la diagonal
principal són la unitat. Per tant , podem escriure els seus elements a partir d’una delta de
Kronecker
ijijI
La matriu identitat fa el paper d’element neutre per la suma de matrius. És a dir, el
producte d’una matriu quadrada per la matriu identitat (i viceversa) és la pròpia matriu.
A·I = I·A = A
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
44
Matriu transposada
Donada una matriu A de dimensió n x m , definim la seva matriu transposada, AT, que
serà de dimensió m x n intercanviant les seves fileres i columnes,
nmmm
n
n
T
nmnn
m
m
aaa
aaa
aaa
A
aaa
aaa
aaa
A
...
............
...
...
...
............
...
...
21
22212
12111
21
22221
11211
Per una matriu simètrica es compleix
A = AT
Per altra banda, en general
(AT)T = A
(A + B)T = A
T + B
T
(A·B)T = B
T· A
T
Per tant, el producte d’una matriu qualsevol per la seva transposada resulta en una
matriu simètrica
B = AT·A B
T = (A
T·A)
T = A
T·(A
T)T= A
T·A =B
Matriu Inversa
Donada una matriu quadrada A de dimensió n, es defineix la seva matriu inversa A-1
com la matriu que compleix que
A-1
·A = A·A-1
·= I
on I és la matriu identitat de dimensió n. Al matriu inversa A-1
és única.
En general
(A-1
)-1
= A
(A·B)-1
= B-1
· A-1
Matriu singular
Una matriu és singular quan no existeix la seva inversa. Quan el determinant d’una
matriu quadrada és zero (veure avall) la matriu és singular.
Matriu ortogonal o unitària
Una matriu quadrada U és ortogonal o unitària quan la seva transposta és la seva inversa
U-1
= UT·
Si dues matrius A i B són ortogonals el seu producte és també una matriu ortogonal
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
45
Una matriu és ortogonal si i només si els seus vectors columna son ortonormals, és a
dir, representa una base ortonormalitzada.
Traça d’una matriu
Es defineix la traça d’una matriu quadrada de dimensió n com la suma dels elements de
la diagonal principal
N
i
iiAAtr )(
Determinant d’una matriu
El determinant d’una matriu quadrada es pot veure com una funció d’aquesta que
retorna un escalar (número)
det(A) =
Quan el determinant d’una matriu és zero, aquesta matriu és singular (no invertible).
També vol dir una o més fileres o columnes de la matriu es pot expressar com a
combinació lineal de les altres; per tant, indica dependència lineal dels vectors filera o
columna que composen la matriu.
Es compleixen les següents propietats
det(AB) = det(A) det(B) = det (BA)
det(AT) = det(A)
det(U) = 1
A més
Si intercanviem dues fileres o columnes d’una matriu el seu determinant canvia
de signe
Multiplicant una filera o columna per un escalar multiplica el valor del
determinant per
Afegir un multiple d’una filera o columna a una altra no afecta al valor del
determinant
En seccions següents veurem com es determina el determinant d’una matriu quadrada.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
46
2.5 Canvis de base.
Donades dues bases iw
i iw
d’un espai vectorial Rn, podem escriure cada vector de
la base iw
en com a combinació lineal dels vectors de la base iw
.
nnnnnn
nn
nn
vavavaw
vavavaw
vavavaw
...
...
...
...
2211
22221212
12121111
Els coeficients de la combinació lineal es poden escriure en forma de matriu, que
representa el canvi de base.
nnnn
n
n
aaa
aaa
aaa
A
...
............
...
...
21
22221
11211
Podem escriure el procés de canvi de base de la següent manera
AVW
on W i V son matrius que contenen, en columnes, les components dels vectors de les
bases iw
i iw
, respectivament
nnnn
n
n
n
www
www
www
wwwW
...
............
...
...
...;;;
21
22221
11211
21
Per tant, podem escriure
nnnn
n
n
nnnn
n
n
nnnn
n
n
aaa
aaa
aaa
vvv
vvv
vvv
www
www
www
...
............
...
...
...
............
...
...
...
............
...
...
21
22221
11211
21
22221
11211
21
22221
11211
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
47
3.- Resolució d’equacions d’una variable
3.1. Recerca de zeros de funcions.
Els algorisme per trobar zeros de funcions son mètodes numèrics que permeten trobar
un (o més) valors de x tal que f(x) = 0 per una determinada funció f d’una variable.
Donada la naturalesa numèrica dels mètodes, aquests algorismes no serveixen per trobar
solucions exactes o enteres.
Aquests mètodes són de tipus iteratiu. Es parteix d’un (o més) punts inicials i es genera
una seqüència de valors de x que, si tot va bé, convergeixen a un zero de la funció.
Aquestes noves aproximacions a la solució del problema es generen tenint en compte
d’alguna manera els valors anteriors.
Els principals factors a tenir en compte quan es fan servir aquestes mètodes son:
la seva robustesa a l’hora de trobar una solució correcta
la velocitat de convergència
el grau de coneixement de les característiques de la funció f.
Finalment, és important donar-se compte que qualsevol equació d’una variable es pot
escriure sempre de la forma f(x) = 0, per tant, trobar zeros de funcions és en el fons
equivalent a resoldre equacions generals d’una variable.
3.2 Mètode de la bisecció
L’algorisme més senzill per trobar zeros de funcions és el mètode de la bisecció.
Requereix el coneixement de dos punts inicials x=a i x=b tal que f(a) i f(b) tinguin signe
diferent i és aplicable quan la funció f es continua com a mínim dins l’interval [a,b]. En
aquest cas ha d’existir per força (Teorema de Bolzano) com a mínim un punt en
l’interval tal que la funció s’anul·li, que serà un zero de la funció.
El mètode de la bisecció és molt robust però la seva convergència es força lenta.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
48
Algorisme
Primer de tot cal disposar de dos punts a i b on les imatges de la funció f(a) i f(b)
tinguin signe diferent. Si la funció és contínua dins l’interval b,ax , un zero de la
funció es trobarà dins el mateix.
a
b
f(a)
f(b)
El que proposa aquest mètode és dividir l’interval [a,b] en dos parts iguals calculant el
punt mig
xnou = (a + b)/2
a
b
f(a)
f(b)xnew = (a+b)/2
f(x new)
Llavors, segons sigui el signe6 de la imatge de la funció en aquest punt, f(xnou), el zero
de la funció es trobarà dins l’interval [a,xnou] (f(xnou) i f(a) tenen diferent signe) o bé
6 En el cas que f(xnou) = 0 voldria dir que hauríem trobar el zero de la funció.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
49
[xnou,b] (f(xnou) i f(b) tenen diferent signe). En el cas de la figura anterior és clar que
l’interval més petit on es troba la solució és el x[xnew, b].
En qualsevol cas, després d’aquesta primera iteració ens tornem a trobar en la mateixa
situació que al principi però amb l’avantatge de que l’amplada de interval en què es
troba el zero de la funció ha quedat reduït a la meitat.
Llavors, es torna a trobar de nou el punt mig del nou interval i va repetint l’operació fins
que
a) trobem un punt mig xnou tal que f(xnou) = 0
b) l’amplada de l’interval és suficientment petita per a la precisió que es necessita.
En realitat, com que treballem numèricament amb variables de tipus REAL, el cas a) és,
a la pràctica, gairebé impossible que succeeixi.
De fet, als programes no es sol imposar mai una condició com la de a) amb variables de
tipus REAL. Així, en comptes de f(xnou) = 0 en realitat el que farem és dir | f(xnou) | < ,
on és un número suficientment petit que marca la precisió del càlcul numèric.
Es tracta doncs d’un mètode iteratiu, i el nombre d’iteracions vindrà donat, pel tipus de
funció que estudiem i de la precisió o tolerància que volem.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
50
3.3 Mètode de la Regula-Falsi o de la falsa posició
Aquest mètode és també un mètode iteratiu que parteix d’un interval on sabem que es
troba la solució i que iterativament va disminuint l’interval, acotant així el valor del zero
de la funció.
Algorisme
La única diferència respecte al mètode de la bisecció és que a l’hora de reduir l’interval
on es troba el zero de la funció no fa servir simplement el punt mig,
a
b
f(a)
f(b)xnew
f(xnew)
sinó que fa servir el punt on la recta que passa pels punts {a, f(a)} i {b, f(b)} talla
l’eix d’abscisses. És a dir, s’aproxima la funció f en l’interval [a,b] per una recta i es
troba el punt de tall amb l’eix de les x d’aquesta.
L’equació general d’una recta en el pla és
f(x) = m x + n
i el punt de tall
xnou = -n/m
Si aquesta recta passa pels punts {a, f(a)} i {b, f(b)} es complirà que
f(a) = m a + n
f(b) = m b + n
Restant l’una de l’altra trobem
ab
afbfm
)()(
i d’altra banda, aïllant de la primera equació tenim
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
51
n = f(a) - m a
Per tant, l’expressió per trobar el nou punt queda de la forma
m
afa
m
nxnou
)(
Substituint l’expressió pel pendent de la recta m i reorganitzant termes podem escriure
finalment una expressió pel nou punt en funció del valor dels punts de l’interval i les
seves imatges
)()(
)()(
afbf
bafabfxnou
Una notable diferència respecte al mètode de la bisecció és que en el mètode de la falsa
posició l’amplada de l’interval on es troba el zero de la funció no tendeix a zero. De fet
el que succeeix és que un dels límits de l’interval inicial queda fix mentre que l’altre va
tendint al zero de la funció.
Per tant, en aquest cas aturem el procés iteratiu quan | f(xnou) | < , essent com hem dit
anteriorment un valor suficientment petit.
Aquest mètode sol presentar una convergència més ràpida que el de la bisecció, essent
igual de robust.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
52
3.4. Mètodes de Newton-Raphson i de la secant.
La diferència principal entres els mètodes que hem vist anteriorment i els de Newton-
Raphson o de la secant és que en aquests últims no es necessita tenir acotat el zero de la
funció dins un interval. Això suposa a priori un cert avantatge; tanmateix el preu que es
paga és que aquest tipus d’algorismes no són necessàriament convergents (no son
robusts). Tot i això, quan els mètodes convergeixen, ho fa més ràpidament que els
basats en l’acotament.
Algorisme de Newton-Raphson
La idea darrera el mètode de Newton-Raphson és molt senzilla. Es comença amb un
punt que es trobi raonablement a prop del zero de la funció, xi, i es construeix la recta
tangent a la funció en aquell punt. Llavors es determina el zero de la recta, xi+1, es pren
aquest punt com a nou punt de partida (que idealment serà una bona aproximació al zero
de la funció vertadera) i es va iterant.
xixi+1xi+2
f(xi+2) 0
f(x)
xixi+1xi+2
f(xi+2) 0
f(x)
Per tant, partim d’un punt, xi i de la seva imatge, f(xi). L’equació de la recta tangent a la
funció f en el punt xi és
y = m x + n = f’(xi) x + n
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
53
on m ve donat per la derivada de la funció en aquest punt, f’(xi) .
El punt de tall de la recta amb l’eix de les x és
xi+1 = -n/ f’(xi)
Per trobar n fem servir el fet que la recta passa pel punt {xi, f(xi)}.
Si aquesta recta passa pels punts {a, f(a)} i {b, f(b)} es complirà que
f(xi) = f’(xi) xi + n n =f(xi) - f’(xi) xi
i substituint en l’expressió anterior tenim finalment
)('
)(1
i
i
iixf
xfxx
Algunes característiques importants del mètode són:
a) En general, la convergència del mètode de Newton és quadràtica, el que implica
essencialment que el nombre de xifres significatives es dobla en cada pas.
b) Si el punt inicial no es troba a prop del zero de la funció el mètode pot divergir.
Per això, a la pràctica, és molt important restringir el nombre màxim
d’iteracions que ha de fer el programa.
c) Cal conèixer la derivada de la funció f (i per tant que aquesta sigui derivable).
Quan no es disposa de la derivada per la raó que sigui, aquesta es pot aproximar
per diferències finites , donant lloc al mètode de la secant.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
54
Algorisme de la secant
Una alternativa a l’ús de la derivada de la funció és la d’aproximar la recta tangent a la
corba per la recta secant entre el punt inicial x1 i un altre punt x2.
x1x2
f(x1)
f(x2)
x1 - x2
f(x1) – f(x2)
m
21
21 )()(
xx
xfxfm
x1x2
f(x1)
f(x2)
x1 - x2
f(x1) – f(x2)
m
21
21 )()(
xx
xfxfm
Com es pot comprovar al gràfic anterior, aquesta alternativa només implica que el
pendent de la recta amb què s’aproxima la funció ve donat per l’expressió
21
21 )()(
xx
xfxfm
Per tant, anàlogament al mètode de Newton, la posició del punt de tall de la recta amb
l’eix de les x seria
)()(
)()(
)()(
))((
21
2112
21
21113
xfxf
xfxxfx
xfxf
xxxfxx
Com es pot veure, l’expressió anterior és exactament la mateixa que la del mètode de la
falsa posició. La diferència en aquest cas és que
a) els punts inicials són dos punts propers qualsevol i no és necessari que les seves
imatges tinguin signe diferent; és a dir, no cal que definim un interval on hi ha el
zero de la funció.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
55
b) per determinar la següent aproximació al zero de la funció sempre es fan servir
els dos darrers punts utilitzats. Per tant, en general podem escriure
)()(
)()(
1
11
1
ii
iiii
ixfxf
xfxxfxx
on per trobar el punt de la iteració i+1 fem servir els punts xi i xi-1.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
56
4.- Resolució de sistemes d'equacions lineals.
4.1. Algorisme de resolució de sistemes d’equacions lineals pel
mètode de Gauss-Jordan
Partim d’un sistema de N equacions lineals amb N incògnites (x1,x2,...,xN).
NNNNNN
NN
NN
bxa...xaxa
...
bxa...xaxa
bxa...xaxa
2211
22222121
11212111
(1)
on els elements aij i bi corresponen als coeficients i termes independents de les
equacions. Podem escriure l’expressió (1) en forma matricial de manera que
bAx (2)
on
NNNNNN
N
N
x
...
x
x
x
b
...
b
b
b
a...aa
............
a...aa
a...aa
A2
1
2
1
21
22221
11211
(3)
L’algorisme de Gauss-Jordan es basa en substituir equacions (files de la matriu A) per
combinacions lineals d’equacions del propis sistema (entre files de la matriu A) de tal
manera que aconseguim transformar la matriu A en una matriu diagonal.
Anem a veure com funciona. L’objectiu és, prenent una de les equacions com a
referència (eqref) , substituir les altres equacions (eqk) per una combinació lineal del
tipus
refkk eqeqeq (4)
entre l’equació de referència i la que es vol canviar, de tal manera que aconseguim
eliminar de eqk la dependència amb la variable de referència. Per això cal triar
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
57
escaientment el factor .
En forma matricial, el que implica és que si hem escollit la primera fila de A com a
referència, substituirem les altres files per combinacions lineals tals que facin que
l’element Ak1 s’anul·li. És a dir, en aquesta cas volem aconseguir que en la primera
columna de la matriu A tots el elements siguin zero excepte el primer (el de la fila de
referència). Es pot comprovar fàcilment que si substituïm la segona de les equacions per
la combinació
1
11
2122 eq
a
aeqeq'
(5)
la nova eq2 tindrà la forma
'bx'a...x'ax NN 1121210 (6)
Si ho fem per totes les equacions (excepte la de referència) tindrem un sistema
d’equacions equivalent al original
'bx'A (7)
on tant la matriu dels coeficients com la dels termes independents hauran canviat
'b
...
'b
'b
'b
'a...'a
............
'a...'a
'a...'aa
'A
NNNN
N
N
2
1
2
222
11211
0
0
(8)
Si prenem com a fila de referència la segona i repetim el procés, el sistema quedaria de
la forma
''b
...
''b
''b
'b
''a...
............
''a...'a
''a...a
''A
NNN
N
N
2
1
222
111
00
0
0
(9)
Per tant, si repetim el procés consecutivament per cada fila de la matriu A aconseguirem
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
58
tenir el sistema original amb la forma
final
N
final
final
final
final
NN
final
final
b
...
b
b
b
a...
............
...a
...a
A 2
1
22
11
00
00
00
(10)
Ara, cada equació ara en depèn només d’una variable i per tant la solució del sistema
ara és trivial
final
NN
final
NNfinal
final
final
final
a
bx,...,
a
bx,
a
bx
22
22
11
11
(11)
L’algorisme serà el següent:
do Per cada fila de referència i
do Per totes les altres files k (ki)
i
ii
kikk
ij
ii
kikjkj
ba
ab'b
jaa
aa'a
end do
end do
ia
bx
final
ii
final
ii
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
59
Altres consideracions
Cal anar en compte que els elements de la diagonal de la matriu A (akk) han de ser
diferents de zero, sinó el factor tendiria a infinit. Si al començament es detectés
aquest problema (a11 = 0), aleshores la primera fila de referència hauria de ser una
altra on (akk 0). Donat que la matriu A es va modificant conforme anem avançant,
cada cop que cal escollir una fila de referència s’haurà de comprovar que l’element
de la diagonal no s’anul·la. Si no en poguéssim trobar cap que complís la condició,
voldria dir que el sistema no te solució (veure pivotatge).
Fixeu-vos que per calcular el factor es fan servir els elements de la matriu abans
de ser transformada .O sigui que com que tenim
ij
ii
kikjkj a
a
aa'a
conforme anem recalculant els nous elements de la fila k (per cada columna j) ,
eventualment sobreescriurem el valor aki . Això voldria dir que faríem servir, per
una mateixa fila, dos factors diferents (ii
ki
a
a i
ii
ki
a
'a) !!. Per evitar-ho cal calcular el
valor de per cada fila abans de realitzar les substitucions.
Una manera de fer més senzill l’algorisme es definir la matriu ampliada
NNNNN
N
N
b
...
b
b
|
|
|
|
a...aa
............
a...aa
a...aa
2
1
21
22221
11211
a on la columna de termes independent s’ha afegit a la matriu de coeficients.
D’aquesta manera la matriu A ara te dimensions Nx(N+1) i podem fer )N(ii ab 1
Això vol dir que podríem recalcular els elements de la matrius de coeficients i el
vector de termes independents fent
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
61
4.2. La tècnica del pivotatge en l’algorisme de Gauss-Jordan
L’algorisme d’eliminació Gaussiana tal i com l’hem vist és força inestable i comporta
una sèrie de problemes. Entre ells, el més evident és quan ens trobem que un element de
la diagonal de la matriu de coeficients (inicial o segons l’anem transformant) és zero.
L’estratègia de pivotatge combinada amb l’escalat ens pot ajudar a dissenyar un
algorisme més estable.
Recordem que, l’algorisme de Gauss-Jordan resol un sistema d’equacions lineals del
tipus,
bAx (1)
o més d’un simultàniament (equival doncs a una inversió matricial)
1 AXIAX (1)
mitjançant l’aplicació d’operacions bàsiques que consisteixen en substituir una fila de A
per una combinació lineal entre ella mateixa i qualsevol altra. És pot veure que el fet de
realitzar aquest tipus d’operació no afecta al resultat sempre i quan fem la mateixa
operació al vector/matriu de termes independents, és a dir a la dreta de l’eq (1) o
(2).
Tanmateix, n’hi a d’altres operacions elementals que podem realitzar i que no ens afecta
a la solució de les eq (1) o (2). Aquestes són l’intercanvi de files o columnes.
Intercanviar dues files de A i les corresponents de b o I no afecta a la solució dels
sistema ja que només implicaria canviar l’ordre en que s’escriuen les N equacions.
Si s’intercanvien dues columnes llavors cal anar amb cura perquè el resultat final
quedarà alterat excepte si realitzem els mateixos canvis a les fileres del vector (x) o
matriu (X) de solucions.
La tècnica de pivotatge implica realitzar aquestes dues operacions per tal de seleccionar
el millor l’element de la diagonal que utilitzarem per dur a terme el procés d’eliminació
de Gauss-Jordan. L’aplicació de l’intercanvi de fileres rep el nom de pivotatge parcial
(partial pivoting) , mentre que si s’aplica, a més, l’intercanvi de columnes estarem fent
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
62
pivotatge total (full pivoting).
Amb el pivotatge parcial aconseguirem fàcilment a) evitar divisions per zero i b)
determinar si el sistema és incompatible o la matriu és singular (no té inversa).
El que farem és escollir la fila de referència sempre com aquella disponible amb un
valor més gran (en valor absolut) a la columna on volem generar els zeros. Així, si
volem fer zeros en la primera columna, agafarem com a columna de referència aquella
que tingui el primer element més gran en valor absolut. Tot seguit intercanviarem
aquesta fila per la primera de la nostre matriu ampliada i procedim al el procés
d’eliminació. El pas següent és el de generar zeros en la segona columna de la matriu.
Per això escollirem com a fila de referència la que tingui el valor més gran a la segona
columna excepte la primera. Això és així perquè si tornem a prendre una fila anterior
com a referència perdríem els zeros que havíem generat prèviament.
Per tant, sempre hem de buscar la nostra fila de referència per general zeros a la
columna i entre les i, i+1 ,..., n files disponibles.
L’avantatge d’aquest procediment es que, si s’arriba a un punt on no hi ha cap fila
disponible amb un nombre diferent de zero a la columna on es volen generar els zeros,
podem dir que el sistema no és compatible (o bé que la matriu no té inversa).
Si en un sistema d’equacions multipliquem una de les equacions de un factor de 106, la
solució no es veurà afectada. Això faria que, amb molta probabilitat, aquesta equació
seria la primera referència pel procés d’eliminació. Llavors, molt sovint es combina la
tècnica del pivotatge amb la d’escalat, amb la qual s’escalen les equacions originals
de tal manera que els coeficients de les equacions siguin comparables entre si.
Una manera de fer això és dividir els coeficients de cada equació per l’element màxim.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
63
Exemple
Trobar el polinomi interpolador de 3er
que passa pels punts (-1,0), (3,2), (0,-4), (-3,2)
Cal plantejar un sistema d'equacions del tipus
yi = a xi3 + b xi
2 +c xi +d i
en aquest cas:
0 = a (-1)3
+ b (-1)2 +c(-1) +d
2 = a 33
+ b 32 +c 3 +d
-4 = a 03
+ b 02 +c 0 +d
2 = a (-3)3
+ b (-3)2 +c(-3) +d
Llavors hem de resoldre el sistema d’equacions següent
0 = -a + b -c +d
2 = 27a + 9b +3c +d
-4 = d
2 = -27a + 9b -3c +d
I en forma matricial
-1 1 –1 1 0
27 9 3 1 2
0 0 0 1 -4
-27 9 -3 1 2
Si apliquem Gauss-Jordan sense pivotatge tindrem:
Eliminant columna 1
-1.00000 1.00000 -1.00000 1.00000 0.00000
0.00000 36.00000 -24.00000 28.00000 2.00000
0.00000 0.00000 0.00000 1.00000 -4.00000
0.00000 -18.00000 24.00000 -26.00000 2.00000
Eliminant columna 2
-1.00000 0.00000 -0.33333 0.22222 -0.05556
0.00000 36.00000 -24.00000 28.00000 2.00000
0.00000 0.00000 0.00000 1.00000 -4.00000
0.00000 0.00000 12.00000 -12.00000 3.00000
La tercera columna no es pot eliminar degut a la presència d’un zero a la diagonal i l’algorisme
falla.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
64
Si apliquem un algorisme més robust amb pivotatge parcial (intercanviant fileres) ho
arreglem i el vector de solucions final és:
0.4166667 0.6666667 -3.7500000 -4.0000000
per tant, el polinomi interpolador es
f(x) = 0.4166667 x3 + 0.6666667 x
2 -3.7500000 x -4.0000000
En aquest cas el problema també es pot solucionar sense pivoting. Només cal introduir
les 4 equacions en ordre diferent. Quin?. Tot i això, ens podem trobar sovint casos on
independentment de l’ordre inicial de les equacions necessitem pivoting per arribar a la
solució.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
65
4.3. Algorisme de resolució de sistemes d’equacions lineals pel
mètode de Gauss-Seidel
Partim d’un sistema de N equacions lineals amb N incògnites (x1,x2,...,xN).
NNNNNN
NN
NN
bxa...xaxa
...
bxa...xaxa
bxa...xaxa
2211
22222121
11212111
(1)
on els elements aij i bi corresponen als coeficients i termes independents de les
equacions. Podem escriure l’expressió (1) en forma matricial de manera que
bAx (2)
on
NNNNNN
N
N
x
...
x
x
x
b
...
b
b
b
a...aa
............
a...aa
a...aa
A2
1
2
1
21
22221
11211
(3)
L’algorisme de Gauss-Seidel és iteratiu. Bàsicament, partint d’un vector de solucions x
inicial arbitrari (generalment es pren xi = 0, i), anar recalculant el valor de cada
incògnita a partir de les equacions donades, tot fent servir els valors aproximats de la
resta d’incògnites.
Anem a veure com funciona.
Podem aïllar el valor de cada incògnita a partir de les equacions donades. Per exemple,
si aïllem la incògnita x1 de la primera equació tindrem
11
121211
a
xa...xabx NN
(4)
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
66
Sempre i quan els elements de la diagonal de la matriu de coefficients no siguin zero,
podem aïllar la incògnita k a partir de la equació k. Llavors tindrem l’expressió general
kk
ki
ikik
kk
NkNkkk
a
xab
a
xa...xabx
22
(5)
Inicialment partirem de la suposició que la solució del sistema es x1= x2=... = xN = 0.
Llavors, si recalculem el valor de la primera incògnita x1 tindrem
11
11
a
b'x
(6)
que, en general, serà diferent de zero, i per tant una millor aproximació al valor real. Ara
podríem recalcular el valor de la resta d’incògnites. Tenim dues opcions: podem fer-ho
present el conjunt de valors inicials (Mètode de Jacobi) o bé prenent en cada moment la
ultima aproximació per cada incògnita (Mètode de Gauss-Seidel). Si ho fem d’aquesta
última manera, en recalcular x2 prendrem x3 = x4 =...= xN = 0 i el valor de x1 que hem
obtingut a l’eq (6). Es demostra que aquest mètode convergeix més ràpid que el de
Jacobi.
Un cop hem recalculat el valor de totes les incògnites consecutivament, hauríem de
comparar el seu valor amb el de la iteració anterior (en la primera iteració caldria
comparar-les amb els valors inicials). Si la diferencia entre el valor de cada incògnita
recalculada i l’anterior és suficientment petit podem donar per bo el resultat. Sinó,
caldrà tornar a recalcular les incògnites amb els nous valors de que disposem i així
successivament fins que l’error sigui menor que una tolerància donada (típicament 10-8
)
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
67
Una manera típica de mesurar l’error (diferencia) entre els valors de les incògnites és
l’error quadràtic mitjà, (RMS, root-mean square) de la diferència, que es defineix com
N
xxi
vell
iiRMS
2
(7)
L’algorisme tindria aquesta forma
inicialitzar les variables: k,xk 0
do mentre mes gran que tolerància
= 0
do Per totes les files k
kk
ki
ikiknou
ka
xab
x
2k
nou
k xx
nou
kk xx
end do
N
end do
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
68
5.- Ajuste de curvas e interpolación
El ajuste de curvas es un proceso mediante el cual, dado un conjunto de N pares de
puntos {xi, yi} (siendo x la variable independente e y la dependiente), se determina una
función matemática f(x) de tal manera que la suma de los cuadrados de la diferencia
entre la imagen real y la correspondiente obtenida mediante la función ajustada en cada
punto sea mínima:
N
i
ii xfy 2))((min
Generalmente, se escoge una función genérica f(x) en función de uno o más parámetros
y se ajusta el valor de estos parametros de la manera que se minimice el error
cuadrático, . La forma más típica de esta función ajustada es la de un polinomio de
grado M; obteniendose para M = 1 un ajuste lineal (o regresión lineal),
xaaxf 10)(
para M = 2 un ajuste parabólico,
2
210)( xaxaaxf
etc..
Por otro lado podemos tener un conjunto de datos multidimensionales; es decir, un
conjunto de N puntos en un espacio k+1-dimensional del tipo { xi(1)
, xi(2)
, ..., xi(k)
,... yi,}.
La función que ajustaremos a estos puntos será una función de k variables
y = f(x(1)
, x(2)
,..., x(k)
)
El ajuste multidimensional más sencillo es considerar una dependencia lineal de la
función respecto a cada una de las variables de que depende; es decir, ajustando una
funcion del tipo
)()2(
2
)1(
10
)()2()1( ...),...,,( k
k
k xaxaxaaxxxf
de tal manera que se minimice el error cuadrático respecto al conjunto de parámetros
{a0, a1,..,ak}. Es lo que se conoce como ajuste o regresión multilineal.
En esta sección veremos que el ajuste lineal, el de un polinomio de grado M y el ajuste
multilineal se pueden expresar dentro de un mismo formalismo de manera que las
respectivas soluciones al problema se pueden determinar mediante algoritmos
prácticamente análogos.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
69
5.1. Regresión lineal
Supongamos que tenemos un conjunto de N puntos en el plano {xi, yi}. El objetivo es
determinar la ecuación de la recta tal que minimiza el error cuadrático
N
i
ii
N
i
calc
ii xaayyy 2
10
2 )(min)(min
respecto a los parámetros a0 (ordenada al origen) y a1 (pendiente).
Matemáticamente:
0222)(2 1010
0
N
i
i
N
i
i
N
i
ii xaNayxaaya
0222)(2 2
1010
1
N
i
i
N
i
i
N
i
ii
N
i
iii xaxayxxxaaya
Simplificando las ecuaciones anteriores vemos que se debe cumplir que
N
i
i
N
i
i yxaNa 10
N
i
ii
N
i
i
N
i
i yxxaxa 2
10
o bien, dividiendo ambas ecuaciones por el numero total de puntos e introduciendo
valores medios
xyxaxa
yxaa
2
10
10
En forma matricial, podemos escribir
xy
y
a
a
xx
x
1
0
2
1
por lo que determinar los parámetros de la recta se resume a resolver el sistema de
ecuaciones lineales de dos ecuaciones y dos incógnitas anterior.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
70
Algoritmo general matricial
Consideremos ahora el mismo problema desde otra perspectiva. Vamos a suponer que
los N puntos pueden pasar exactamente por la recta que buscamos. En este caso,
plantearíamos el siguiente sistema N de ecuaciones con 2 incógnitas
NN yxaa
yxaa
yxaa
10
2210
1110
...
o bien, en forma matricial
NN y
y
y
a
a
x
x
x
...
1
......
1
1
2
1
1
02
1
yxA
Nx
x
x
A
1
......
1
1
2
1
1
0
a
ax
Ny
y
y
y...
2
1
Como ya hemos visto, una manera directa de resolver los sistemas de ecuaciones
expresados en forma matricial es la de multiplicar por la izquierda a ambos lados de la
igualdad por la inversa de la matriz de coeficientes. sin embargo, en este caso, al tener
mas ecuaciones que incógnitas, la matriz de coeficientes, A, no es una matriz cuadrada
(tendrá dimensión N × 2) por lo que no esta definida su inversa. Una posible estrategia a
seguir es multiplicar la ecuación matricial anterior por la transpuesta de la matriz de
coeficientes (el producto de una matriz por su transpuesta es siempre una matriz
cuadrada y simétrica) de manera que tendremos
yAxAA TT AAS T yAz T
El sistema de N ecuaciones y dos incógnitas inicial lo hemos condensado en otro
sistema de dos ecuaciones y dos incógnitas dado por
zxS
Ahora bien, la matriz S es una matriz cuadrada de dimensión 2×2 y simétrica por lo que
es invertible así que podemos escribir
yASxSS T 11
y por tanto, el vector que buscamos nos quedaría de la forma
yASx T 1
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
71
Ahora bien, representa esta estrategia una solución diferente al problema de la que
hemos deducido anteriormente mediante minimización del error cuadrático?
Veremos a continuación que no es el caso.
A partir de la estructura de la matriz A, el producto de su transpuesta por ella misma
resulta en
N
i
i
N
i
i
N
i
i
N
N
T
xx
xN
x
x
x
xxxAA
1
2
1
12
1
21
1
......
1
1
...
1...11
Del mismo modo, el producto de AT por el vector de términos independientes queda
N
i
ii
N
i
i
N
N
T
yx
y
y
y
y
xxxyAz
1
12
1
21 ......
1...11
por lo que la ecuación matricial 2×2 anterior la podemos escribir mas explicitamente
como
N
i
ii
N
i
i
N
i
i
N
i
i
N
i
i
yx
y
a
a
xx
xN
1
1
1
0
1
2
1
1 .
Dividiendo cada ecuación por N y utilizando la notación típica para el valor medio
llegamos a
xy
y
a
a
xx
x
1
0
2
1
que es exactamente el mismo sistema de ecuaciones al que habíamos llegado
anteriormente imponiendo la condición de mínimo error cuadrático.
Así pues, podemos plantear el siguiente algoritmo para el ajuste lineal
a) Lectura de los N pares de valores {xi, yi} y construcción de las matriz A y vector y.
b) Construcción de la transpuesta de la matriz A: AT
c) Construcción de la matriz S mediante el producto matricial ATA
d) Construcción del vector z mediante el producto matriz por vector ATy
e) Inversión de matriz S: S-1
f) Producto matriz por vector S-1
z para obtener el vector de soluciones final.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
72
A priori puede parecer un algoritmo demasiado complicado para un problema tan
simple como la regresión lineal, para el que existen fórmulas directas de
implementación sencilla. Sin embargo, vamos a ver que podemos extender este
algoritmo de manera trivial a otro tipo de ajustes.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
73
5.2. Ajuste polinómico por mínimos cuadrados.
De manera análoga al caso lineal, el objetivo es determinar la ecuación del polinomio de
grado M que minimiza el error cuadrático
N
i
M
iMiii
N
i
calc
ii xaxaxaayyy 22
210
2 )...(min)(min
respecto a los parámetros M +1 parámetros a0 , a1 ,... aM .
Por ejemplo, para un ajuste parabólico (M = 2), la condición de mínimo del error
cuadrático lleva a las ecuaciones siguientes:
02222)(2 2
210
2
210
0
N
i
i
N
i
i
N
i
i
N
i
iii xaxaNayxaxaaya
02222)(2 3
2
2
10
2
210
1
N
i
i
N
i
i
N
i
i
N
i
ii
N
i
iiii xaxaxayxxxaxaaya
02222)(2 4
2
3
1
2
0
222
210
2
N
i
i
N
i
i
N
i
i
N
i
ii
N
i
iiii xaxaxayxxxaxaaya
Procediendo de manera análoga al caso lineal llegamos a que la determinación de los
parámetros del polinomio pasa por la resolución de un sistema de ecuaciones de la
forma:
yx
xy
y
a
a
a
xxx
xxx
xx
2
2
1
0
432
32
21
Para el caso general de un polinomio de grado M ya podemos intuir que la solución
vendrá dada por un sistema de ecuaciones lineales de dimensión (M+1) ×(M+1) de la
forma
yx
xy
y
a
a
a
xxx
xxx
xx
M
MMMM
M
M
......
...
............
...
...1
1
0
21
12
Una manera de implementar el ajuste polinomial general es la de escribir un
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
74
subprograma (función) general de la forma
N
i
q
i
p
i
qp yxN
yxyxqpNf1
1),,,,(
para determinar todos los promedios de potencias de x y productos de éstas por y que
aparecen en la matriz de coeficientes y de términos independientes.
3),,0,3,(
),,1,1,(
),,0,1,(
xyxNf
xyyxNf
xyxNf
Sin embargo, es mucho mas sencillo aplicar el algoritmo general matricial descrito
anteriormente para el caso lineal. Ahora, para el ajuste de un polinomio de grado M
plantearíamos un sistema N de ecuaciones con M+1 incógnitas (incluyendo el término
independiente)
N
M
NMNN
M
M
M
M
yxaxaxaa
yxaxaxaa
yxaxaxaa
...
...
...
...
2
210
22
2
22210
11
2
12110
o bien, en forma matricial
NMM
N
M
N
M
NNy
y
y
a
a
a
x
x
x
xx
xx
xx
.........
...1
.........1
...1
...1
2
1
1
01
2
2
22
2
11
yxA
Así pues, una vez construida la matriz A de dimensión N × M + 1 y el vector de
coeficientes y a partir de los N pares de puntos {xi, yi}, simplemente aplicamos los
pasos b) a f) descritos anteriormente.
Un algoritmo general de ajuste de una función polinómica debería solicitar únicamente:
a) el numero de total de pares de puntos de que disponemos, N, y
b) el grado del polinomio que se pretende ajustar, M
A partir de aquí, deberemos definir en nuestro programa la matriz de coeficientes A de
dimensión N × M + 1 y el vector de coeficientes y de dimensión N. Los diferentes pasos
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
75
del algoritmo requieren el uso de la matriz transpuesta (de dimensión M + 1 × N), la
matriz resultante del producto de la transpuesta de A por ella misma y su inversa (de
dimensión M+1 × M+1 ambas) y el vector transformado por la transpuesta de A (de
dimensión M + 1), así como el vector de soluciones, de dimensión M + 1.
5.3. Regresión multilineal
El algoritmo matricial anterior se puede adaptar de manera sencilla para el caso de la
regresión multilineal.
En este caso disponemos de un conjunto de datos multidimensionales; es decir, un
conjunto de N puntos en un espacio k+1-dimensional del tipo { xi(1)
, xi(2)
, ..., xi(k)
,... yi,}.
La función que ajustaremos a estos puntos será del tipo
)()2(
2
)1(
10
)()2()1( ...),...,,( k
k
k xaxaxaaxxxf
Si planteamos el sistema de ecuaciones N ecuaciones con k incógnitas para la solución
exacta tendremos
N
k
NkNN
k
k
k
k
yxaxaxaa
yxaxaxaa
yxaxaxaa
)()2(
2
)1(
10
2
)(
2
)2(
22
)1(
210
1
)(
1
)2(
12
)1(
110
...
...
...
...
o bien, en forma matricial
Nkk
N
k
N
k
NNy
y
y
a
a
a
x
x
x
xx
xx
xx
.........
...1
.........1
...1
...1
2
1
1
0
)(
)(
)(
1
)2()1(
)2(
2
)1(
2
)2(
1
)1(
1
yxA
donde las columnas de la matriz de coeficientes A corresponden simplemente a los N
valores de entrada de cada dimensión o categoría (incluyendo una columna extra de “1”
relativa al término independiente).
En este punto podemos aplicar el algoritmo matricial general exactamente de la misma
manera que lo haríamos para ajustar un polinomio de grado k a un conjunto de N pares
de puntos.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
76
5.3. Coeficiente de determinación
El coeficiente de determinación, R2, definido entre 0 y 1, nos da una idea de la bondad
del ajuste, de manera que para valores cercanos a 1 el ajuste es perfecto mientras que
para valores cercanos a cero indica inexistencia de relación entre x e y con el modelo de
ajuste propuesto.
El coeficiente R2 viene dado por la relación entre la varianza de los datos explicada con
el modelo y la varianza de los datos experimentales. En concreto
N
i
i
N
i
calc
i
yy
yy
R2
2
2
donde y representa el valor medio de los valores de la variable independiente e calc
iy
los valores calculados para cada punto usando el modelo ajustado a los datos.
La implementación computacional de este índice es muy sencilla una vez ajustado el
modelo tras resolver el sistema de ecuaciones que plantea el algoritmo matricial general.
En el caso de la regresión lineal, el coeficiente de determinación tiene la misma
expresión que el coeficiente de regresión r2, que indica también cómo de
correlacionadas estadísticamente están las variables aleatorias x e y . Es importante ver
que ambos coeficientes tiene significados e interpretaciones diferentes y que, salvo en el
caso de la regresión lineal, no coinciden.
Así, se puede comprobar que para el caso de la regresión lineal este índice coincide con
el coeficiente de regresión, definido a partir de la relación entre la covarianza de las
variables aleatorias x e y y el producto de la raíz cuadrada de las varianzas individuales
(desviación típica) de ambas variables, con el fin de obtener un parámetro adimensional
yx
XYCov
yyxx
yxxyr
)(2222
Como se puede ver, el valor de este coeficiente es independiente del modelo ajustado,
ya que únicamente indica la relación estadística entre el conjuntos de datos.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
77
6.- Integració numèrica de funcions
Si tenim una funció f(x) d’una variable x, és defineix la integral de la funció en el rang
x[a,b] com
b
adx)x(fA (1)
Gràficament, aquest valor correspon a l’àrea definida enter els valors x = a, x = b, la
funció f i l’eix de les x.
Els mètodes d’integració numèrica que veurem es basen en discretitzar la integral de
manera que fem la següent aproximació;
n
i
ii
b
ax)x(fdx)x(f (2)
és a dir que en determinem el valor de la integral simplement el valor de l’integrant
(funció) avaluada a una sèrie de punts xi d’amplada xi.
L’objectiu és el de determinar l’àrea sota la corba de manera el més acurada possible
però minimitzant el nombre d’avaluacions de la funció (integrand), i per tant el nombre
de punts.
Si suposem que els punts estan equiespaiats en el domini d’integració llavors podem
escriure l’eq (2) com
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
78
n
i
n
i
n
i
iii )x(fn
ab)x(fhh)x(fA (3)
on n representa el nombre d’intervals en que dividim l’interval [a,b].
Tot seguit presentarem una colla de mètodes basats principalment l’equació anterior
6.1 Mètode dels rectangles
Com hem vist, si definim n intervals enter els límits d’integració, tindrem que la
distància entre dos punts consecutius, h, és
n
abh
(4)
L’anomenat mètode dels rectangles es basa simplement en determinar l’àrea dels
rectangles d’alçada f(xi) i de la mateixa amplada, h, que es podem definir sota la corba.
Així, com es pot veure en el gràfic inferior
f(a)
b
h
a+h a+2h a+(n-1)h
f(a+h)
a
f(a+(n-1)h)
podem aproximar l’àrea sota la corba com la suma dels rectangles
1
0
1n
i
n )iha(fh)h)n(a(hf...)ha(hf)a(hfA (5)
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
79
Tanmateix, també podríem haver triat un altre conjunt de rectangles
a b
h
a+h a+2h a+(n-1)h
f(a+h)
f(a+2h)
f(b)
i l’àrea en aquest cas vindria donada per
n
i
n )iha(fh)b(hf...)ha(hf)ha(hf'A1
2 (6)
En principi, conforme el nombre d’intervals, n, augmenta, les àrees determinades amb
les dues aproximacions tendeixen a un mateix nombre. Formalment, en el límit quan
n aquests valors coincideixen amb el valor exacte de la integral. Tot i això, donat
que les maquines tenen una precisió i capacitat donada, mai podrem aspirar a determinar
de manera estrictament exacte el valor de la integral.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
80
6.2 Mètode dels trapezis
Acabem de veure que podem definir dos grups de rectangles per aproximar la integral.
De fet, una possibilitat òbvia per evitar aquesta arbitrarietat podria ser prendre com a
aproximació a la integral el valor mitjà.
Analitzem, però, què implica geomètricament. Si prenem un sol interval entre [a,b] i
fem la mitjana entre les dues àrees
el que estem fent és trobar l’àrea del rectangle d’alçada menor i afegir-li la meitat de la
diferència entre les àrees dels dos rectangles
)'AA())a(f)b(f)(ab(
))a(f)b(f)(ab()a(f)ab(A
trianglegletanrec
2
1
2
2
(7)
Per tant, el que fem en el fons és determinar l’àrea d’un trapezi format a partir de les
imatges de la funció en els dos punts de l’interval. Generalitzant a n intervals tenim la
típica fórmula d’integració pel mètode dels trapezis
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
81
1
1
22
22
122
1
n
i
nn
trap
n
)iha(f)b(f)a(fh
)b(f...)ha(f)ha(fh
)h)n(a(f...)ha(f)a(fh
)'AA(A
(8)
Fixeu-vos que per trobar l’àrea en necessitem avaluar la funció en n+1 punts.
Arribats a aquest punt ens hem de preocupar ara per la pressió dels resultats que podem
obtenir. En principi (veure més endavant), conforme augmentem el nombre d’intervals
hauríem de ser capaços de trobar el valor de la integral amb més precisió. Una manera
obvia de determinar la pressió amb la que estem treballant és la de comparar el resultat
obtingut amb un nombre determinat d’intervals amb el que obtenim augmentant-ne el
nombre d’intervals. Tanmateix, tenint en compte que un dels objectius per qüestions
computacionals és el de calcular la imatge de la funció en el mínim nombre de punts,
hem de trobar una manera intel·ligent d’augmentar el nombre d’intervals.
La idea consisteix simplement en doblar el nombre de punts però de tal manera que
podem aprofitar els n+1 punts anteriors. Això ho farem subdividint en dos els intervals
existents.
Tot seguit veurem les avantatges d’aquesta tècnica. Primer de tot, anomenarem k a
l’ordre del càlcul, que es relaciona amb el nombre d’intervals, n, de la següent manera
,..,,kn k 2102 (9)
Definim Tk com l’aproximació de trapezis d’ordre k, que correspon un càlcul realitzat
amb 2k intervals
1
1
22
n
i
kk
k )iha(f)b(f)a(fh
T (10)
Òbviament, la mida del interval (hk, distància entre punts) depèn de l’ordre. El què és
més important, però, és la relació entre la mida de dos intervals d’ordres consecutius
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
82
11 2
1
22
1
2
kkkk habab
h (11)
És a dir que si augmentem l’ordre del càlcul en una unitat estarem dividint per dos la
mida de l’interval.
Amb la nomenclatura anterior i prenent l’eq (8) anem a veure les expressions per als
primers ordres. Per un interval (k = 0)
)b(f)a(fh
T 2
00 (12)
Per dos (k =1):
)ha(f)b(f)a(fh
T 11
1 22
(13)
Per quatre (k = 2):
)ha(f)ha(f)ha(f)b(f)a(fh
T 2222
2 322222
(14)
Fixem-nos, però , que podem escriure l’expressió (13) com
)ha(fhT)ha(fh))b(f)a(f(h
)ha(f)b(f)a(fh
T
110110
11
1
2
1
22
1
22
(15)
Similarment, per l’expressió (14)
))ha(f)ha(f(hT
))ha(f)ha(f(h))ha(f)b(f)a(f(h
)ha(f)ha(f)ha(f)b(f)a(fh
T
ha
2221
22221
2222
2
32
1
32222
1
322222
1
(16)
De fet, es pot veure que en un cas general tenim la relació següent
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
83
senari)iha(fhTTn
i
kkkk
1
1
12
1 (17)
L’avantatge d’aquest mètode es que un cop calculada la integral per un determinat ordre
k, l’aproximació corresponent al següent ordre (k+1) només necessita avaluar la funció
als punts centrals de cada interval. Això és així perquè doblem el nombre d’intervals i
per tant si incrementem el nombre d’intervals d’una altra manera (per exemple passar de
50 a 70) hauríem de recalcular la funció en tots (o gran part) dels punts.
Això ens permet dissenyar un algorisme força intel·ligent per determinar la integral amb
una precisió determinada. Bàsicament en calculem el valor per un ordre determinat i el
comparem amb el trobat amb un ordre una unitat inferior. Si la diferència entre els dos
valors és suficientment petita per poder considerar-lo convergit, acabarem. En cas
contrari en determinarem la integral amb un ordre més a partir de la formula (17) i així
successivament. L’algorisme podria ser, per exemple
Definir interval d’integració, a,b
Definir ordre màxim de càlcul, kmax
Definir tolerància, toler
)b(f)a(fh
T 2
00
k = 1
fer mentre k menor que kmax i error més gran que toler
n = 2k
h = (b-a)/n
senari)iha(fhTTn
i
nou
1
1
02
1
error = abs(Tnou-T0)
T0 = Tnou
end do
si k no és igual a kmax llavors
Integral=Tnou
end if
A banda d’això, el fet de definir el nombre d’intervals d’aquesta manera ens permet
relacionar la tècnica dels trapezis amb una altra molt més acurada: el mètode de
Simpson.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
84
6.3 Mètode de Simpson (1/3)
El mètode dels trapezis es basa en aproximar la funció per rectes (aproximació de
primer ordre) dins de cada interval. Per tal d’augmentar la precisió de la integració, el
següent pas natural seria el d’ajustar paràboles rectes (aproximació de primer ordre), i és
això mateix en el que es basa el mètode de Simpson.
La primera diferència obvia és que si necessitem dos punts per ajustar una recta en
necessitarem tres per ajustar una paràbola. Per tant, l’aproximació més senzilla del
mètode equival a definir dos intervals equiespaiats, i per tant ajustar una paràbola que
passi pels límits d’integració i el seu punt mig.
a b
f(a)
f(b)
x’=(b+a)/2
f(x’)
y(x)=c0 + c1x + c2x2
f(x)
Poder trobar una expressió anàloga a la del mètode dels trapezis de manera senzilla si
suposem que a = -h, b = h i x’ = 0.
Vegem-ho. El que es proposa és aproximar el valor de la integral pel de la funció de
segon ordre amb coeficients c0, c1, c2.
3
20
3
0
2
003
22
3
1
2
1hchcxcxcxcdx)x(yAA
h
h
h
h
S
(18)
Aquesta paràbola passa pels punts que defineixen els intervals per tant s’ha de complir
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
85
0
2
210
2
210
0 c)(f
hchcc)h(f
hchcc)h(f
(19)
Si resolem el sistema tenim
22
2
2
0
2
02
202
0
h
)(f)h(f)h(fc
hc)(f)h(f)h(f
)(fc
(20)
I substituint en l’expressió (18) arribem a l’expressió
)(f)h(f)h(fh
hh
)(f)h(f)h(fh)(fAS
043
2
02
3
202 3
2
(21)
Finalment, si desfem el canvi anterior tenim l’expressió general final
)ha(f)b(f)a(fh
AS 43
(22)
Podem definir més intervals per millorar-ne la precisió. Tanmateix, el pas següent seria
definir quatre intervals, i no tres. De fet, es pot veure fàcilment que el nombre
d’intervals ha de ser parell, sinó ens quedaria un últim interval amb només dos punts
disponibles per ajustar una paràbola.
En el cas de quatre intervals, tindrem
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
86
a b
f(x)
h
a+h a+2h a+3h
i l’àrea total serà la suma de les àrees dels dos segments parabòlics
)ha(f)ha(f)ha(f)b(f)a(fh
)ha(f)b(f)ha(fh
)ha(f)ha(f)a(fh
AS
342243
3423
423
(23)
Ja es pot intuir que l’expressió general per n intervals serà de la forma
parelln))iha(f)iha(f)b(f)a(f(h
A
parelli
n
i
senari
n
i
S
n
2
2
1
1
243
(24)
Podem fer servir una nomenclatura anàloga a la del mètode dels trapezis per expressar
la dependència del valor de la integral respecte l’ordre de càlcul. En aquest cas tindrem
que l’ordre mínim és de k=1 ,que equival a 21 intervals
))ha(f)b(f)a(f(h
S 11
1 43
(25)
Per quatre (k=2)
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
87
))ha(f)ha(f)ha(f)b(f)a(f(h
S 2222
2 342243
(26)
Si analitzem l’expressió (25) podem veure que
32
1
3
4
3
1
3
4
6
3
4
3
011010
2
1
11
3
1
0
111
1
01
0
TTT)TT(T
)ha(fh))b(f)a(f(h
)ha(fh
))b(f)a(f(h
S
TTT
(27)
i, de fet, fent el mateix per l’expressió (26)
32
1
3
4
3
1
33
422
23
1
122121
2
1
22221
2
121
TTT)TT(T
))ha(f)ha(f(h))ha(f)b(f)a(f(h
S
TTT
(28)
Per tant, podríem dir que en un cas general
,...,,nTT
TS kkkk 321
3
1
(29)
Existeix doncs una relació clara entre el mètode de Simpson i el dels trapezis.
Si coneixem el valor de la integral calculat amb el mètode dels trapezis amb dos
ordres de càlcul consecutius, k i k-1, podem determinar fàcilment el valor pel
mètode de Simpson d’ordre k mitjançant la senzilla regla donada en l’equació
anterior.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
88
Exemple numèric
Veiem els resultats d’aplicar els mètodes que hem vist fins ara a la integral
5
1
2
1dx
e
xx
k Tk (trapezis) Sk (Simpson)
0 (1) -53.50313616
1 (2) -45.69469062 -43.09187544
2 (4) -43.77193365 -43.13101465
3 (8) -43.29300082 -43.13335655
4 (16) -43.17337456 -43.13349914
5 (32) -43.14347464 -43.13350800
6 (64) -43.13600007 -43.13350855
7 (128) -43.13413146 -43.13350859
8 (256) -43.13366431 -43.13350859
... ...
16 (65536) -43.13350859
Exacte -43.13350859
En parèntesi el nombre d’intervals
Podem veure que mentre que amb el mètode dels trapezis necessitem 216
punts per
obtenir la precisió desitjada, amb Simpson la convergència és molt millor.
Pel que fa a la implementació del mètode, només ens caldrà modificar lleugerament
l’algorisme previ proposat pel mètode dels trapezis. Ara, tot i que no seria estrictament
necessari, el que farem serà emmagatzemar en un vector els resultats de la integració
per trapezis fins a l’ordre desitjat. Un cop disposem d’aquests nombres, podrem obtenir
els resultats amb el mètode de Simpson simplement aplicant l’eq (29).
En aquest cas ens podria resultar útil que el primer índex del vector fos el zero, enlloc
de ú. Per aconseguir això haurem de declarar el vector com
DIMENSION T(0:MAXDIM)
i llavors podrem escriure
T(0)=(b-a)*(f(a)+f(b))
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
89
6.4 Mètode de Romberg
Si hem deduït les expressions per la integració de segments parabòlics (Simpson) a
partir dels valors obtinguts a partir de segments lineals (trapezis), ens podríem plantejar
si a partir dels resultats amb el mètode de Simpson podem arribar a les expressions que
obtindríem d’ajustar segments polinòmics d’ordre més alt. La resposta és sí.
Mitjançant anàlisis anàlegs als descrit anteriorment, es pot demostrar que
,...,kCC
CD
,...,kSS
SC
kkkk
kkkk
4363
3215
1
1
(30)
essent Ck i Dk les expressions per a la integral aproximada a partir de segments
polinòmics d’ordre 4 (mètode de Cotes) i 8, respectivament.
Si utilitzem ara la nomenclatura següent
m
k
kk
kk
kk
T
CotesCT
SimpsonST
trapecioTT
2
1
0
(31)
on k representa l’ordre del càlcul (relacionat amb el nombre d’intervals) i m l’ordre
d’aproximació del polinomi interpolador (primer, segon, quart, vuitè...), es pot veure
que es compleix
14
1
1
11
m
m
k
m
km
k
m
k
TTTT (32)
El mètode de Romberg no és més que la generalització natural de l’esquema anterior
fins a un ordre arbitrari, m.
Fixeu-vos que podem obtenir la integral aproximada amb un ordre de Romberg m i 2k
intervals només amb els valors obtinguts amb un 2k i 2
k-1 intervals i un ordre m-1.
La manera més fàcil d’aplicar el mètode és mitjançant la construcció de la anomenada
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
90
Taula de Romberg que es presenta a continuació
m
km
kkk
m
TT...TT
............
T...TT
...TT
TT
T
110
1
3
1
3
0
3
1
2
0
2
1
1
0
1
0
0
(33)
La primera columna correspon a les integrals calculades amb el mètode dels trapezis
amb ordre creixent. Les següents columnes corresponen als valors calculats amb els
mètodes de Simpson, Cotes, etc..., però obtinguts, en última instància, únicament a
partir dels valors de la primer columna.
Això vol dir que, amb el mateix cost computacional (no ens cal avaluar la funció en més
punts, només combinar linealment els valors ja obtinguts) d’un càlcul amb el mètode
dels trapezis d’ordre k, aplicant la Taula de Romberg podem obtenir un resultat d’ordre
de Romberg fins a k, el que equival a una integració a partir de segments polinòmics
d’ordre 2k!
Veiem l’efecte en la precisió de la integral de l’exemple anterior
k m=0 m=1 m=2 m=3
0 (1) 53.50313616
1 (2) 45.69469062 43.09187544
2 (4) 43.77193365 43.13101465 43.13362394
3 (8) 43.29300082 43.13335655 43.13351268 43.13351091
4 (16) 43.17337456 43.13349914 43.13350865 43.13350859
5 (32) 43.14347464 43.13350800 43.13350859 43.13350859
6 (64) 43.13600007 43.13350855 43.13350859 43.13350859
7 (128) 43.13413146 43.13350859 43.13350859 43.13350859
Exacte -43.13350859
Ara, amb només 16 intervals aconseguim la precisió desitjada si anem fins a ordre 3 en
la sèrie de Romberg. Òbviament, sempre hi ha la opció de deduir les equacions
corresponents a un mètode amb un polinomi interpolador d’ordre suficientment gran,
implementar el mètode i determinar el valor de la integral directament. L’esquema
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
91
anterior, no obstant, és més senzill i flexible, ja que permet assolir de manera econòmica
i sistemàtica la precisió desitjada, que pot variar segons les nostres necessitats
computacionals.
Pel que fa a l’algorisme, no serà gaire diferent al del mètode dels trapezis. En aquest
cas, l’opció més senzilla és la d’emmagatzemar la taula de Romberg conforme l’anem
generant. Aquest procés s’haurà de dur a terme per columnes. és a dir, primer caldrà
determinar, fins a un ordre k les aproximacions corresponents al mètode dels trapezis i,
a partir d’elles determinar les corresponents aproximacions per Simpson. Tot seguit, els
valors per Cotes a partir dels de Simpson i així successivament fins a l’ordre de
Romberg màxim, m (m k).
Definir interval d’integració, a,b
Definir ordre màxim de càlcul, kmax
Definir ordre màxim de Romberg, mmax
)b(f)a(fab
),(T
2
00
do k=1 fins kmax
n = 2k
h = (b-a)/n
senari)iha(fh),k(T),k(Tn
i
1
1
012
10
end do
do m =1,mmax
14
1111
m
)m,k(T)m,k(T)m,k(T)m,k(T
end do
escriure T
end
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
92
6.5 Anàlisi d’errors i pèrdua de precisió
L’anàlisi d’errors següent ens ajudarà a veure la importància del mètode de Romberg a
la vegada que les seves limitacions
Anem a considerar de nou el mètode dels trapezis. Com hem discutit abans, el què fem
es substituir la integral de la funció en cada interval per la d’un polinomi de primer
ordre (recta)
Per tant podem dir que dins l’interval
)x(Oxcc)x(f 2
10 (33)
on el terme d’error O(xn) vol dir que s’ignoren els termes d’ordre igual o superior a n.
Per tant, també vol dir que l’aproximació és exacta per funcions polinomques
d’ordre inferior a n, en aquest cas una recta
Tanmateix, el que acabem fent és integrar aquesta funció aproximada de manera que
l’error integrat és de l’ordre
)x(O)x(Ob
a
32 (34)
L’estimació de l’error en un cas general, amb n intervals la podem escriure com
2
3
3 1
nO)
n
ab(O
n
ab)h(Oh
ii
(35)
És a dir, en cada interval l’error és de l’ordre de k , o bé 1/n3 ,però com que s’acumula
per n intervals l’error final serà de l’ordre de 1/n2.
A més, el fet clau de l’aproximació dels trapezis és que es pot demostrar que l’error de
l’aproximació, que comença com hem vist en l’ordre 1/n2 és, de fet, únicament
parell expressat en potències de 1/n.
Això vol dir que si d’alguna manera aconseguim eliminar el terme principal d’error, el
nostre mètode passaria a tenir un error de l’ordre de 1/n4 , el que implicaria que la
integració seria exacta per polinomis d’ordre 3.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
93
Com ho podem aconseguir? Suposem que avaluem la integral amb n intervals. L’error
seria 21 nn . Si ara doblem el nombre de punts tindrem
2224
1
2
1
n)n(n (36)
Llavors, si fem la combinació
422
1
3
1
3
4
nnn (36)
es pot veure com el terme principal d’error es cancel·la, quedant el següent, que, com
hem dit abans no contindria ordre senar en 1/n.
A més, és fàcil veure que aquesta combinació correspon, de fet, a la descrita en l’eq (29)
pel mètode de Simpson. És a dir, que en passar de trapezis a Simpson en disminuïm
l’error en dos ordres de magnitud, el que implica no només una major precisió sinó una
convergència millor.
Una altra conseqüència immediata és el fet que, tot i basar-se en segments parabòlics, el
mètode de Simpson és exacte per polinomis d’ordre 3.
Ja pots intuir ara la base del mètode de Romberg. El que s’aconsegueix és eliminar els
termes d’error fins a ordre 1/n2(m+1)
, on m es l’ordre de la sèrie de Romberg. Per tant, el
mètode de Cotes (m=2) té un error de l’ordre 1/n6, la següent columna de la taula 1/n
8 i
així successivament.
Fixa’t en les conseqüències d’aquest fet. Per exemple, la integració exacta d’un
polinomi d’ordre 10 és podria aconseguir aplicant Romberg fins a ordre m=4. I
per poder aplicar-ho només en necessitem saber els aproximacions a la integral pel
mètode dels trapezis fent servir 20, 2
1, 2
2, 2
3 i 2
4 intervals! Curiós, no?
Hi ha, però, un altre factor que no hem tingut en compte fins ara i es que cal tenir
presents els errors d’arrodoniment. La computadora, com ja sabem té una precisió
limitada. En FORTRAN aquesta depèn també del tipus de dada. Les dades tipus REAL
tenen 8 xifres significatives, mentre que les REAL*8 (double precision) en tenen el
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
94
doble, 16. Això vol dir que la nostra precisió en la integració mai podrà superar (o
igualar) la del tipus de dades que fem servir degut als errors d’arrodoniment.
Per il·lustrar aquest fet, s’ha recalculat la Taula de Romberg per la integral anterior
utilitzant variables de tipus REAL, enlloc de DOUBLE PRECISION.
k m=0 m=1 m=2 m=3
0 (1) -53.50313568
1 (2) -45.69469070 -43.09187698
2 (4) -43.77193451 -43.13101578 -43.13362503
3 (8) -43.29299927 -43.13335419 -43.13351059 -43.13351059
4 (16) -43.17337418 -43.13349915 -43.13351059 -43.13351059
5 (32) -43.14347458 -43.13350677 -43.13350677 -43.13350677
6 (64) -43.13600159 -43.13351059 -43.13351059 -43.13351059
7 (128) -43.13413239 -43.13351059 -43.13351059 -43.13351059
... ... ... ... ...
19 (~5·105) -43.13350296 -43.13349915 -43.13349915 -43.13349915
Exacte -43.13350859
La propagació d’errors és clara. Tot i que els resultats semblen convergits a un nombre,
si anem a ordres més grans els resultats oscil·len. En aquest cas, no aconseguir arribar a
la mateixa precisió que abans ni augmentant el nombre d’intervals ni incrementant
l’ordre de Romberg. La raó principal és que, com més gran és el nombre d’intervals,
més petit és la mida d’aquest i per tant major serà l’error relatiu degut a l’arrodoniment.
El que podem aprendre d’això és que incrementant el nombre d’intervals no sempre ens
assegura una major precisió i convergència
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
95
6.6 Integració numèrica de funcions: Integrals impròpies
Fins ara hem assumit que l’integrand era una funció que es comportava bé, amb uns
límits d’integració ben definits. En realitat, ens podem trobar amb certs casos on els
mètodes descrits amb anterioritat fallaran.
En distingirem de varis tipus i en veurem quines tècniques podem fer servir per
solucionar-ho.
Límits d’integració no avaluables
En aquest cas, el problema és que no podem determinar la imatge de la funció al/als
límits d’integració. I no podem determinar aquest valor a) perquè no és finit, o b) perquè
no és determinable numèricament.
Exemples típics poden ser les integrals següent7:
11
0 dx)xln( (1)
85193710
.dxx
)xsin(
(2)
En el primer cas la imatge del límit inferior tendeix a -, mentre que en el segon tenim
una indeterminació del tipus 0/0. En aquest cas, aplicant l’Hôpital es pot veure que el
seu valor és 1, però mai podrem determinar-ho numèricament. En altres paraules, si el
programa arriba a un càlcul del tipus 0/0 l’algorisme serà inestable (dependent de les
opcions de compilació i del compilador mateix potser que fins i tot s’aturi).
Pel que fa a la resta de l’interval d’integració, no presenta cap problema.
Per tant, l’únic problema és que no podem avaluar la funció en un dels extrems de
l’interval d’integració. La solució podria ser intentar trobar una fórmula que no en
depengués dels valors de la funció als intervals, i això és el que farem.
7 Obviament, només cal preocuparse per integrals que tenen un valor finit. Si una integral divergeix no cal
intentar trobar el valor numèricament!
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
96
Partirem de l’expressió per al mètode dels trapezis d’ordre k
1
1
22
kn
i
kk
k )iha(f)b(f)a(fh
T (3)
on la mida del interval (hk, distància entre punts) depèn de l’ordre de manera que
12
1 kk hh (4)
Amb les expressions 3 i 4 podem escriure la corresponent a l’ordre k-1.
1
1
1
1
11
1
1
1
22
22
k
k
n
i
kk
n
i
kk
k
)hia(f)b(f)a(fh
)iha(f)b(f)a(fh
T
(5)
Es pot veure fàcilment que si prenem la combinació 2Tk – Tk-1
senari)iha(fh
)hia(f)iha(fhTT
k
kk
n
i
kk
n
i
k
n
i
kkkk
1
1
1
1
1
1
1
2
22221
(6)
arribem a una expressió on no apareixen els valors de la funció en els límits
d’integració. A més, si suposem que Tk , conforme augmenta k, convergeix al valor de la
integral, això vol dir que
kkkkk TTTTT 11 2 (7)
i així, les eq (3) i (6) tendeixen al mateix valor.
Les expressions que no depenen del valor de la funció als límits d’integració (6)
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
97
s’anomenen fórmules obertes i, de fet, es poden deduir de manera similar expressions
anàlogues pel mètode del Simpson, etc...
Límits d’integració no finits
Aquest és el cas d’integrals impròpies del tipus
a
adx)x(fdx)x(f (8)
Es presenten dos tipus de problemes. El primer és que no podem representar
numèricament l’infinit. Per tant, hauríem d’aproximar el límit d’integració per un
nombre suficientment gran. Aquesta aproximació serà, en general, força bona donat que
una condició per a que el valor d’una integral d’aquest tipus convergeixi és que la
funció tendeixi a zero als límits no finits. Per tant, tenim que la contribució al valor de la
integral per a valors de x suficientment grans (o petits) serà menyspreable. Fixeu-vos
que en el cas anterior, l’efecte és ben be el contrari. És al voltant de la discontinuïtat (on
la funció es fa no finita) on hi ha una major contribució al valor de la integral. És per
això que es sol recórrer a formules obertes.
L’altre problema és que, tot i aproximar l’infinit numèricament (1012
, etc) , l’interval
d’integració és extremadament gran, pel que caldria avaluar la funció en un gran
nombre de punts a fi que la distància enter intervals sigui suficientment petita.
El que es pot fer en aquests casos és un mapping de la funció i intervals d’integració
originals en uns altres, amb la obvia restricció de que l’àrea sota la corba sigui
exactament la mateixa.
Farem el següent canvi de variable
dxx
dt
xt
2
1
1
(9)
Si ho substituïm a l’expressió de la integral tindrem, per exemple
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
98
a/
b/
b/
a/
b
adt
tf
tdt
tf
tdx)x(f
1
1 2
1
1 2
1111 (10)
Amb això, hem passat d’avaluar la integral dins un interval infinit x[a,] a un interval
t[0,1/a]. Òbviament, la funció a integrar ha canviat. Aquesta tècnica del “mapeig” no
és útil només en cas de límits d’integració no finits, sinó que pot servir en molts casos
per escurçar l’interval d’integració a fi d’obtenir una millor precisió amb menys punts.
Fixeu-vos, però, que solucionem la presència de l’interval infinit, però introduïm una
discontinuïtat, ja que no podem avaluar la imatge de la nova funció per t = 0. Això
també implica que no podem fer aquest canvi de variable per escurçar un interval
d’integració quan els respectius límits d’integració canvien de signe (passaríem pel zero
i ens trobaríem amb la discontinuïtat a l’interior de l’interval!).
Podem evitar aquest problema utilitzant formules obertes o bé prenent com a límit
d’integració original un nombre suficientment gran (o petit).
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
99
Exemple 1:
11
0 dx)xln(
Mètode dels trapezis amb formula tancada i oberta
k Tk * 2Tk-Tk-1
1 13.81551075 ---
2 7.25432873 0.836988217
3 4.04565859 0.915951454
4 2.48080492 0.957328752
5 1.71906686 0.978501874
6 1.34878433 0.989210263
7 1.16899729 0.99459496
8 1.08179617 0.997294937
9 1.03954554 0.998646833
10 1.01909614 0.999323257
11 1.00920975 0.999661589
12 1.00443554 0.999830785
13 1.00213385 0.99991539
14 1.00102496 0.999957694
15 1.00049150 0.999978847
* Límit inferior d’integració 10
-12
Veiem que per ordres d’integració petits la formula oberta dóna clarament millors
resultats mentre que conforme augmentem el nombre d’intervals tots dos mètodes
tendeixen al mateix valor ( tot i que la fórmula oberta és superior en tots els casos)
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
100
Exemple 2:
dx
x21
1
El valor exacte d’aquesta integral impròpia és . Per tal de determinar-ne el valor
numèricament tenim el problema de dos límits d’integració no finits. No poden aplicar
directament la transformació (10) per raons òbvies. Tanmateix podríem plantejar-nos
trobar el valor de la integral a partir de
0 2
0
22 1
1
1
1
1
1dx
xdx
xdx
x
El problema ara és que el mapeig de l’eq (10) tornaria a donar un límit d’integració
infinit, ja que el un dels límits original és el 0. Per tant, podríem descomposar novament
la integral en
1 2
1
1 2
1
22 1
1
1
1
1
1
1
1dx
xdx
xdx
xdx
x
i aplicar la tècnica del mapeig i posterior formula oberta a la primera i tercera de les
integrals, mentre que la segona no comporta cap problema addicional.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
101
6.7 Integració numèrica de funcions de una o més variables:
Mètode de Monte Carlo
Suposem ara que volem avaluar la integral d’una funció de vàries variables dins un
volum determinat .
nn dx..dxdx)x,..,x,x(f 2121 (1)
Aplicant les idees de la secció anterior, podríem aproximar la integral per sumatoris,
discretitzant el domini d’integració
n
n
n
ii
np
i
np
i
np
i
iiiinn x...xx)x,..,x,x(f...dx..dx)x,..,x(f 2
1
1
2
2
132111 (1)
En una funció d’una variable, aproximem la integral per la suma de les àrees de np
figures planes com trapezis (on np es el nombre d’intervals). Si tenim una funció de
dues variables, la integral vindria donada per la suma dels np1np2 volums de figures
tridimensionals, etc...
El que és important és veure que si ens calgués avaluar la funció en cap a 100 punts per
una funció monodimensional, per una bidimensional en caldrien 1002 per obtenir una
precissió similar, 1003 per una 3D, etc... Per tant, per funcions de vàries variables no és
precisament el mètode més eficient.
Un dels mètodes més eficients en aquests casos el l’anomenat mètode de Monte Carlo.
Vegem en què es basa mitjançant un exemple senzill. Posteriorment entrarem en més
detall. Suposem que volem avaluar la integral següent,
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
102
que correspon a l’àrea sota la corba. Tot seguit definim un àrea que englobi l’àrea que
busquem. Per exemple, el rectangle definit pels segment b-a i f(b).
Òbviament, l’àrea d’aquest rectangle (Arect) serà una cota superior de l’àrea que
busquem. A més, si definim g com la proporció entre les àrees sota la funció (integral) i
l’àrea total del rectangle, podem escriure la integral com
rect
b
agAdx)x(fI (3)
Suposem ara que definim N punts aleatoris distribuïts uniformement dins l’àrea Arect.
La filosofia del mètode Monte Carlo és la de determinar aquesta proporció entre les
àrees, g, estimant-la com la proporció entre els punts que queden per sota de la
corba respecte els totals.
Només per curiositat, en el cas particular del gràfic anterior, la proporció és de 29/37
(compta’ls!) per tant la integral seria
)ab)(b(fAI rect 37
29
37
29 (4)
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
103
Mètodes Monte Carlo
En general, el teorema en què és basen els mètodes Monte Carlo és el que ens diu que la
integral d’una funció en un volum multidimensional V, dins el qual escollim N punts
(x1,..., xN) de manera aleatòria i uniforme, es pot expressar com
V N
ffVfVfdV
22
(5)
on
N
i
i
N
i
i )x(fN
f)x(fN
f 22 11 (6)
representen les mitjanes aritmètiques de la funció i el quadrat de la mateixa, i el segon
terme de l’eq (5) representa una estimació de l’error (desviació standard).
A partir d’aquest teorema podem plantejar-nos dues maneres de determinar una integral
multidimensional. Escollirem un o altra bàsicament en funció de la regió d’integració,
és a dir segons aquesta es pugui “samplejar” fàcilment o no.
Vegem-ho amb un exemple:
Exemple 1
Volem determinar la integral següent
1
1
1
1
22
dxdye )yx(
En aquest cas, la regió d’integració és simple; ve definida pels intervals x[-1,1] i y[-
1,1], és a dir, per un quadrat d’àrea 22 = 4. Segons les eq (5)-(6), si avaluem la funció
en N punts aleatoris uniformement distribuïts dins la regió d’integració (quadrat) i en
determinem el valor mitjà, f , el valor de la integral serà
ffVdxdye )yx( 41
1
1
1
22
De vegades, però, la regió d’integració no es tan simple, i pot resultar difícil obtenir una
distribució uniforme de punts per tal de determinar la mitjana de la funció a integrar.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
104
El que fem és tractar de trobar un volum multidimensional (regió d’integració) conegut,
W, que contingui la regió d’integració original, V. Posteriorment, generem els N
nombres aleatoris dins aquest volum W , tot determinant per cada punt si pertany a la
regió d’integració, V. En cas negatiu, el punt no es pren per determinar el valor mig de
la funció dins l’interval, f (de fet és com considerar que la funció es fa zero en els
punts de fora de l’interval d’integració....). Finalment, el producte del valor mitjà de la
funció, f , pel volum “samplejat” ,W, ens donarà el valor de la integral.
Exemple 2
Per exemple, imaginem ara que volem determinar l’integral de la funció
)yx(e22
en un interval circular de radi R al voltant del centre de coordenades8. Com a volum W
podríem prendre simplement un quadrat de costat 2R centrat a l’eix de coordenades
x
y
R
Cada punt aleatori dins W, pi , vindrà donat per les seves coordenades (xi, yi). Aquest
punt pertanyerà també a la regió d’integració, V, si xi2+ yi
2 R
2. Llavors, per cada punt
generat caldrà comprovar si es compleix la inequació anterior per tal de tenir-ho en
compte. És clar que els punts “no vàlids” tenen el seu efecte: l’eq (5) ens diu que l’error
estimat serà major (en aquest cas el volum serà W, essent W > V).
Existeix encara una manera més intuïtiva d’aplicar la tècnica de Monte Carlo. Aquest
8 En aquest cas un canvi de variable a coordenades polars seria molt més eficient, però es tracta només
d’un exemple.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
105
pot ser el cas, per exemple, de determinar el volum de figures 3D complexes.
La manera de fer en aquest cas seria una generalització de l’esquema presentat a l’inici
del tema. En aquest cas es tractaria de trobar un volum multidimensional conegut, W,
que contingui el volum9 (integral) que busquem, V. Es generen els N nombres aleatoris
dins aquest volum es determinen quants d’aquest punts es troben dins el volum V. La
relació entre aquests punts “vàlids” i els totals ens donarà la relació entre els volums V i
W, i per tant V, que és el que busquem
Exemple 3
Per exemple, podem determinar el volum d’una esfera de radi R (com pots imaginar hi
ha mill maneres més eficients de fer-ho).
En aquest cas, el volum W podria ser el d’un cub de costat 2R, és a dir 8R3. Cada punt
aleatori dins W, pi , vindrà donat per les seves coordenades, en aquest cas (xi, yi, zi). En
aquest cas, el punt pertanyerà també al volum que busquem, V, si xi2+ yi
2 + zi
2 R
2.
Finalment V vindrà donat simplement pel producte de W per la fracció de punts que
han caigut dins el volum que buscàvem.
De fet, la funció 2D en coordenades cartesianes que defineix la superfície de l’esfera i
que integrada ens dóna el volum és simplement f(x,y)=R2 - xi
2- yi
2. Pots aplicar Monte
Carlo de manera anàloga a l’exemple 2 per tal de determinar-ne el volum per
integració de f(x,y). Sol: En surt la meitat, no? Per què?
9 Un volum N dimensional sempre es pot entendre com la integral d’una funció N-1 dimensional. Tot i
això, de vegades no és senzill trobar l’equació matemàtica que descriu la forma de l’objecte i que
integrada ens donaria el seu volum.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
106
Generació de nombres aleatoris en FORTRAN
El FORTRAN 77 standard no té cap funció o subrutina intrinseca que generi nombres
aleatoris. Existeixen algunes funcions no standard com, ran, rand o srand que son
proveïdes de fet pel propi compilador i que funcionen en entorns de hardware específic
(no PC’s... supercomputadors tipus IBM, Sillicon Graphics, CRAY, etc..).
El FORTRAN90 si que inclou subrutines intrínseques standard per generar nombres
aleatoris i, donat que de fet fem servir un compilador de FORTRAN95, les utilitzarem
com si fossin part del FORTRAN 77.
Per generar un nombre aleatori i emmagatzemar-lo en una variable de tipus REAL, x,
farem simplement
call random_number(x)
Cal tenir en compte que la sentència anterior ens genera un nombre aleatori només
dins l’interval [0,1]. Això no és cap restricció, si volem un nombre aleatori dins
l’interval [a,b] , a < b, només cal realitzar la transformació següent
x = x*(b - a) + a
Amb el factor multiplicatiu expandim/contraiem el rang inicial (una unitat) a la mida
desitjada, mentre que afegint a aconseguim ajustar el valor mínim possible que es pot
generar al menor valor de l’interval, en aquest cas a.
Per generar nombres aleatoris en un volum multidimensional caldrà determinar
cadascuna de les components del punt de manera aleatòria, mitjançant successives
crides a la subrutina.
Per exemple, per un punt dins un volum 3D donat per les components (x,y,z) caldrà fer
call random_number(x)
call random_number(y)
call random_number(z)
Val a dir també que cal incialitzar el generador de nombres aleatoris per tal de no
obtenir sempre la mateixa seqüència. Això es pot fer cridant a una altra subrutina
intrínseca un sol cop abans de començar a generar els nombres aleatoris . La
subrutina en qüestió es diu random_seed i pot ser cridada sense arguments. En concret
call random_seed( )
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
108
7. -Minimització de funcions i derivació
http://en.wikipedia.org/wiki/Finite_Differences
7.1. Derivació numèrica per diferències finites
Utilitzarem el programa MAPLE pervisualitzar l’efecte del step en l’obtenció de
derivades numèriques d’una funció per mitja de diferències finites.
Comencem
> restart:
Definim la funció
> f:=2.0*exp(-2*x)-sin(Pi*x);
:= f 2.0 e( )2 x
( )sin x
> plot(f,x=-0.1..4);
Especifiquel el punt on volem trobar el valor de les derivades
> val:=0.5;
:= val .5
> f1:=diff(f,x);
:= f1 4.0 e( )2 x
( )cos x
Primera derivada analitica (exacta)
> d1:=evalf(subs(x=val,f1));
:= d1 -1.471517764
> f2:=diff(f,x,x);
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
109
:= f2 8.0 e( )2 x
( )sin x 2
Segona derivada analitica (exacta)
> d2:=evalf(subs(x=val,f2));
:= d2 12.81263993
>
Ara ho farem numèric. Per la primera derivada utilitzem l’expressió de diferències
finites. Ens quedara en funció del paràmetre step, que controla quant ens movem per
determinar la derivada
> f1num:=(subs(x=val+step,f)-subs(x=val-step,f))/(2*step);
:= f1num1
2
2.0 e( ) 1.0 2 step
( )sin ( ).5 step 2.0 e( ) 1.0 2 step
( )sin ( ).5 step
step
Per un step de 0.001 ens dona força be
> evalf(subs(step=0.001,f1num));
-1.4715187
També podem intentar avaluar el límit per step zero. Dona gairebe igual al valor exacte
> limit(f1num,step=0);
-1.471517765
Per ultim podem dibuixar la dependencia del valor de la derivada amb el valor del
paràmetre. Els erros son força petits, pero podem veure com més petit és el valor del
step millor s’ajusta al valor exacte. Tot i axò, per valors molt petits es perdria precisió
> plot({f1num,d1},step=0..0.005);
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
110
Per a la segona derivada també poden fer diferències finites
> > f2num:=(subs(x=val+step,f)+subs(x=val-step,f)-
2*subs(x=val,f))/(step**2);
f2num 2.0 e( ) 1.0 2 step
( )sin ( ).5 step 2.0 e( ) 1.0 2 step
( )sin ( ).5 step ( :=
4.0 e( )-1.0
2 ( )sin .5 step 2)
Per un step de 0.001 ens dona una mica pitjor que per la primera derivada
> evalf(subs(step=0.001,f2num));
12.8124
El limit divergeix en aquest cas
> limit(f2num,step=0);
( )Float
Per ultim podem dibuixar la dependencia del valor de la derivada amb el valor del
paràmetre. Els erros son petits, pero més grans que el cas de la primera derivada
> plot({f2num,d2},step=0.001..0.01);
DE fet, la segona derivada la podem obtenir d’una altra manera també. El que farem és
ajustar a 3 punts una paràbola del tipus y = ax2+bx+c. La gràcia és que la segona
derivada de la funció ajustada és simplement 2a
Generem tres equacions (e1,e2 i e3) del tipus y = ax2+bx+c als punts x, x+step i x-step
> e1:=subs(x=val,f)=a*val^2+b*val+c;
:= e1 2.0 e( )-1.0
( )sin .5 .25 a .5 b c
> e2:=subs(x=val+step,f)=a*(val+step)^2+b*(val+step)+c;
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
111
:= e2 2.0 e( ) 1.0 2 step
( )sin ( ).5 step a ( ).5 step 2 b ( ).5 step c
> e3:=subs(x=val-step,f)=a*(val-step)^2+b*(val-step)+c;
:= e3 2.0 e( ) 1.0 2 step
( )sin ( ).5 step a ( ).5 step 2 b ( ).5 step c
> e4:=solve({e1,subs(step=0.001,e2),subs(step=0.001,e3)});
:= e4 { }, ,c 2.073083076 a 6.406259282 b -7.877778027
Ens queda un sistema de tres equacions amb tres incògnites (a, b i c). Ho resolem
> e5:=solve({e1,e2,e3},{a,b,c}):assign(e5);
El valor de la segona derivada sera 2 vegades el valor del coeficient a
> f2num2:=2*a:
Si representem el valor de la segona derivada en funció del parametre step
> plot({f2num2,d2},step=0.001..0.01);
Ara podem representar les dues aproximacions
> plot({f2num,f2num2,d2},step=0.001..0.01);
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
112
En aquest cas l’ajust del polinomi de segon grau dona lleugerament millor que
diferencies finites. Tot i això, no podem generalitzar.
7.2. Punts estacionaris.
7.3. Mètodes de gradient.
7.4. Mètode Newton-Raphson.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
113
8.- Inversió de Matrius
8.1 Algorisme general d’inversió de matrius quadrades
Partim d’una matriu quadrada, A, de dimensions NN i volem determinar la seva matriu
inversa, A-1
, és a dir la matriu amb la que es compleix
IAAAA 11 (1)
De fet, podríem plantejar el problema de trobar la matriu inversa com la resolució de N
sistemes d’equacions del tipus
N,ibAx ii 1 (2)
on
1
0
0
0
1
0
0
0
1
21...
b,...,...
b,...
b N
(3)
Si escrivim l’eq (2) de la següent manera
I
N
A
N b,...,b,bx,...,x,xA 2121
1
(4)
podem veure fàcilment que els vectors xi corresponen a les columnes de la matriu
inversa
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
114
NNNN
N
N
N
x...xx
............
x...xx
x...xx
x,...,x,xA
21
22221
11211
21
1
(4)
Podem trobar la inversa de la matriu resolent les N equacions simultàniament construint
la següent matriu auxiliar
100
0
010
001
21
22221
11211
...
.........
...
...
|
|
|
|
a...aa
............
a...aa
a...aa
B
NNNN
N
N
(5)
que construïm a partir de la matriu original, A, i la matriu identitat , I.
Ara, l’algorisme per determinar la matriu inversa és anàleg al de Gauss-Jordan per la
resolució de sistemes d’equacions que hem vist prèviament.
L’objectiu és, mitjançant la tècnica de l’eliminació Gaussiana, transformar el primer
bloc de la matriu en la matriu identitat. És a dir, el que farem és substituir files de la
matriu B per combinacions lineals de files de la pròpia matriu de tal manera que
aconseguim transformar el primer bloc de la matriu en una matriu diagonal.
Posteriorment, dividim cada fila per l’element de la diagonal del primer bloc per tal
d’aconseguir la matriu identitat. Arribats a aquest punt, al segon bloc de la matriu B hi
trobarem la matriu inversa que estàvem buscant.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
115
Per tant l’algorisme serà, pràcticament, anàleg al de Gauss-Jordan, amb la diferència
que la matriu sobre la que fem les transformacions tindrà 2N columnes
do Per cada fila de referència i
do Per totes les altres files k (ki)
N,ja
a
aa'a ij
ii
kikjkj 21
!Apliquem Gauss-Jordan
end do
end do
do Per cada fila i
N,ja
aa
ii
ij
ij 21 !Dividim cada fila per aconseguir
!matriu diagonal al primer bloc
end do
Nj'jaa 'ijij1
!Elements de la matriu inversa
Anàlogament al mètode de Gauss-Jordan, ens podem trobar amb zeros a la diagonal (del
primer bloc de la matriu B), que implicarien eventualment una divisió per zero. Aquests
elements nuls podem existir inicialment a la matriu A, o bé aparèixer a mesura que la
matriu original es va transformant. Tant en un cas com en un altre, podem evitar el
problema simplement seleccionant una altra fila de referència (veure pivotatge)
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
116
9.- Equacions seculars
9.1. Definicions
Les equacions seculars, o equacions de valors i vectors propis, son potser les equacions
matricials més importants i les seves aplicacions son il·limitades en el camp de l’àlgebra
lineal.
Suposem que tenim una matriu quadrada A de dimensió N i un vector columna v de la
mateixa dimensió. El resultat de multiplicar la matriu pel vector
wvA
(1)
serà una altre vector w, de la mateixa dimensió.
Direm que el vector v és un vector propi o eigenvector de la matriu A si es compleix
que
vvA
(2)
o bé desenvolupant el producte de matriu per vector
NivvAN
k
ikik ,1
(3)
a on és un escalar. És a dir, si el resultat de multiplicar una matriu per un vector
columna dona un múltiple d’aquest,
NNNNNNN
N
N
v
v
v
v
v
v
v
v
v
AAA
AAA
AAA
.........
...
............
...
...
2
1
2
1
2
1
21
22221
11211
(4)
el vector serà un vector propi de la matriu. Per tant, els vectors propis d’una matriu són
aquells que quan son transformats (multiplicats) per la matriu no canvien la seva
direcció.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
117
Per altra banda, l’escalar rep el nom de valor propi o eigenvalor associat al vector
propi.
Fixeu-vos que en una equació del tipus (2)-(4), les incògnites son tant el vector propi
(cada component) com el valor propi associat, el que provoca que la seva resolució, és a
dir, el procés de determinar valors i vectors propis no sigui trivial.
Els vectors propis d’una matriu A no estan únicament definits en el sentit de que si v és
un vector propi de A amb valor propi , un múltiple del vector v també serà vector propi
i tindrà associat el mateix valor propi. Si definim el vector w con un múltiple de v
NN v
v
v
v
w
w
w
w
......
2
1
2
1
(5)
i comprovem si és vector propi a partir de l’eq (2)
wvvvAvAwA
)()( (6)
veiem que en efecte es compleix la condició, on hem fet servir les propietats del
producte d’una matriu o vector per un escalar. Podem veure-ho també desenvolupant el
producte de la matriu pel vector, tal i com hem fet a l’equació (3)
Niw
vvvAvAwA
i
N
k
i
N
k
ikikkik
N
k
kik
,1
(7)
Així doncs, sempre podrem multiplicar un vector propi per un escalar i el resultat
seguirà essent un vector propi amb el mateix vector propi. No considerem però que
aquest nou vector sigui un altre vector propi diferent, és a dir, una altra solució de l’eq.
(2). A la pràctica això vol dir que podem triar la longitut (mòdul) de cada vector propi.
Normalment s’escullen de manera que la seva norma sigui la unitat, és a dir,
normalitzats.
Ara veurem algunes propietats i teoremes importants pel cas particular de les matrius
simètriques.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
118
9.2. Propietats
a) Una matriu quadrada i simètrica A de dimensió N sempre serà diagonalitzable,
és a dir, tindrà N vectors propis amb els seus valors propis corresponents. Per tant, l’eq.
(2) tindrà N solucions diferents
NivvA iii ,1
(8)
on el subíndex i ara fa referència a vectors diferents i no a la component i del vector.
Podem escriure en una sola equació matricial totes les solucions possibles de la forma
XXA (9)
a on la matriu X és una matriu quadrada de dimensió N que conté en les seves columnes
els vectors propis de A.
NNNN
N
N
N
vvv
vvv
vvv
vvvX
...
............
...
...
...
21
22221
11211
21
(10)
Per altra banda, la matriu és una matriu diagonal i conté a la diagonal principal els
corresponents valors propis associats a cada vector propi (columna de la matriu X)
N
...00
............
0...0
0...0
2
1
(11)
i en el mateix ordre. Per tant, 1 és el valor propi del vector propi v1, 2 és el valor propi
del vector propi v2, etc...
Les matrius i X no son úniques en el sentit que les seves columnes es poden reordenar
de manera arbitrària. Tot i això, si les columnes de X apareixen en un ordre determinat,
el mateix ha de ser per les de la matriu , de manera que per un determinat vector propi
que es trobi a la columna k de la matriu X, el seu corresponent valor propi ha d’ocupar
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
119
precisament la columna k de la matriu diagonal .
b) El conjunt de vectors propis diferents iv
formen una base de vectors de
dimensió N.
Per tant, els vectors propis són linealment independents entre sí.
c) Els vectors propis associats a valors propis diferents són ortogonals entre si.
Suposem que v i w son vectors propis de la matriu A amb valors propis i ,
respectivament.
wwAvvA
(12)
A partir de la primera equació anterior podem escriure
vwvwvAw TTT (13)
multiplicant a un cantó i altre de la igualtat pel vector w transposat (filera).
Fent el mateix a partir de la segona, en aquest cas multiplicant per l’esquerra pel vector
v transposat tenim
wvwAv TT (14)
Transposant ara a un canto i altre de l’equació (14)
TTTT wvwAv
(15)
i aplicant les propietats del transposat del producte i de les matrius simètriques
vwvAwvAw TTTT (16)
Comparant les equacions (13) i (16)
vwvw TT (17)
podem veure que si ≠ llavors forçosament
0vwT ,
és a dir que el producte escalar entre els dos vectors propis s’anul·la, i per tant són
ortogonals entre si.
d) Una combinació lineal entre dos o més vectors propis que tenen un mateix valor
propi associat és també vector propi i amb el mateix valor propi.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
120
Segons l’equació (17), en el cas de que = la ortogonalitat dels respectius vectors
propis no esta assegurada. De fet, quan els valors propis són degenerats (coincideixen)
els vectors propis no estan definits únicament i qualsevol combinació lineal entre ells
compleix també la condició de vector propi. Per veure-ho simplement definim un nou
vector com a combinació lineals dels altres dos
wvx
(18)
on i són escalars, i comprovem que en efecte és també vector propi de A
xwv
wvwAvAwvAxA
)(
(19)
i amb el mateix valor propi.
Així, quan hi hagi degeneració podrem combinar linealment entre sí els vectors propis
que comparteixen el mateix valor propi de tal manera que els vectors resultants siguin
ortogonals entre si.
Per tant, la conclusió final és que conjunt de vectors propis d’una matriu quadrada i
simètrica es poden triar de manera que formin una base ortogonalitzada de l’espai.
Això vol dir que el producte escalar entre diferents vectors propis s’anul·la, mentre que
el producte escalar entre un vector propi i ell mateix serà la unitat, perquè l’escollim
normalitzat. Per tant, podem escriure
ijj
T
i vv
(20)
En l’eq. (9) hem vist que els vectors propis ocupen les columnes de la matriu X. Si la
multipliquem per la esquerra per ella mateix transposada el resultat és precisament la
matriu que conté el productes escalars entre tots els vectors propis.
N
T
N
T
N
T
N
N
TTT
N
TTT
N
T
N
T
T
T
vvvvvv
vvvvvv
vvvvvv
vvv
v
v
v
XX
...
............
...
...
......
21
22212
12111
212
1
(21)
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
121
Llavors, segons l’eq. (20), el resultat del producte matricial és la matriu identitat
IXX T
1...00
............
0...10
0...01
(22)
i per tant, les matrius X que contenen els vectors propis d’una matriu simètrica són
matrius unitàries. Com veurem més endavant, aquest fet fa que el procés de
diagonalització es pugui fer servir com a pas previ per a la determinació de inverses de
matrius, determinants, funcions de matrius, etc...
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
122
9.3. Algorisme de diagonalització de matrius pel mètode de les
rotacions elementals de Jacobi.
Partim d’una matriu quadrada (NN) i simètrica A. L’objectiu és resoldre l’equació
matricial següent
XAX (1)
on X és una matriu unitària (tal que XT
= X-1
) i és una matriu diagonal.
La matriu diagonal conté a la seva diagonal principal els N valors propis de la matriu
original A, mentre que les columnes de la matriu X són els N vectors propis
corresponents.
Per tant, amb les matrius X i , multiplicant per un costat o altre a ambdós costats de
l’eq. (1) per XT obtenim les igualtats següents
TXXA (2)
o bé
AXX T (3)
Veiem ara com podem resoldre l’eq (1), és a dir, trobar la matriu diagonal és i la
matriu de transformació, X, aplicant l’anomenat mètode de les rotacions de Jaboi.
L’algorisme de Jacobi es basa en l’ús de matrius elementals de rotació, )(R pq .
Aquestes son matrius unitàries (com X) que tenen la forma següent
q
p
....
cos..sin..
..............
....
sin..cos..
..............
....
....
)(R
qp
pq
100000
0000
0
001000
0000
0
000010
000001
Si ens fixem, la matriu )(R pq és gairebé la matriu identitat, I, amb només quatre
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
123
elements de la matriu modificats, precisament els corresponents a les fileres i columnes
a què fan referència els superíndexos pq
.
Veiem amb un exemple què fan aquests tipus de matrius. Suposem que tenim un punt P
en l’espai 2D que ve donat per les coordenades P(x, y). En coordenades polars tindríem
)sin(ry
)rcos(x
a on r i representen el mòdul i angle respecte l’eix de les x, respectivament. Si
realitzen una rotació del vector en el pla de graus en el sentit de les agulles del rellotge
arribarem a un altre punt del pla que vindrà donat per altres coordenades P’(x’,y’)
x
y
(x,y)
(x’,y’ )
x
y
(x,y)
(x’,y’ )
Escrivint-lo en funció de les seves coordenades polars i fent ús de relacions
trigonomètriques conegudes i de l’expressió en coordenades polars del punt original
podem escriure
ycosθxsinθ)sinθcosαcosθr(sinαθ)sin(αry'
ysinθxcosθ)sinθsinαcosθr(cosαθ)rcos(αx'
En forma matricial tindrem
y
x
cossin-
inscos
y
x
'
'
XRX )('
Per tant, la matriu R() representa la rotació de graus en el sentit de les agulles del
rellotge.
Es pot comprovar que en un espai 3D, la mateixa rotació d’un punt repecte l’eiz z (és a
dir, en el pla xy) vindria donada per la matriu,
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
124
100
0cosθsinθ-
0sinθcosθ
per tant ja poden intuir que la matriu )(R pq és una generalització en un cas
multidimensional a on la rotació de graus es dona en el pla pq , i per tant només afecta
a les coordenades p i q del punt.
Una de les propietats de les matrius unitàries és que el producte entre dues matrius
unitàries qualsevol és també una matriu unitària. Per tant, podem representar una rotació
complexa com una sèrie de rotacions elementals, i la matrius unitària que correspon a
aquesta rotació complexa serà el producte de les respectives matrius de les rotacions
elementals de què consta.
Tenint en compte això, l’estratègia que segueix l’algorisme de Jacobi és la següent:
Amb una matriu de rotació )(pqRR escollida escaientment, transformem la matriu
inicial A de tal manera que
ARRA T' (4)
La nostra matriu A ha canviat (ara és A’). Degut a la forma particular de les matrius de
rotació (gairebé son la matriu identitat), els canvis només afectaran a les files i
columnes p i q de la matriu original A. En concret, anem a veure com canvia l’element
A(p,q). Desenvolupant el producte matricial de les tres matrius anteriors tenim
qqqqpqqp
T
pqqqpqpqpp
T
pp
k
qqkqpqkp
T
pk
lk
lqkl
T
pkpq
RARARRARAR
RARARRARA
,
'
(5)
Substituint els elements de la matriu de rotació R tenim
)cos(A)AA()sin(
sincosAsinAcosAsincosA'A
pqqqpp
qqqppqpppq
22
2
22
(6)
on hem fet servir la relació qppq AA , donat que A és simètrica.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
125
Per tant tenim una expressió per la forma final de l’element p,q de la matriu
transformada en funció de l’angle de rotació . El que farem es trobar l’angle tal
que provoca que l’element p,q de la matriu A’ esdevingui zero. És a dir, imposant
que A’pq= 0 tenim
qqpp
pq
qqpp
pq
pq
AA
A
AA
AA
2arctan
2
1
2)2tan()2cos(
2
)2sin(
(7)
Per tant, si fem la transfomació donada per l’eq (4) per aquest angle , aconseguirem
que l’element A’pq (i per simetria l’ A’qp) sigui zero.
Si la matriu A’ resultés ser diagonal, l’eq (4) seria equivalent a l’eq (3) i per tant ja
hauríem resolt el problema: la matriu de rotació R seria la matriu X i la matriu diagonal
A’ seria .
Excepte en algun cas particular (matrius 2x2), això no serà així. Tanmateix podríem dir
que la matriu A’ està, en principi, més a prop de ser diagonal ja que hem aconseguit
anular alguns dels seus elements.
L’estratègia és tornar a aplicar una altra vegada la transformació sobre la matriu
transformada A’ amb una altra matriu de rotació per tal d’aconseguir anular un altre
element, i així successivament fins que tots els elements de fora de la diagonal fossin
zero (o suficientment petits).
Així, en anar aplicant rotacions successives tindrem
k
''A
'A
TTT
k R...RARRR...R
2112
(8)
fins arribar a tenir una matriu diagonal.
Comparant l’eq.(8) amb la (3) poden veure fàcilment que la matriu de transformació X
que estem buscant
kR...RRX 21 (9)
seria el resultat del producte matricial de les successives rotacions que hem anat fent (i
en aquest ordre!).
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
126
La pregunta és: com escollim la matriu de rotació? El que farem és, en cada iteració
(transformació), determinar l’element de fora de la diagonal de la nostra matriu amb
un valor absolut més gran (per tant més diferent al nostre objectiu, el zero). La fila i
columna on es trobi aquest element determinarà el valor de p i q de la matriu de rotació,
mentre que l’eq (7) ens donarà l’angle tal que fa que l’element target s’anul·li en fer la
transformació.
Malauradament, quan es fa un transformació com la de l’eq (4), no només l’element Apq
canvia sinó que tots els elements de les files i columnes p i q també canvien. Per tant,
no podem esperar que amb un nombre determinat de transformacions aconseguim
diagonalitzar la matriu, excepte en el cas trivial d’una matriu 2x2. De tota manera, es
pot demostrar que aconseguirem el nostre objectiu si en cada iteració realitzem la
transformació de manera que anul·lem l’element més gran fora de la diagonal, i per tant
això és el que farem.
Per dur a terme la transfomació de l’eq (4) en cada iteració cal fer un producte matricial
de tres matrius. Tot i això, donada la simplicitat de les matrius de rotació, és més fàcil
determinar de quina manera canvien els elements de la matriu A desprès de la
transformació i introduir aquests canvis directament, en comptes de realitzar el producte
matricial. Amb un anàlisi anàleg al de les eq. (5) i (6) es troba que
qpiAAAA
AAAA
AAAAA
AAAAA
AA
iqipqiiq
iqippiip
pqqqppqqqq
pqqqpppppp
qppq
,cossin''
sincos''
2sinsin)('
2sinsin)('
0''
2
2
(10)
Per tant el que fem amb l’algorisme de Jacobi és recalcular els elements de la matriu A
que canvien en cada iteració (per tant, sobreescrivim la matriu original)
Finalment, hem vist que la matriu X es troba com a producte de les matrius de rotació
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
127
de cada transformació. Seria molt més eficient computacionalment el anar multiplicant
les matrius de rotació en cada iteració que no pas guardar-les totes i multiplicar-les al
final. Per tant, en cada iteració hauríem de fer el producte acumulatiu amb la nova
matriu. Però, tenint en compte l’estructura d’aquestes matrius, ens resulta encara més
eficient fer el mateix que amb la matriu A , és a dir, determinar quins elements de R1
canvien i de què manera quan es fes el producte X’ = R2 R1 i guardar-ho, per en la
següent iteració multiplicar-ho per R3 i així successivament
Es pot demostrar que si fem el producte X’ = R pq
() X, els únics elements diferents
entre les matrius X’ i X es troben a les fileres p i q i la seva relació és la següent
iXXX
XXX
iqipiq
iqipip
cossin'
sincos'
(11)
Només hem de vigilar amb la primera iteració, on la matriu X’ seria directament la
matriu R1. Tanmteix, podem fer servir l’eq. (11) en qualsevol cas si inicialitzem la
matriu X con a matriu identitat, I, ja que X = R1 I = R1.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
128
Per tant, el mètode de Jacobi es podria resumir amb l’algorisme següent
llegir matriu A
Inicialitzar matriu X a identitat
set toler
ilog=0
iter=0
do mentre (ilog=0)
trobar l’element maxim de fora de la diagonal (offdiag) i posició :fila p, columna q
if (offdiag>toler o maxim nombre d’iteracions exhaurit)
determinar l’angle de rotació
recalcular els nous elements de A (equacions 10)
Apq=Aqp=0
App, Aqq
Aip, Aiq ip,q
recalcular els elements de la matriu X (equacions 11)
Xip, Xiq
else
ilog=1
end if
iter = iter + 1
end do
escriure X i A
fi
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
129
Exemple 1:
Matriu topològica per a la molècula de ciclobutè:
0.0000 1.0000 0.0000 1.0000
1.0000 0.0000 1.0000 0.0000
0.0000 1.0000 0.0000 1.0000
1.0000 0.0000 1.0000 0.0000
Tolerància: 1.0e-6
Resultats:
Matriu després de la iteració 1:
-1.0000 0.0000 -0.7071 0.7071
0.0000 1.0000 0.7071 0.7071
-0.7071 0.7071 0.0000 1.0000
0.7071 0.7071 1.0000 0.0000
Iter 2
-1.0000 0.0000 -1.0000 0.0000
0.0000 1.0000 0.0000 1.0000
-1.0000 0.0000 -1.0000 0.0000
0.0000 1.0000 0.0000 1.0000
Iter 3
0.0000 0.0000 0.0000 0.0000
0.0000 1.0000 0.0000 1.0000
0.0000 0.0000 -2.0000 0.0000
0.0000 1.0000 0.0000 1.0000
Iter 4
0.0000 0.0000 0.0000 0.0000
0.0000 0.0000 0.0000 0.0000
0.0000 0.0000 -2.0000 0.0000
0.0000 0.0000 0.0000 2.0000
Matriu diagonal final:
0.0000 0.0000 0.0000 0.0000
0.0000 0.0000 0.0000 0.0000
0.0000 0.0000 -2.0000 0.0000
0.0000 0.0000 0.0000 2.0000
Matriu de vectors propis (X)
0.5000 0.5000 0.5000 0.5000
-0.5000 0.5000 -0.5000 0.5000
-0.5000 -0.5000 0.5000 0.5000
0.5000 -0.5000 -0.5000 0.5000
Error: (Element més gran de fora de la diagonal) 5.55E-17
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
130
Exemple 2:
Matriu topològica per a la molècula de benzè:
0.0000 1.0000 0.0000 0.0000 0.0000 1.0000
1.0000 0.0000 1.0000 0.0000 0.0000 0.0000
0.0000 1.0000 0.0000 1.0000 0.0000 0.0000
0.0000 0.0000 1.0000 0.0000 1.0000 0.0000
0.0000 0.0000 0.0000 1.0000 0.0000 1.0000
1.0000 0.0000 0.0000 0.0000 1.0000 0.0000
Tolerància: 1.0e-6
Matriu diagonal final (després de 32 iteracions):
-1.0000 0.0000 0.0000 0.0000 0.0000 0.0000
0.0000 1.0000 0.0000 0.0000 0.0000 0.0000
0.0000 0.0000 -2.0000 0.0000 0.0000 0.0000
0.0000 0.0000 0.0000 1.0000 0.0000 0.0000
0.0000 0.0000 0.0000 0.0000 -1.0000 0.0000
0.0000 0.0000 0.0000 0.0000 0.0000 2.0000
Matriu de vectors propis (X)
0.5136 0.5026 0.4082 -0.2841 0.2638 0.4082
-0.4852 0.4974 -0.4082 0.2932 0.3129 0.4082
-0.0284 -0.0053 0.4082 0.5773 -0.5767 0.4082
0.5136 -0.5026 -0.4082 0.2841 0.2638 0.4082
-0.4852 -0.4974 0.4082 -0.2932 0.3129 0.4082
-0.0284 0.0053 -0.4082 -0.5773 -0.5767 0.4082
Error: (Element més gran de fora de la diagonal) 9.7 E-7
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
131
Altres consideracions:
Cal tenir en compte que els valors propis d’una matriu són únics (tot i que poden ser
degenerats), però la matriu no és única ja que els valors propis es poden ordenar de
manera arbitrària a la diagonal principal. Per tant, hom pot arribar a una matriu diagonal
diferent a les que aquí es donen, però només pel que fa a l’ordre de les columnes. Tot i
això, si les columnes de la matriu diagonal es troben en un altre ordre, el mateix ha de
ser amb les columnes de la matriu de vectors propis.
Un altre factor a tenir en compte és que, com hem vist en la secció 1, els vectors propis
associat s a valors propis iguals (degenerats) no estan definits de manera única, de
manera que qualsevol combinació lineal entre vectors propis associats a un mateix valor
propi degenerat són també vectors propis vàlids.
Aplicat a l’exemple anterior de la matriu topològica del benzè això vol dir que podríem
substituir les columnes 2 i 4 de la matriu X per qualsevol combinació lineal entre elles
(sempre i quan els dos vectors columna finals siguin linealment independents). El
mateix succeeix per les columnes 1 i 5 de la mateixa matriu o per les columnes 1 i 2 de
la matriu X de l’exemple 1.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
132
9.4. Aplicacions de la diagonalització de matrius quadrades
simètriques
Ja hem vist que, si tenim una matriu quadrada (NN) i simètrica A, i resolem l’equació
secular següent
XAX (1)
podem escriure l’eq (1) com
TXXA (2)
on X és una matriu unitària (tal que XT
= X-1
) i és una matriu diagonal.
Ara veurem com el fet de poder expressar la nostra matriu original A en funció de les
matrius X i ens permetrà determinar-ne fàcilment la seva matriu inversa, determinant,
etc...
Determinant d’una matriu
Calcular el determinat d’una matriu de manera directa és força costos a més de
relativament difícil d’implementar. Tanmateix, tenint en compte que
)Bdet()Adet()ABdet( (3)
i si fem servir l’eq (2) i el fet que la matriu X és unitària tenim
)det()det()Idet(
)det()XXdet()det()Xdet()Xdet(
)Xdet()det()Xdet()Adet(
TT
T
(3)
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
133
Per tant, El determinat de la nostra matriu original A és igual que el de la matriu
diagonal . Però en el cas d’una matriu diagonal el determinat és trivial
i
iN...)det( 21 (5)
És a dir, el determinant és simplement el productori dels valors propis de la matriu.
En el cas que la matriu no sigui simètrica, podem determinar de manera similar el valor
absolut del seu determinant. Primer de tot, definim una nova matriu S així
AAS T (6)
Es pot demostrar fàcilment que aquesta nova matriu és simètrica. Per tant, es
diagonalitzable i llavors
ZSZ , o bé
TZZS
(7)
on Z és una matriu unitària i una matriu diagonal. Aleshores tenim que, donat que el
determinat d’una matriu i el de la seva transposta són equivalents (intercanviar files per
columnes no afecta el determinant) i aplicant l’eq. (3)
2)Adet()Adet()Adet()det()Sdet( T (8)
i per tant
)Sdet()Adet( (9)
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
134
Matriu Inversa
En aquest cas podem trobar la matriu inversa d’una matriu simètrica quadrada utilitzant
la relació (2). Tenim
TTT XXXX)XX(A 11111 (10)
on hem fet servir les propietats de la inversa del producte de matrius.
Per tant, si sabéssim la inversa de la matriu diagonal , podríem determinar igualment
la inversa de A fent el producte matricial TXX 1 . Tot i que pot semblar més
complicat, el càlcul de la matriu inversa d’una matriu diagonal és trivial. Es pot veure
fàcilment que la inversa d’una matriu diagonal és també una matriu diagonal a on els
elements de la diagonal no son més que la inversa dels elements de la diagonal de la
matriu original, és a dir ,
kk
kk
11
(11)
Així, l’expressió pels elements de la matriu inversa queda simplement
k kk
jkik
k
kj
T
kkik
k l
lj
T
klikij
XX
XXXXA 111
(12)
A partir de l’equació anterior veiem que una condició per a què una matriu sigui
invertible (no singular) és que tots el valors propis de la matriu siguin diferent de
zero.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
135
Potències d’una matriu
La diagonalització ens simplifica molt el càlcul de les potències de matrius. Per
exemple, anem a veure com determinar el quadrat de A. Aplicant l’eq. (2) tenim
T
T
I
TTT
XX
X)XX(X)XX)(XX(AAA
2
2
(13)
Per tant només cal determinar el quadrat de la matriu diagonal. Un altre cop, donada la
forma de la matriu diagonal el càlcul és immediat
22
2 0
iiiiii
k
kiikii
ijii
k
kjikij
(14)
Com es pot veure a l’expressió anterior, el quadrat d’una matriu diagonal és també
una matriu diagonal, on els elements de la diagonal són els quadrats dels elements de la
matriu original.
En el cas d’una potència qualsevol k
TkT
I
T
I
T
TTTk
XXX...)XX()XX(X
)XX)...(XX)(XX(A...AAA
(15)
on els elements de la matriu k és calculen simplement a partir dels elements de la
matriu diagonal
kiiii
k (16)
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
136
De fet, la diagonalització permet determinar no només potències de matrius sinó
qualsevol funció en general d’una matriu.
Per exemple, podem fer la exponencial d’una matriu A com
TA XXee (17)
essent la matriu e una matriu diagonal amb elements
iiee ii
(18)
Aplicacions avançades: Ortonormalització d’una base de vectors
Suposem que tenim un conjunt de N vectors linealment independents de dimensió N.
Amb aquests podem formar una matriu quadrada on les columnes de la matriu siguin
cadascun dels vectors.
)x...xx(X N21 (19)
Aquest conjunt de vectors (base) seria ortonormal si es complís que
jixx
ixx
j
T
i
i
T
i
0
1
(20)
és a dir que el producte escalar entre dos vectors diferents fos zero, i la norma de cada
vector fos la unitat. En forma matricial això equival a que es compleixi10
IXX T (21)
Suposem, però, que en un cas general, el nostre conjunt de vectors no és ortonormal.
10
Per tant podem dir que una base és ortonormal si la matriu dels vectors és unitària
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
137
Llavors tindríem
ISXX T (22)
on S rep el nom de matriu de la mètrica, i conté tots el productes escalars entre els
vectors. La pregunta és, com podem aconseguir un conjunt ortonormalitzat de vectors a
partir del conjunt que disposem? És a dir, com podem trobar un conjunt de vectors que
la seva matriu de la mètrica sigui la matriu identitat?
Anem a veure-ho. Primer definim una altra matriu transformada, Z, com
21 XSZ (23)
utilitzant la matriu21S (arrel quadrada de la matriu de la mètrica S).
Comprovem ara que la nova matriu Z conte vectors ortonormals en columnes
2121
21212121
SSS
XSXSXSXSZZ
T
TTTT
(24)
La matriu S, per construcció, és simètrica i per tant serà diagonalitzable. Podem
expressar tant S com 21S (una potència de S) com
T
T
UUS
UUSUSU
2121 (25)
i llavors substituint en (24) tenim
IUUUUUUUUUU
UUUUUUSSSZZ
TT
I
T
I
T
I
T
TTTTTT
21212121
21212121
(26)
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
138
on hem fet servir el fet que la transposada d’una matriu diagonal és ella mateixa i que
els elements del producte de matrius diagonals és el producte dels elements de la
diagonal de les respectives matrius.
Hem demostrat que la matriu Z conté vectors ortonormals, que és el que buscàvem. Així
doncs, per ortogonalitzar el nostre conjunts de vector inicial, X, només cal multiplicar la
matriu per la dreta per l’arrel quadrada de la matriu de la mètrica del conjunt de vectors
inicial
Tiótransfomac UUXXSZX 2121 (27)
i aquesta darrera la podem trobar a partir la diagonalització de la matriu de la mètrica.
Aquest procés rep el nom de ortogonalització de Löwdin i ´s’utilitza freqüentment en el
camp de la Química Quàntica.
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
139
Bibliografia
Press, Teukolsky,Vetterling, Flannerry, (1986,1992), “Numerical Recipes in
FORTRAN, the art of Scientific Computing”, Cambridge University Press
G. J. Borse (1989), “Programacion en FORTRAN77, con aplicaciones de calculo
numerico en ciencias e ingenieria”, Anaya Eds, Madrid
“Lahey FORTRAN90 Language Reference”, (1994), Lahey Computer Systems.
David M. Young, Robert T. Gregory (1972), “ A survey of Numerical
Mathematics”, Dover Publications, New York
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
140
PROGRAM GENPRIMO
LOGICAL ilog
WRITE(*,*) 'Calcul dels primers nombres primers. Quants en vol?'
READ(*,*) nprim
WRITE(*,*) 'Per definició, 1 es primer'
iprim=1
N=2
do WHILE(iprim.LE.nprim)
ilog=.true.
i=2
NN=SQRT(1.0*N)
do WHILE(ilog.AND.i.LE.NN)
j=N/i
ir=N-(i*j)
IF(ir.EQ.0) then
ilog=.false.
END if
i=i+1
end do
IF(ilog) then
WRITE(*,*) N,' es primer'
iprim=iprim+1
END if
N=N+1
end do
end
Aquest programa ens demana quants nombres primers es volen obtenir (nprim) i,
començant a partir del 2, comprova un a un si un nombre (N) és primer. En cas
afirmatiu, ho escriu per pantalla. Finalment, quant hagi trobat el nombre de números
primers desitjat, acaba.
Si li demanem que ens trobi els 100 primers nombres, el programa ho escriurà tan ràpid
per pantalla que no podrem veure els primers. A més, un cop tanquem la finestra on
treballem, perdrem aquesta llista.
La solució és escriure el llistat de nombres primers en un fitxer nou que el programa
generarà. Per fer això només cal fer el següent:
Mètodes Matemàtics Aplicats a la Química, Pedro Salvador
141
PROGRAM GENPRIMO
logical ilog
WRITE(*,*) 'Calcul dels primers nombres primers. Quants en vol?'
READ(*,*) nprim
OPEN(1,file=”genprimo.out”)
WRITE(1,*) 'Per definicio, 1 es primer'
iprim=1
N = 2
do WHILE(iprim.LE.nprim)
ilog = .true.
i=2
NN = DSQRT(real(N))
do WHILE(ilog.AND.i.LE.NN)
j = N/i
ir = N-(i*j)
IF(ir.EQ.0) then
ilog=.false.
END if
i=i+1
end do
IF(ilog) then
WRITE(1,*) N,' es primer'
iprim=iprim+1
END if
N=N+1
end do
end
De tal manera que, ara, si demanem al programa els 10 primers nombres, no escriurà res
en pantalla sinó que generarà un fitxer de text anomenat genprimo.out al directori de
treball que contindrà el següent
Per definicio, 1 es primer
2 es primer
3 es primer
5 es primer
7 es primer
11 es primer
13 es primer
17 es primer
19 es primer
23 es primer
29 es primer