Els mètodes numèrics són tècniques matemàtiques utilitzades per resoldre problemes que no es poden abordar fàcilment amb mètodes analítics. En aquest mòdul, aprendrem com implementar alguns dels mètodes numèrics més comuns utilitzant Fortran.
Contingut del Tema
- Introducció als Mètodes Numèrics
- Resolució d'Equacions No Lineals
- Integració Numèrica
- Diferenciació Numèrica
- Resolució de Sistemes d'Equacions Lineals
- Interpolació i Aproximació de Funcions
- Exercicis Pràctics
- Introducció als Mètodes Numèrics
Els mètodes numèrics són essencials en la ciència i l'enginyeria per resoldre problemes complexos. Aquests mètodes inclouen tècniques per a la resolució d'equacions, integració, diferenciació, i més.
Conceptes Clau
- Precisió i Error: La precisió es refereix a la proximitat dels resultats numèrics als valors reals. L'error és la diferència entre el valor calculat i el valor real.
- Estabilitat: Un mètode numèric és estable si els errors no creixen de manera descontrolada durant els càlculs.
- Convergència: Un mètode numèric convergeix si els resultats s'aproximen al valor real a mesura que es refina el càlcul.
- Resolució d'Equacions No Lineals
Mètode de la Bisecció
El mètode de la bisecció és una tècnica iterativa per trobar les arrels d'una funció contínua. Es basa en el teorema de Bolzano, que afirma que si una funció contínua canvia de signe en un interval, aleshores té almenys una arrel en aquest interval.
Exemple de Codi
program bisection_method implicit none real(8) :: a, b, c, tol, fa, fb, fc integer :: max_iter, iter ! Definim la funció interface real(8) function f(x) real(8), intent(in) :: x end function f end interface ! Inicialitzem els valors a = 1.0 b = 2.0 tol = 1.0e-6 max_iter = 100 fa = f(a) fb = f(b) if (fa * fb > 0.0) then print *, "La funció no canvia de signe en l'interval donat." stop end if iter = 0 do while (abs(b - a) > tol .and. iter < max_iter) c = (a + b) / 2.0 fc = f(c) if (fc == 0.0) exit if (fa * fc < 0.0) then b = c fb = fc else a = c fa = fc end if iter = iter + 1 end do if (iter == max_iter) then print *, "El mètode no ha convergit en", max_iter, "iteracions." else print *, "L'arrel és aproximadament:", c end if contains real(8) function f(x) real(8), intent(in) :: x f = x**3 - x - 2.0 end function f end program bisection_method
Explicació del Codi
- Definició de la Funció: La funció
f(x)
està definida dins del bloccontains
. - Inicialització: Els valors inicials
a
ib
defineixen l'interval on busquem l'arrel.tol
és la tolerància per a la precisió de l'arrel. - Iteració: El bucle
do while
continua fins que la diferència entrea
ib
és menor quetol
o s'assoleix el nombre màxim d'iteracions. - Actualització de l'Interval: En cada iteració, l'interval es redueix a la meitat, mantenint l'interval on la funció canvia de signe.
- Integració Numèrica
Mètode del Trapezi
El mètode del trapezi és una tècnica per aproximar la integral d'una funció dividint l'àrea sota la corba en trapezis.
Exemple de Codi
program trapezoidal_rule implicit none real(8) :: a, b, h, integral integer :: n, i ! Definim la funció interface real(8) function f(x) real(8), intent(in) :: x end function f end interface ! Inicialitzem els valors a = 0.0 b = 1.0 n = 100 h = (b - a) / n integral = 0.5 * (f(a) + f(b)) do i = 1, n-1 integral = integral + f(a + i * h) end do integral = integral * h print *, "El valor aproximat de la integral és:", integral contains real(8) function f(x) real(8), intent(in) :: x f = x**2 end function f end program trapezoidal_rule
Explicació del Codi
- Definició de la Funció: La funció
f(x)
està definida dins del bloccontains
. - Inicialització: Els valors
a
ib
defineixen els límits d'integració.n
és el nombre de subdivisions. - Càlcul de la Integral: La integral es calcula sumant les àrees dels trapezis.
- Diferenciació Numèrica
Mètode de Diferències Finies
El mètode de diferències finies s'utilitza per aproximar la derivada d'una funció.
Exemple de Codi
program finite_difference implicit none real(8) :: x, h, derivative ! Definim la funció interface real(8) function f(x) real(8), intent(in) :: x end function f end interface ! Inicialitzem els valors x = 1.0 h = 1.0e-5 derivative = (f(x + h) - f(x - h)) / (2.0 * h) print *, "La derivada aproximada en x =", x, "és:", derivative contains real(8) function f(x) real(8), intent(in) :: x f = x**2 end function f end program finite_difference
Explicació del Codi
- Definició de la Funció: La funció
f(x)
està definida dins del bloccontains
. - Càlcul de la Derivada: La derivada es calcula utilitzant la fórmula de diferències centrades.
- Resolució de Sistemes d'Equacions Lineals
Mètode de Gauss
El mètode de Gauss és una tècnica per resoldre sistemes d'equacions lineals utilitzant eliminació.
Exemple de Codi
program gauss_elimination implicit none real(8), dimension(3,3) :: A real(8), dimension(3) :: b, x integer :: i, j, k real(8) :: factor ! Inicialitzem la matriu A i el vector b A = reshape([2.0, -1.0, 1.0, 3.0, 3.0, 9.0, 3.0, 3.0, 5.0], [3,3]) b = [1.0, 0.0, 4.0] ! Eliminació de Gauss do k = 1, 2 do i = k+1, 3 factor = A(i,k) / A(k,k) A(i,k:3) = A(i,k:3) - factor * A(k,k:3) b(i) = b(i) - factor * b(k) end do end do ! Substitució cap enrere x(3) = b(3) / A(3,3) do i = 2, 1, -1 x(i) = (b(i) - sum(A(i,i+1:3) * x(i+1:3))) / A(i,i) end do print *, "La solució del sistema és:", x end program gauss_elimination
Explicació del Codi
- Inicialització: La matriu
A
i el vectorb
defineixen el sistema d'equacions. - Eliminació de Gauss: Es transforma la matriu
A
en una matriu triangular superior. - Substitució Cap Enrere: Es resol el sistema triangular superior per obtenir la solució
x
.
- Interpolació i Aproximació de Funcions
Interpolació de Lagrange
L'interpolació de Lagrange és una tècnica per trobar un polinomi que passi per un conjunt de punts donats.
Exemple de Codi
program lagrange_interpolation implicit none real(8), dimension(3) :: x, y real(8) :: xp, yp integer :: i, j real(8) :: L ! Inicialitzem els punts x = [0.0, 1.0, 2.0] y = [1.0, 2.0, 0.0] ! Punt a interpolar xp = 1.5 yp = 0.0 ! Interpolació de Lagrange do i = 1, 3 L = 1.0 do j = 1, 3 if (i /= j) then L = L * (xp - x(j)) / (x(i) - x(j)) end if end do yp = yp + L * y(i) end do print *, "El valor interpolat en x =", xp, "és:", yp end program lagrange_interpolation
Explicació del Codi
- Inicialització: Els vectors
x
iy
defineixen els punts coneguts. - Interpolació de Lagrange: Es calcula el polinomi interpolador i s'avalua en el punt
xp
.
- Exercicis Pràctics
Exercici 1: Resolució d'Equacions No Lineals
Implementa el mètode de Newton-Raphson per trobar l'arrel de la funció f(x) = x^3 - 2x - 5
.
Exercici 2: Integració Numèrica
Utilitza el mètode de Simpson per aproximar la integral de la funció f(x) = sin(x)
en l'interval [0, π]
.
Exercici 3: Diferenciació Numèrica
Implementa el mètode de diferències finies avançades per calcular la derivada de la funció f(x) = e^x
en el punt x = 1
.
Exercici 4: Resolució de Sistemes d'Equacions Lineals
Utilitza el mètode de Gauss-Jordan per resoldre el sistema d'equacions lineals:
Exercici 5: Interpolació i Aproximació de Funcions
Implementa l'interpolació de Newton per trobar el polinomi interpolador per als punts (0, 1)
, (1, 3)
, (2, 2)
.
Conclusió
En aquest tema, hem explorat diversos mètodes numèrics i com implementar-los en Fortran. Aquests mètodes són fonamentals per resoldre problemes complexos en ciència i enginyeria. Els exercicis pràctics proporcionats t'ajudaran a consolidar els conceptes apresos i a desenvolupar habilitats en la programació numèrica amb Fortran.
Curs de Programació en Fortran
Mòdul 1: Introducció a Fortran
- Introducció a Fortran
- Configuració de l'Entorn de Desenvolupament
- Sintaxi i Estructura Bàsiques
- Escrivint el teu Primer Programa en Fortran
Mòdul 2: Conceptes Bàsics
- Variables i Tipus de Dades
- Operadors i Expressions
- Entrada i Sortida
- Estructures de Control: Sentències If
- Estructures de Control: Bucles
Mòdul 3: Arrays i Cadenes
Mòdul 4: Procediments i Funcions
Mòdul 5: Estructures de Dades Avançades
Mòdul 6: Gestió de Fitxers
Mòdul 7: Temes Avançats
Mòdul 8: Millors Pràctiques i Optimització
- Tècniques d'Optimització de Codi
- Depuració i Perfilat
- Escrivint Codi Mantenible
- Estàndards i Portabilitat de Fortran