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_methodExplicació del Codi
- Definició de la Funció: La funció
f(x)està definida dins del bloccontains. - Inicialització: Els valors inicials
aibdefineixen l'interval on busquem l'arrel.tolés la tolerància per a la precisió de l'arrel. - Iteració: El bucle
do whilecontinua fins que la diferència entreaibés menor quetolo 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_ruleExplicació del Codi
- Definició de la Funció: La funció
f(x)està definida dins del bloccontains. - Inicialització: Els valors
aibdefineixen 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_differenceExplicació 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_eliminationExplicació del Codi
- Inicialització: La matriu
Ai el vectorbdefineixen el sistema d'equacions. - Eliminació de Gauss: Es transforma la matriu
Aen 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_interpolationExplicació del Codi
- Inicialització: Els vectors
xiydefineixen 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
