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

  1. Introducció als Mètodes Numèrics
  2. Resolució d'Equacions No Lineals
  3. Integració Numèrica
  4. Diferenciació Numèrica
  5. Resolució de Sistemes d'Equacions Lineals
  6. Interpolació i Aproximació de Funcions
  7. Exercicis Pràctics

  1. 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.

  1. 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

  1. Definició de la Funció: La funció f(x) està definida dins del bloc contains.
  2. Inicialització: Els valors inicials a i b defineixen l'interval on busquem l'arrel. tol és la tolerància per a la precisió de l'arrel.
  3. Iteració: El bucle do while continua fins que la diferència entre a i b és menor que tol o s'assoleix el nombre màxim d'iteracions.
  4. Actualització de l'Interval: En cada iteració, l'interval es redueix a la meitat, mantenint l'interval on la funció canvia de signe.

  1. 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

  1. Definició de la Funció: La funció f(x) està definida dins del bloc contains.
  2. Inicialització: Els valors a i b defineixen els límits d'integració. n és el nombre de subdivisions.
  3. Càlcul de la Integral: La integral es calcula sumant les àrees dels trapezis.

  1. 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

  1. Definició de la Funció: La funció f(x) està definida dins del bloc contains.
  2. Càlcul de la Derivada: La derivada es calcula utilitzant la fórmula de diferències centrades.

  1. 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

  1. Inicialització: La matriu A i el vector b defineixen el sistema d'equacions.
  2. Eliminació de Gauss: Es transforma la matriu A en una matriu triangular superior.
  3. Substitució Cap Enrere: Es resol el sistema triangular superior per obtenir la solució x.

  1. 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

  1. Inicialització: Els vectors x i y defineixen els punts coneguts.
  2. Interpolació de Lagrange: Es calcula el polinomi interpolador i s'avalua en el punt xp.

  1. 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:

2x + y - z = 8
-3x - y + 2z = -11
-2x + y + 2z = -3

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.

© Copyright 2024. Tots els drets reservats