UNJBG – ESIC CALCULO NÚMERICO
MONOGRAFIA DE METODOS NUMERICOS METODO DE LA BISECCION En matemática, matemática, el e l método de bisección es un algoritmo algoritmo de búsqueda búsqueda de raíces que trabaja trabaja dividiendo dividiendo el intervalo a la mitad y seleccionando el subintervalo que tiene la raíz. Supóngase que queremos resolver la ecuación f ( x x ) = 0 (donde f es continua. continua. Dados dos puntos a y b tal que f (a) y f (b) tengan signos distintos, sabemos por el Teorema de Bolzano que f debe tener, al menos, una raíz en el intervalo [a, b]. El método de bisección divide el intervalo en dos, usando un tercer punto c = (a+b) / 2. En este momento, existen dos posibilidades: f (a) y f (c ), ), ó f (c ) y f (b) tienen distinto signo. El algoritmo de bisección se aplica al subintervalo donde el cambio de signo ocurre. El método de bisección bisección es menos eficiente que el método de Newton, pero es mucho más seguro asegurar la convergencia. Si f es una función continua en el intervalo [a, b] y f (a)f (b) < 0, entonces este método converge a la raíz de f . De hecho, una cota del error absoluto es:
En la n ésima iteración. La bisección converge converge linealmente linealmente,, por lo cual es un poco lento. Sin embargo, se garantiza la convergencia si f(a) y f(b) tienen distinto signo.
Unas cuantas iteraciones del método de bisección aplicadas en un intervalo [a1;b1]. El punto rojo es la raíz de la función.
DOC. LIC. LIC. JAVIER LOZANO
-1-
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO
DIAGRAMA DE FLUJO:
INICIO
LEER f(X),a,b,E F
V f(a)*f(b)<0
lb - al>E ESCRIBIR No existe raiz
x=(a+b)/2 v
F
f(x)=0 f(a)*f(x)<0
a=b b=x
a=x
ESCRIBIR X
FIN
DOC. LIC. LIC. JAVIER LOZANO
-2-
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO
PROGRAMACION DEL METODO: GUIDE:
DOC. LIC. LIC. JAVIER LOZANO
-3-
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO
CODIFICACION: function pushbutton1_Callback(hObject, eventdata, handles) % $$$$$____CODIFICACION DEL METODO DE BISECCION ____$$$$$$ f=inline(get(handles.edit1,'string')); a=str2double(get(handles.edit2,'string')); b=str2double(get(handles.edit3,'string')); E=str2double(get(handles.edit4,'string')); if f(a)*f(b)<0 while abs(b-a)>E x=(a+b)/2; if f(a)*f(x)==0 a=b; else if f(a)*f(x)<0 b=x; else a=x; end end end else set(handles.edit5,'string','No existe Raiz') end set(handles.edit5,'string',x)
function pushbutton2_Callback(hObject, eventdata, handles) figure(1) f=inline(get(handles.edit1,'string')); ezplot(f);grid on
function pushbutton3_Callback(hObject, eventdata, handles) close(biseccion)
DOC. LIC. LIC. JAVIER LOZANO
-4-
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO
MÉTODO DEL PUNTO FIJO. Este método aunque no es el mas sencillo, sencillo, ni el mas rápido, es útil ya que es la base de los demás métodos. métodos. Básicamente Básicamente se da un valor y este se evalúa en una función previamente previamente calculada calculada (llamada (llamada también también función equivalente). Después en base al resultado obtenido se busca el error mediante
/xi – x1 + 1/<=E Si esto se cumple se encontró la raíz si no, se evalúa el nuevo valor en la función equivalente así hasta llegar al error. Este método funciona de la siguiente manera: Algoritmo 1.- Dada una función f(x) se localiza su equivalente. 2.- Después se asigna un valor inicial que es x0. 3.- Se asigna un valor de error (están pequeño como lo quiera el usuario). 4.- Se sustituye x0 en la función equivalente. Ese valor es x1 y se compara con el error deseado. Si el error que se calculo es igual o menor al que dio el usuario se encontró la raíz.
El método del punto fijo fijo se basa en que una raíz de la ecuación f ( x ) = 0 será un punto fijo de la ecuación g ( x ) = x siempre que g ( x ) = x − f ( x ) o g ( x ) = x + f ( x ) . Podemos construir una sucesión que tienda al punto fijo de la ecuación g ( x ) = x , o lo que es lo mismo a la solución de la ecuación f ( x ) = 0 . Para ello ello consideramos consideramos la la sucesión:
x 0 dado x n = f ( x n −1 ) se n ≥ 1 Características El método presenta dos inconvenientes: La sucesión debe estar bien construida, es decir, cada término debe pertenecer al dominio de la función f ( x ) para poder calcular el término siguiente. La sucesión no siempre es convergente aunque esté bien construida
DOC. LIC. LIC. JAVIER LOZANO
-5-
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO Es interesante ver como para una misma función f ( x ) podemos tomar distintas funciones g ( x ) y el método puede ser convergente con una y no serlo con otras.
DIAGRAMA DE FLUJO:
INICIO
LEER f(x),g(x),X0,E
X1=g(X0)
lX1-X0l>E
F
V
X0=X1 X1=g(X)
ESCRIBIR X1
FIN
DOC. LIC. JAVIER LOZANO
-6-
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO
PROGRAMACION DEL METODO: GUIDE:
CODIFICACION: DOC. LIC. JAVIER LOZANO
-7-
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO function pushbutton1_Callback(hObject, eventdata, handles) f=inline(get(handles.edit1,'string')); g=inline(get(handles.edit2,'string')); X0=str2double(get(handles.edit3,'string')); E=str2double(get(handles.edit4,'string')); X1=g(X0); while abs(X1-X0)>E X0=X1; X1=g(X0); end set(handles.edit5,'string',X1);
function pushbutton2_Callback(hObject, eventdata, handles) % $$$$====GRAFICA DE LA FUNCION====$$$$ figure(1) f=inline(get(handles.edit1,'string')); ezplot(f);grid on
function pushbutton3_Callback(hObject, eventdata, handles) close(puntofijo)
MÉTODO DE NEWTON-RAPHSON DOC. LIC. JAVIER LOZANO
-8-
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO Este método parte de una aproximación inicial x 0 y obtiene una aproximación mejor, x 1, dada por la fórmula: (1) La expresión anterior puede derivarse a partir de un desarrollo en serie de Taylor. Efectivamente, sea r un cero de f y sea x una aproximación a r tal que r = x +h. Si f '' existe y es continua, por el teorema de Taylor tenemos: 0 = f (r ) = f ( x +h) = f ( x ) + hf '( x ) + O(h2)
(2)
en donde h=r - x . Si x está próximo a r (es decir hes pequeña), es razonable ignorar el término O(h2): 0 = f ( x ) + hf '( x )
(3)
por lo que obtenemos la siguiente expresión para h: (4) A partir de la ecuación (4) y teniendo en cuenta que r = x +h es fácil derivar la ecuación (1).
Figure: Interpretación geométrica del método de Newton. [scale=0.9]eps/new-1 El método de Newton tiene una interpretación geométrica sencilla, como se puede apreciar del análisis. De hecho, el método de Newton consiste en una linealización de la función, es decir, f se reemplaza por una recta tal que contiene al punto (x 0,f ( x 0)) y cuya pendiente coincide con la derivada de la función en el punto, f '( x 0). La nueva aproximación a la raíz, x 1, se obtiene de la intersección de la función linear con el eje X de ordenadas. Veamos cómo podemos obtener la ecuación (1) a partir de lo dicho en el párrafo anterior. La ecuación de la recta que pasa por el punto (x 0,f ( x 0)) y de pendiente f '( x 0) es: (5) y - f ( x 0) = f '( x 0)( x - x 0)
DOC. LIC. JAVIER LOZANO
-9-
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO de donde, haciendo y =0 y despejando x obtenemos la ecuación de Newton-Raphson (1).
Figure: Dos situaciones en las que el método de Newton no funciona adecuadamente: (a) el método no alcanza la convergencia y (b) el método converge hacia un punto que no es un cero de la ecuación. [scale=0.9]eps/new-2
El método de Newton es muy rápido y eficiente ya que la convergencia es de tipo cuadrático (el número de cifras significativas se duplica en cada iteración). Sin embargo, la convergencia depende en gran medida de la forma que adopta la función en las proximidades del punto de iteración. En la figura (arriba) se muestran dos situaciones en las que este método no es capaz de alcanzar la convergencia (figura (a)) o bien converge hacia un punto que no es un cero de la ecuación (figura (b)).
DIAGRAMA DE FLUJO:
DOC. LIC. JAVIER LOZANO
- 10 -
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO
INICIO
LEER f(X),f'(X),X,E
X1=X0 - f(X0)/f'(X0)
F
lx1-x0l >E V
X0=X1 X1=X0 - f(X0)/f'(X0)
ESCRIBIR X1
FIN
PROGRAMACION DEL METODO: GUIDE: DOC. LIC. JAVIER LOZANO
- 11 -
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO
CODIFICACION: function pushbutton1_Callback(hObject, eventdata, handles) f=inline(get(handles.edit1,'string'));
DOC. LIC. JAVIER LOZANO
- 12 -
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO df=inline(get(handles.edit2,'string')); X0=str2double(get(handles.edit3,'string')); E=str2double(get(handles.edit4,'string')); X1=X0-f(X0)/(df(X0)); while abs(X1-X0)>E X0=X1; X1=X0-f(X0)/(df(X0)); end set(handles.edit5,'string',X1);
function pushbutton2_Callback(hObject, eventdata, handles) % $$$$====GRAFICA DE LA FUNCION====$$$$ figure(1) f=inline(get(handles.edit1,'string')); ezplot(f);grid on function pushbutton3_Callback(hObject, eventdata, handles) close(newtonrapshon1)
MÉTODO DE LA SECANTE El principal inconveniente del método de Newton estriba en que requiere conocer el valor de la primera derivada de la función en el punto. Sin embargo, la forma funcional
DOC. LIC. JAVIER LOZANO
- 13 -
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO de f ( x ) dificulta en ocasiones el cálculo de la derivada. En estos casos es más útil emplear el método de la secante. El método de la secante parte de dos puntos (y no sólo uno como el método de Newton) y estima la tangente (es decir, la pendiente de la recta) por una aproximación de acuerdo con la expresión:
(34)
Sustituyendo esta expresión en la ecuación (1) del método de Newton, obtenemos la expresión del método de la secante que nos proporciona el siguiente punto de iteración:
(35)
Figure: Representación geométrica del método de la secante. [scale=0.9]eps/secante
En la siguiente iteración, emplearemos los puntos x 1 y x 2para estimar un nuevo punto más próximo a la raíz de acuerdo con la ecuación (35). En la figura (arriba) se representa geométricamente este método. En general, el método de la secante presenta las mismas ventajas y limitaciones que el método de Newton-Raphson explicado anteriormente
DIAGRAMA DE FLUJO:
DOC. LIC. JAVIER LOZANO
- 14 -
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO
INICIO
LEER X0,X1,f(X),E
lX1-X0l > E
X2 = X1 - (X1-X0)*f(X1)/(f(X1)-f(X0))
X0 = X1 X1 = X2
ESCRIBIR X1
FIN
PROGRAMACION DEL METODO: GUIDE: DOC. LIC. JAVIER LOZANO
- 15 -
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO
CODIFICACION: DOC. LIC. JAVIER LOZANO
- 16 -
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO
function pushbutton1_Callback(hObject, eventdata, handles) f=inline(get(handles.edit1,'string')); X0=str2double(get(handles.edit2,'string')); X1=str2double(get(handles.edit3,'string')); E=str2double(get(handles.edit4,'string')); while abs(X1-X0)>E X2=X1-((X1-X0)*f(X1))/(f(X1)-f(X0)) X0=X1 X1=X2 end set(handles.edit5,'string',X2);
function pushbutton2_Callback(hObject, eventdata, handles) % $$$$====GRAFICA DE LA FUNCION====$$$$ figure(1) f=inline(get(handles.edit1,'string')); ezplot(f);grid on
function pushbutton3_Callback(hObject, eventdata, handles) close(secante)
METODO DE GAUSS - JORDAN Este método utiliza las mismas técnicas de eliminación Gaussiana (incluyendo el pivoteo), pero con el objetivo de finalizar con una matriz de la siguiente forma:
DOC. LIC. JAVIER LOZANO
- 17 -
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO
Donde
I n
es la matriz identidad de nxn .
Para lograr esto, se usa la técnica del pivoteo con la única diferencia que el pivote se usa para hacer ceros hacia abajo y hacia arriba.
Ejemplo 1:
Usar el método de Gauss-Jordan para resolver el siguiente sistema:
Solución. Comenzamos con la matriz aumentada
Procedemos a hacer el primer pivoteo, y para ello, intercambiamos los renglones 1 y 2:
y haciendo ceros debajo del pivote, obtenemos:
~
Ahora, para colocar adecuadamente el segundo pivote intercambiamos los renglones 2 y 3: DOC. LIC. JAVIER LOZANO
- 18 -
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO
−5
Para hacer ceros arriba del pivote 1.25, multiplicamos el renglón 2 por 1.25 y se lo sumamos al renglón 1; para hacer ceros debajo del mismo pivote, multiplicamos al −0.5
mismo renglón 2 por 1.25 y se lo sumamos al renglón 3 . Todo esto nos da:
Ahora procedemos a hacer ceros arriba del pivote 0.09 . renglón 3 renglón 3 por
por −1.9
0.09
0.85 0.09
Para ello, multiplicamos el
y se lo sumamos al renglón 2; igualmente multiplicamos el
y se lo sumamos al renglón 1. Todo esto nos da:
Finalmente para hacer los 1’s ( unos ) en la diagonal principal, multiplicamos los 1 −1 1 , renglones 1 , 2, y 3 por 2 1.25 y 0.09 , respectivamente. Obtenemos entonces la matriz final:
La cual nos da la solución del sistema de ecuaciones:
DIAGRAMA DE FLUJO:
DOC. LIC. JAVIER LOZANO
- 19 -
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO INICIO LEER
n , aij
i=0,n,1
divisor = aii
j = i , n + 1, 1
aij = aij /divisor
k=1,n,1
i~=k
pivote=a(k,i)
j = i, n, 1
akj = akj - pivote* aij
ESCRIBIR
ai,n+1 FIN
PROGRAMACION DEL METODO:
DOC. LIC. JAVIER LOZANO
- 20 -
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO
GUIDE:
CODIFICACION: function varargout = pushbutton1_Callback(h, eventdata, handles, varargin) a=str2num(get(handles.edit3,'string')); [m,n]=size(a); for i=1:m divisor=a(i,i); for j=i:n a(i,j)=a(i,j)/divisor; end for k=1:m if i~=k pivote=a(k,i); for j=i:n a(k,j)=a(k,j)-pivote*a(i,j); end end end end for i=1:m x(i)=a(i,n); end x=x'; t=1:m; t=t'
DOC. LIC. JAVIER LOZANO
- 21 -
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO cadena=''; for t=1:m cad=sprintf('x%d=%6.2f',t,x(t)); cadena=[cadena;cad]; end set(handles.edit4,'string',cadena) % --------------------------------------------------------------------
function varargout = pushbutton2_Callback(h, eventdata, handles, varargin) set(handles.edit3,'string',''); set(handles.edit4,'string',''); % --------------------------------------------------------------------
function varargout = pushbutton3_Callback(h, eventdata, handles, varargin) close(gausjordan)
METODO DE GAUSS-SEIDEL El método de Gauss-Seidel, es un método iterativo y por lo mismo, resulta ser un método bastante eficiente. Comenzamos con nuestro sistema de ecuaciones:
De la ecuación 1 despejemos ecuación n despejemos
DOC. LIC. JAVIER LOZANO
- 22 -
xn
x
1
, de la ecuación 2 despejemos
x
2
, …, de la
. Esto nos da el siguiente conjunto de ecuaciones:
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO
Este último conjunto de ecuaciones son las que forman nuestras fórmulas iterativas. Para comenzar el proceso iterativo, le damos el valor de cero a las variables x
; esto nos dará un primer valor para
1
Enseguida, sustituímos este valor de
. Más precisamente, tenemos que:
x
1
en la ecuación 2, y las variables
siguen teniendo el valor de cero. Esto nos da el siguiente valor para
Estos últimos valores de
x1
y
x2
x 2 , , x n
x
2
x3 , , x n
:
, los sustituímos en la ecuación 3, mientras que
x 4 ,, x n
siguen teniendo el valor de cero; y así sucesivamente hasta llegar a la última ecuación. Todo este paso, nos arrojará una lista de primeros valores para nuestras incógnitas, la cual conforma nuestro primer paso en el proceso iterativo. Digamos que tenemos:
Volvemos a repetir el proceso, pero ahora sustituyendo estos últimos datos en vez de ceros como al inicio, obtendremos una segunda lista de valores para cada una de las incógnitas. Digamos que ahora tenemos:
DOC. LIC. JAVIER LOZANO
- 23 -
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO En este momento, podemos calcular los errores aproximados relativos, respecto a cada una de las incógnitas. Así, tenemos la lista de errores como sigue:
El proceso se vuelve a repetir hasta que:
donde
∈ s
es una cota suficiente prefijada
DOC. LIC. JAVIER LOZANO
- 24 -
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO
INICIO DIAGRAMA DE FLUJO:
LEER
N, m , aij, bi, vi
K = 1, m, 1
i = 1, n, 1 Xi = Vi
i = 1, n, 1 s=0
j=1, n, 1
j ~= 1
s = s + aij*xj
vi = (bi-s)/aii
Xi = vi
i = 1, n, 1 ESCRIBIR vi
FIN DOC. LIC. JAVIER LOZANO
- 25 -
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO
PROGRAMACION DEL METODO: GUIDE:
DOC. LIC. JAVIER LOZANO
- 26 -
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO
CODIFICACION: function varargout = pushbutton1_Callback(h, eventdata, handles, varargin) m=str2double(get(handles.edit1,'string')); v=str2num(get(handles.edit2,'string')); a=str2num(get(handles.edit3,'string')); b=str2num(get(handles.edit4,'string')); [n,n]=size(a); cad1=''; for k=1:m for i=1:n x(i)=v(i); end for i=1:n s=0; for j=1:n if j~=i s=s+a(i,j)*x(j); end end v(i)=(b(i)-s)/a(i,i); x(i)=v(i); end for t=1:n cad2=sprintf(' x%d=%10.8f ',t,x(t)); cad1=[cad1,cad2]; end cad2=sprintf('\n'); cad1=[cad1,cad2]; end set(handles.edit5,'string',cad1) % --------------------------------------------------------------------
function varargout = pushbutton2_Callback(h, eventdata, handles, varargin) set(handles.edit1,'string',''); set(handles.edit2,'string',''); set(handles.edit3,'string',''); set(handles.edit4,'string',''); set(handles.edit5,'string','');
DOC. LIC. JAVIER LOZANO
- 27 -
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO
POLINOMIO DE INTERPOLACIÓN DE LAGRANGE Nuevamente tenemos los datos :
El polinomio de interpolación de Lagrange se plantea como sigue: P ( x) Donde los polinomios a la tabla de datos.
l i ( x)
=
y0l 0 ( x) + y1l 1 ( x ) + + ynl n ( x )
se llaman los polinomios de Lagrange, correspondientes P ( x0 )
Como se debe satisfacer que para toda i ≠ 0 .
=
Como se debe satisfacer que P ( x1 ) para toda i ≠ 1 .
=
y0
l 0 ( x0 ) = 1
, esto se cumple si
y1 , esto se cumple si l 1 ( x1 )
=
y
l i ( x0 )
=
0
1 y l i ( x1 ) = 0
P ( x ) = yn Y así sucesivamente, veremos finalmente que la condición n n se cumple si l n ( xn ) = 1 l ( x ) = 0 y i n para toda i ≠ n . Esto nos sugiere como plantear los polinomios de Lagrange. Para ser más claros, l ( x) analicemos detenidamente el polinomio 0 . De acuerdo al análisis anterior vemos l ( x) que deben cumplirse las siguientes condiciones para 0 : l ( x ) = 0 l 0 ( x0 ) = 1 y 0 j , para toda j ≠ 0 l ( x) Por lo tanto, planteamos 0 como sigue: l o ( x ) = c( x − x1 )( x − x2 ) ( x − xn ) l ( x) Con esto se cumple la segunda condición sobre 0 . La constante c se determinará para hacer que se cumpla la primera condición: l 0 ( x0 )
=
1 ⇒ 1 = c( x0 − x1 )( x0 − x2 ) ( x0 − xn ) ⇒c=
1
( x0 − x1 )( x0 − x2 ) ( x0 − xn )
Por lo tanto el polinomio
l 0 ( x)
queda definido como:
l 0 ( x ) =
( x − x1 )( x − x2 ) ( x − xn ) ( x0 − x1 )( x0 − x2 ) ( x0 − xn )
Análogamente se puede deducir que:
∏( x − x ) i
l j ( x ) =
i ≠ j
∏( x
j
i ≠ j
DOC. LIC. JAVIER LOZANO
- 28 -
− xi )
, para j = 1,
,n
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO
MÉTODO DE LAGRANGE
INICIO Leer n, x Xi S=0 K = 0, n, 1
Num = 1 Den = 1 i = 0, n, 1 i= k Num= Num*(X-X i) Den=Den*(Xk -Xi) Lk=Num/Den
S = S + L k * f(Xk)
Escribir S Fin
DOC. LIC. JAVIER LOZANO
- 29 -
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO
PROGRAMACION DEL METODO : GUIDE:
DOC. LIC. JAVIER LOZANO
- 30 -
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO
CODIFICACION: function varargout = pushbutton1_Callback(h, eventdata, handles, varargin) x=str2num(get(handles.edit2,'string')); n=length(x); f=inline(get(handles.edit1,'string')); P=str2double(get(handles.edit3,'string')); S=0; for k=1:n Num=1; Dem=1; for i=1:n if k~=i Num=Num*(P-x(i)); Dem=Dem*(x(k)-x(i)); end L=Num/Dem; end S=S+L*f(x(k)); end set(handles.edit4,'string',S) % -------------------------------------------------------------------function varargout = pushbutton2_Callback(h, eventdata, handles, varargin) x=str2num(get(handles.edit2,'string')); f=inline(get(handles.edit1,'string')); ezplot(f),grid on
DOC. LIC. JAVIER LOZANO
- 31 -
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO
METODO DE LOS MINIMOS CUADRADOS Supongamos que hemos medido un conjunto de pares de datos (x i, y )i en una experiencia, por ejemplo, la posición de un móvil en ciertos instantes de tiempo. Queremos obtener una función y=f(x) que se ajuste lo mejor posible a los valores experimentales. Se pueden ensayar muchas funciones, rectas, polinomios, funciones potenciales o logarítmicas. Una vez establecido la función a ajustar se determinan sus parámetros, en el caso de un polinomio, serán los coeficientes del polinomio de modo que los datos experimentales se desvíen lo menos posible de la fórmula empírica. La función más sencilla es la función lineal y=ax+b que hemos tratado en la página anterior. El procedimiento de ajustar los datos experimentales a una línea recta se denomina regresión lineal
POLINOMIO APROXIMADOR Queremos aproximar un polinomio de grado n, a un conjunto de m pares de datos (x i , y )i de modo que n m.
Sea el polinomio P(x)=a0 +a1 x+a2 x 2 +...an x n
Se calcula la cantidad
Para obtener los valores de los coeficientes del polinomio aproximador se tienen que determinar los valores de los coeficientes a0 , a1, a2 , ...an de forma que la cantidad S tome un valor mínimo. Hagamos las derivadas parciales de S respecto de a0 , a1, a2 , ...an iguales a cero
(1) Obtenemos un sistema de n+1 ecuaciones con n+1 incógnitas, a0 , a1, a2 , ...an
DOC. LIC. JAVIER LOZANO
- 32 -
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO
Ejemplo: Supongamos que tenemos 4 pares de datos y que queremos ajustarlos al polinomio de segundo grado y=a0 +a1 x+a2 x 2
x
x0
x1
x2
x3
y
y0
y1
y2
y3
Las ecuaciones (1) se escribirán
agrupando términos
Volvamos al sistema de n+1 ecuaciones con n+1 incógnitas. Introduzcamos las expresiones
(2) Se obtiene el siguiente sistema de n+1 ecuaciones con n+1 incógnitas
(3) Si todos los puntos son distintos, el sistema de ecuaciones tiene una solución única.
DOC. LIC. JAVIER LOZANO
- 33 -
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO
PROGRAMACION DEL METODO:
INICIO LEER m , xi , yi A11 = 0 A12 = 0 A22 = m B1 = 0 B2 = 0
i=1 , m , 1 A11 = A11 + xi2 A12 = A12 +xi A21 = A12 B1 = B1+xiyi B2 = B2+yi
a= a=
ESCRIBIR a,b
FIN DOC. LIC. JAVIER LOZANO
- 34 -
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO
PROGRAMACION DEL METODO: GUIDE:
CODIFICACION: function varargout = pushbutton1_Callback(h, eventdata, handles, varargin) n=str2double(get (handles.edit1,'string')); x=str2num(get(handles.edit2,'string')); y=str2num(get(handles.edit3,'string')); A11=0; A12=0; A22=n B1=0; B2=0; for i=1:n;1 for j=0,1,1
DOC. LIC. JAVIER LOZANO
- 35 -
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO A11=A11+(x(i)*x(i)) A12=A12+(x(i)) A21=A12 A22=n B1=B1+(x(i))*(y(i)) B2=B2+(y(i)) end end a=(B1*A22-B2*A12)/(A11*A22-A12*A21) b=(A11*B2-A21*B1)/(A11*A22-A12*A21) set(handles.edit4,'string',a); set(handles.edit5,'string',b); % -------------------------------------------------------------------function varargout = pushbutton2_Callback(h, eventdata, handles, varargin) close(MinimosCuadrados); % -------------------------------------------------------------------function varargout = pushbutton3_Callback(h, eventdata, handles, varargin) n=str2double(get (handles.edit1,'string')); x=str2num(get(handles.edit2,'string')); y=str2num(get(handles.edit3,'string')); [nu,m2]=size(x) [nv,m2]=size(y) A11=0; A12=0; A22=n B1=0; B2=0; for i=1:n; for j=0,1,1 A11=A11+(x(i)*x(i)) A12=A12+(x(i)) A21=A12 A22=n B1=B1+(x(i))*(y(i)) B2=B2+(y(i)) end end a=(B1*A22-B2*A12)/(A11*A22-A12*A21) b=(A11*B2-A21*B1)/(A11*A22-A12*A21) set(handles.edit4,'string',a); set(handles.edit5,'string',b); Y=a*x+b plot(Y),grid % -------------------------------------------------------------------function varargout = pushbutton4_Callback(h, eventdata, handles, varargin) set(handles.edit1,'string',''); set(handles.edit2,'string',''); set(handles.edit3,'string',''); set(handles.edit4,'string',''); set(handles.edit5,'string','');
DOC. LIC. JAVIER LOZANO
- 36 -
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO
REGLA DEL TRAPECIO Corresponde al caso donde
donde datos:
, es decir :
es un polinomio de interpolación (obviamente de grado 1) para los
Del capítulo anterior, sabemos que este polinomio de interpolación es:
Integrando este polinomio, tenemos que:
Por lo tanto, tenemos que:
Que es la conocida Regla del Trapecio. Este nombre se debe a la interpretación geométrica que le podemos dar a la fórmula. El polinomio de interpolación para una tabla que contiene dos datos, es una línea recta. La integral, corresponde al área bajo la línea recta en el intervalo , que es precisamente el área del trapecio que se forma.
DOC. LIC. JAVIER LOZANO
- 37 -
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO
Ejemplo 1: Utilizar la regla del trapecio para aproximar la integral:
Solución.
Usamos la fórmula directamente con los siguientes datos:
Por lo tanto tenemos que:
Ejemplo 2. Usar la regla del trapecio para aproximar la integral:
Solución.
Igual que en el ejemplo anterior, sustituímos los datos de manera directa en la fórmula del trapecio. En este caso, tenemos los datos:
Por lo tanto, tenemos que:
DOC. LIC. JAVIER LOZANO
- 38 -
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO La regla del trapecio se puede ampliar si subdividimos el intervalo subintervalos, todos de la misma longitud
en
.
Sea la partición que se forma al hacer dicha subdivisión. Usando propiedades de la integral tenemos que:
Aplicando la regla del trapecio en cada una de las integrales, obtenemos:
Ahora bien, ya que todos los subintervalos tienen la misma longitud h, tenemos que:
Sustituyendo el valor de h y usando la notación sigma, tenemos finalmente:
Esta es la regla del trapecio para n subintervalos. Obviamente, esperamos que entre más subintervalos usemos, mejor sea la aproximación a la integral.
DOC. LIC. JAVIER LOZANO
- 39 -
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO
DIAGRAMA DE FLUJO: REGLA DEL TRAPECIO
INICIO
Leer a, b, n
h=(b-a) n
s = f(a) – f(b)
i = 1, n-1, 1
Xi = a + i*h
s = s + 2*f(xi)
AREA = S*h/2
Escrbir AREA
FIN
DOC. LIC. JAVIER LOZANO
- 40 -
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO
PROGRAMACION DEL METODO : GUIDE:
CODIFICACION: function varargout = pushbutton1_Callback(h, eventdata, handles, varargin) f=inline(get(handles.edit1,'string')); a=str2double(get(handles.edit2,'string')); b=str2double(get(handles.edit3,'string')); n=str2double(get(handles.edit4,'string')); h=(b-a)/n; s=f(a)+f(b); for i=2:n x(i)=a+((i-1)*h); s=s+2*(f(x(i))); end AREA=s*(h/2); set(handles.edit5,'string',AREA); % -------------------------------------------------------------------function varargout = pushbutton2_Callback(h, eventdata, handles, varargin) % $$$$====GRAFICA DE LA FUNCION====$$$$ f=inline(get(handles.edit1,'string')); ezplot(f);grid on % -------------------------------------------------------------------function varargout = pushbutton3_Callback(h, eventdata, handles, varargin) close(trapecio)
DOC. LIC. JAVIER LOZANO
- 41 -
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO
REGLA DE SIMPSON DE UN TERCIO
Suponemos que tenemos los datos: donde
es el punto medio entre
y
.
En este caso se tiene que:
donde es el polinomio de interpolación para los datos en la tabla anterior. Usaremos el polinomio de Lagrange. Así, tenemos que:
Si denotamos
, entonces:
Simplificando términos:
Vemos que cada uno de los términos anteriores, es esencialmente de la misma forma, es decir, una constante por Así, calculamos la siguiente integral por partes:
Sea:
por lo tanto,
DOC. LIC. JAVIER LOZANO
- 42 -
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO
Usamos esta fórmula para calcular la integral de cada uno de los tres términos de
.
Debido al factor
se le conoce como la regla de Simpson de un tercio.
En la práctica, sustituímos el valor de
DOC. LIC. JAVIER LOZANO
- 43 -
para obtener nuestra fórmula final:
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO
DIAGRAMA DE FLUJO: INICIO
LEER F(x),a,b,n
h=b-a n
i=0,n,1
xi=a+h
n par
S=0
i=2,n,1
S=S+F(xi-2)+4F(xi-1)+F(xi)
I=S*h/3
ESCRIBIR I
FIN DOC. LIC. JAVIER LOZANO
- 44 -
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO
INICIO
LEER F(x),a,b,n
h=b-a n
i=0,n,1
xi=a+h
n par
S=0
i=2,n,1
S=S+F(xi-2)+4F(xi-1)+F(xi)
I=S*h/3
ESCRIBIR I
FIN
DOC. LIC. JAVIER LOZANO
- 45 -
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO
PROGRAMACION DEL METODO: GUIDE:
CODIFICACION: function varargout = pushbutton1_Callback(h, eventdata, handles, varargin) f=inline(get(handles.edit1,'string')); a=str2double(get(handles.edit2,'string')); b=str2double(get(handles.edit3,'string')); n=str2double(get(handles.edit4,'string')); h=(b-a)/n; for i=1:n+1 x(i)=a+(i-1)*h; end if rem(n,2)==0 s=0; for j=2:n s=s+f(x(i-2))+4*f(x(i-1))+f(x(i)); end I=s*h/3 ; set(handles.edit5,'string',I) else end % -------------------------------------------------------------------function varargout = pushbutton2_Callback(h, eventdata, handles, varargin) f=inline(get(handles.edit1,'string')); a=str2double(get(handles.edit2,'string')); b=str2double(get(handles.edit3,'string')); ezplot(f,a,b), grid on %----------------------------------------------------------------------function varargout = pushbutton3_Callback(h, eventdata, handles, varargin)cc c close(sinpson13)
DOC. LIC. JAVIER LOZANO
- 46 -
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO
REGLA DE SIMPSON DE TRES OCTAVOS Este caso corresponde a
donde
, es decir,
es un polinomio de interpolación para los siguientes datos:
Y donde , y , son los puntos que dividen en tres partes iguales al intervalo . Igual que en el caso anterior, se usa el polinomio de interpolación de Lagrange, y usando el método de integración por partes se llega a la siguiente fórmula:
donde
. Debido al factor
es que se le dió el nombre de Regla de
Simpson de 3/8 . En la práctica, se sustituye el valor de h para obtener:
Ejemplo 1. Aproximar la siguiente integral, usando la regla de Simpson de
:
Solución.
En este caso, tenemos los siguientes datos:
Los cuales sustituímos en la fórmula, para obtener:
Al igual que en los dos casos anteriores, la regla de Simpson de 3/8, se puede extender si subdividimos el intervalo en intervalos de la misma longitud .
DOC. LIC. JAVIER LOZANO
- 47 -
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO Sea
la partición determinada de esta forma. Cada subintervalo
lo dividimos en tres partes iguales, y sean
Aplicando la regla de
y
los puntos determinados así:
en cada uno de los intervalos tenemos:
Esta última, es la regla de Simpson de 3/8 para n subintervalos todos de la misma longitud.
DOC. LIC. JAVIER LOZANO
- 48 -
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO
DIAGRAMA DE FLUJO: INICIO
S=0
LEER F(x),a,b,n
h=b-a n
n=3
i=3,n,3
S=S+3/8*h*[ F(xi-3)+3F(xi-2)+3F(xi-1)+F(xi)]
ESCRIBI R “n debe ser impar”
ESCRIBIR S
FIN
DOC. LIC. JAVIER LOZANO
- 49 -
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO
PROGRAMACION DEL METODO: GUIDE:
CODIFICACION: function varargout = pushbutton1_Callback(h, eventdata, handles, varargin) f=inline(get(handles.edit1,'string')); a=str2double(get(handles.edit2,'string')); b=str2double(get(handles.edit3,'string')); ezplot(f,a,b), grid on % -------------------------------------------------------------------function varargout = pushbutton3_Callback(h, eventdata, handles, varargin) f=inline(get(handles.edit1,'string')); a=str2double(get(handles.edit2,'string')); b=str2double(get(handles.edit3,'string')); n=str2double(get(handles.edit4,'string')); if rem(n,3)==0 h=(b-a)/n for i=1:1:n+1 x(i)=a+(i-1)*h end s=0 for j=1:3:n-1 s=s+f(x(j))+3*f(x(j+1))+3*f(x(j+2))+f(x(j+3)) end A=3*s*h/8 set(handles.edit5,'string',A) else set(handles.edit5,'string','n debe ser multiplo de 3') end
DOC. LIC. JAVIER LOZANO
- 50 -
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO
MÉTODO DE EULER La idea del método de Euler es muy sencilla y está basada en el significado geométrico de la derivada de una función en un punto dado. Supongamos que tuviéramos la curva solución de la ecuación diferencial y trazamos la recta tangente a la curva en el punto dado por la condición inicial.
Debido a que la recta tangente aproxima a la curva en valores cercanos al punto de tangencia, podemos tomar el valor de la recta tangente en el punto como una aproximación al valor deseado
.
Así, calculemos la ecuación de la recta tangente a la curva solución de la ecuación diferencial dada en el punto . De los cursos de Geometría Analítica, sabemos que la ecuación de la recta es:
donde m es la pendiente. En este caso, sabemos que la pendiente de la recta tangente se calcula con la derivada:
Por lo tanto, la ecuación de la recta tangente es :
DOC. LIC. JAVIER LOZANO
- 51 -
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO Ahora bien, suponemos que como
es un punto cercano a
, y por lo tanto estará dado
. De esta forma, tenemos la siguiente aproximación:
De aquí, tenemos nuestra fórmula de aproximación:
Esta aproximación puede ser suficientemente buena, si el valor de h es realmente pequeño, digamos de una décima ó menos. Pero si el valor de h es más grande, entonces podemos cometer mucho error al aplicar dicha fórmula. Una forma de reducir el error y obtener de hecho un método iterativo, es dividir la distancia en n partes iguales (procurando que estas partes sean de longitud suficientemente pequeña) y obtener entonces la aproximación en n pasos, aplicando la fórmula anterior n veces de un paso a otro, con la nueva h igual a
.
En una gráfica, tenemos lo siguiente:
Ahora bien, sabemos que:
Para obtener el punto que:
únicamente hay que pensar que ahora el papel de
lo toma
, y por lo tanto, si sustituímos los datos adecuadamente, obtendremos
De aquí se ve claramente que la fórmula recursiva general, está dada por:
Esta es la conocida fórmula de Euler que se usa para aproximar el valor de aplicándola sucesivamente desde
DOC. LIC. JAVIER LOZANO
- 52 -
hasta
en pasos de longitud h.
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO
DIAGRAMA DE FLUJO:
INICIO
LEER F(x),a,b,n,y0
x0=a
h=b-a n
i=1,n,1
y1=y0+h0*f(x)
Y0=y1
x1=x0+h
x0=x1
ESCRIBIR y0
FIN
DOC. LIC. JAVIER LOZANO
- 53 -
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO
Programación del metodo : GUIDE:
DOC. LIC. JAVIER LOZANO
- 54 -
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO
CODIFICACION: function varargout = pushbutton1_Callback(h, eventdata, handles, varargin) funcion=get(handles.edit1,'string'); f=inline(funcion,'x','y'); x0=str2double(get(handles.edit2,'string')); x1=str2double(get(handles.edit3,'string')); n=str2double(get(handles.edit4,'string')); y0=str2double(get(handles.edit5,'string')); h=(x1-x0)/n; X(1,1)=x0 Y(1,1)=y0 for i=1:n y1=y0+h*f(x0,y0); y0=y1; x1=x0+h; x0=x1; X(i+1,1)=x0; Y(i+1,1)=y0; end set(handles.edit6,'string',y1); set(handles.edit7,'string',X); set(handles.edit8,'string',Y); % -------------------------------------------------------------------function varargout = pushbutton2_Callback(h, eventdata, handles, varargin) X=str2num(get(handles.edit7,'string')); Y=str2num(get(handles.edit8,'string')); plot(X,Y,'.',X,Y,'r-'),grid on, axis equal % -------------------------------------------------------------------function varargout = pushbutton3_Callback(h, eventdata, handles, varargin) close(euler)
DOC. LIC. JAVIER LOZANO
- 55 -
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO
METODO DE RUNGE-KUTTA DE 4TO ORDEN Los metodos desarrollados por Runge (1885), Kutta (1901), Heun (1900) y otros para la solucion de problemas con valor en la frontera. Este consiste en obtener un resultado que se obtendria al utilizar un numero finito de terminos de una serie de Taylor de la forma:
Este metodo es superior al metodo de punto medio (Runge-Kutta de segundo orden) ya que contiene los primeros cinco terminos de la serie de Taylor, lo cual significa gran exactitud sin el calculo de las derivadas, pero se tiene que evaluar la funcion f(x) cuatro veces para cada subintervalo. Reacomodando para los valores de f(x) y haciendo f(x)' = y + hf(x), se tiene:
Las reglas o formulas de Runge-Kutta de orden cuatro para la ecuacion diferencial:
DOC. LIC. JAVIER LOZANO
- 56 -
METODOS NUMERICOS
UNJBG – ESIC CALCULO NÚMERICO DIAGRAMA DE FLUJO:
INICIO
LEER F(x), X0,Y0,b, n
h=b-X0 n
i=1,n,1
K1=F( X0, Y0) K2=F(X0+h/2, Y0+h/2*K1) K3=F(X0+h/2, Y0+h/2*K2) K4=F(X0+h, Y0+h*K3)
Y1=Y0-h/6*(K1+2*K2+2*K3+K4)
X1=X0+h
X0=X1 Y0=Y1
ESCRIBIR Y0
FIN
DOC. LIC. JAVIER LOZANO
- 57 -
METODOS NUMERICOS