Els mètodes numèrics són tècniques utilitzades per resoldre problemes matemàtics que són difícils o impossibles de resoldre analíticament. En aquest tema, explorarem com implementar alguns dels mètodes numèrics més comuns utilitzant ALGOL.
Continguts
- Introducció als Mètodes Numèrics
- Mètode de la Bisecció
- Mètode de Newton-Raphson
- Integració Numèrica: Regla del Trapezi
- Diferenciació Numèrica
- Exercicis Pràctics
- Introducció als Mètodes Numèrics
Els mètodes numèrics són essencials en la programació científica i l'enginyeria. Aquests mètodes permeten aproximar solucions a problemes complexos mitjançant càlculs iteratius.
Conceptes Clau
- Iteració: Repetició d'un conjunt de càlculs fins a obtenir una solució aproximada.
- Convergència: Propietat d'un mètode numèric que assegura que les iteracions s'acosten a la solució real.
- Error: Diferència entre la solució aproximada i la solució exacta.
- Mètode de la Bisecció
El mètode de la bisecció és una tècnica 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.
Algorisme
- Triar un interval \([a, b]\) tal que \(f(a) \cdot f(b) < 0\).
- Calcular el punt mig \(c = \frac{a + b}{2}\).
- Si \(f(c) = 0\) o l'interval és prou petit, \(c\) és l'arrel.
- Si \(f(a) \cdot f(c) < 0\), llavors l'arrel està en \([a, c]\); en cas contrari, està en \([c, b]\).
- Repetir els passos 2-4 fins a la convergència.
Exemple en ALGOL
begin real procedure f(x); value x; real x; f := x * x - 2; ! Funció: f(x) = x^2 - 2 real procedure bisection(a, b, tol); value a, b, tol; real a, b, tol; real c; while abs(b - a) > tol do begin c := (a + b) / 2; if f(c) = 0 then return c; else if f(a) * f(c) < 0 then b := c; else a := c; end; return (a + b) / 2; end; real a, b, tol, root; a := 0; b := 2; tol := 0.0001; root := bisection(a, b, tol); print("L'arrel aproximada és: ", root); end;
- Mètode de Newton-Raphson
El mètode de Newton-Raphson és una tècnica iterativa per trobar les arrels d'una funció. Utilitza la derivada de la funció per millorar les aproximacions successives.
Algorisme
- Triar una aproximació inicial \(x_0\).
- Calcular la següent aproximació: \(x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)}\).
- Repetir el pas 2 fins a la convergència.
Exemple en ALGOL
begin real procedure f(x); value x; real x; f := x * x - 2; ! Funció: f(x) = x^2 - 2 real procedure df(x); value x; real x; df := 2 * x; ! Derivada: f'(x) = 2x real procedure newton_raphson(x0, tol); value x0, tol; real x0, tol; real x1; while abs(f(x0)) > tol do begin x1 := x0 - f(x0) / df(x0); x0 := x1; end; return x0; end; real x0, tol, root; x0 := 1; tol := 0.0001; root := newton_raphson(x0, tol); print("L'arrel aproximada és: ", root); end;
- Integració Numèrica: Regla del Trapezi
La regla del trapezi és una tècnica per aproximar la integral d'una funció contínua dividint l'àrea sota la corba en trapezis.
Algorisme
- Dividir l'interval \([a, b]\) en \(n\) subintervals de longitud \(h = \frac{b - a}{n}\).
- Calcular la suma de les àrees dels trapezis.
Exemple en ALGOL
begin real procedure f(x); value x; real x; f := x * x; ! Funció: f(x) = x^2 real procedure trapezoidal(a, b, n); value a, b, n; real a, b; integer n; real h, sum; integer i; h := (b - a) / n; sum := (f(a) + f(b)) / 2; for i := 1 step 1 until n - 1 do sum := sum + f(a + i * h); return h * sum; end; real a, b, result; integer n; a := 0; b := 1; n := 100; result := trapezoidal(a, b, n); print("L'aproximació de la integral és: ", result); end;
- Diferenciació Numèrica
La diferenciació numèrica és una tècnica per aproximar la derivada d'una funció utilitzant diferències finites.
Algorisme
- Utilitzar la fórmula de la diferència finita: \(f'(x) \approx \frac{f(x + h) - f(x)}{h}\).
Exemple en ALGOL
begin real procedure f(x); value x; real x; f := x * x; ! Funció: f(x) = x^2 real procedure differentiate(x, h); value x, h; real x, h; return (f(x + h) - f(x)) / h; end; real x, h, derivative; x := 1; h := 0.0001; derivative := differentiate(x, h); print("L'aproximació de la derivada és: ", derivative); end;
- Exercicis Pràctics
Exercici 1: Mètode de la Bisecció
Implementa el mètode de la bisecció per trobar l'arrel de la funció \(f(x) = x^3 - 4x + 1\) en l'interval \([0, 2]\) amb una tolerància de \(0.0001\).
Exercici 2: Mètode de Newton-Raphson
Implementa el mètode de Newton-Raphson per trobar l'arrel de la funció \(f(x) = e^x - 3x\) amb una aproximació inicial de \(x_0 = 1\) i una tolerància de \(0.0001\).
Exercici 3: Integració Numèrica
Utilitza la regla del trapezi per aproximar la integral de la funció \(f(x) = \sin(x)\) en l'interval \([0, \pi]\) amb \(n = 100\) subintervals.
Exercici 4: Diferenciació Numèrica
Implementa una funció per calcular la derivada numèrica de \(f(x) = \ln(x)\) en el punt \(x = 2\) amb \(h = 0.0001\).
Solucions
Solució a l'Exercici 1
begin real procedure f(x); value x; real x; f := x * x * x - 4 * x + 1; ! Funció: f(x) = x^3 - 4x + 1 real procedure bisection(a, b, tol); value a, b, tol; real a, b, tol; real c; while abs(b - a) > tol do begin c := (a + b) / 2; if f(c) = 0 then return c; else if f(a) * f(c) < 0 then b := c; else a := c; end; return (a + b) / 2; end; real a, b, tol, root; a := 0; b := 2; tol := 0.0001; root := bisection(a, b, tol); print("L'arrel aproximada és: ", root); end;
Solució a l'Exercici 2
begin real procedure f(x); value x; real x; f := exp(x) - 3 * x; ! Funció: f(x) = e^x - 3x real procedure df(x); value x; real x; df := exp(x) - 3; ! Derivada: f'(x) = e^x - 3 real procedure newton_raphson(x0, tol); value x0, tol; real x0, tol; real x1; while abs(f(x0)) > tol do begin x1 := x0 - f(x0) / df(x0); x0 := x1; end; return x0; end; real x0, tol, root; x0 := 1; tol := 0.0001; root := newton_raphson(x0, tol); print("L'arrel aproximada és: ", root); end;
Solució a l'Exercici 3
begin real procedure f(x); value x; real x; f := sin(x); ! Funció: f(x) = sin(x) real procedure trapezoidal(a, b, n); value a, b, n; real a, b; integer n; real h, sum; integer i; h := (b - a) / n; sum := (f(a) + f(b)) / 2; for i := 1 step 1 until n - 1 do sum := sum + f(a + i * h); return h * sum; end; real a, b, result; integer n; a := 0; b := 3.141592653589793; ! Valor aproximat de π n := 100; result := trapezoidal(a, b, n); print("L'aproximació de la integral és: ", result); end;
Solució a l'Exercici 4
begin real procedure f(x); value x; real x; f := ln(x); ! Funció: f(x) = ln(x) real procedure differentiate(x, h); value x, h; real x, h; return (f(x + h) - f(x)) / h; end; real x, h, derivative; x := 2; h := 0.0001; derivative := differentiate(x, h); print("L'aproximació de la derivada és: ", derivative); end;
Conclusió
En aquest tema, hem explorat diversos mètodes numèrics i com implementar-los en ALGOL. Hem après a trobar arrels de funcions, integrar i diferenciar numèricament. Aquests mètodes són fonamentals per a la resolució de problemes complexos en la programació científica i l'enginyeria. Els exercicis pràctics proporcionats ajuden a consolidar els conceptes apresos i a desenvolupar habilitats de programació en ALGOL.
Curs de Programació en ALGOL
Mòdul 1: Introducció a ALGOL
Mòdul 2: Sintaxi i Estructura Bàsica
- Estructura del Programa ALGOL
- Variables i Tipus de Dades
- Entrada i Sortida Bàsica
- Operadors i Expressions
Mòdul 3: Estructures de Control
Mòdul 4: Funcions i Procediments
- Definició de Funcions
- Paràmetres de Funció i Valors de Retorn
- Funcions Recursives
- Procediments en ALGOL
Mòdul 5: Estructures de Dades
Mòdul 6: Temes Avançats
Mòdul 7: Aplicacions Pràctiques
- Mètodes Numèrics
- Implementació d'Algorismes
- Construcció d'un Compilador Simple
- Estudis de Cas i Projectes