Pr‡ctica 2: Diferenciaci—n NumŽrica
En esta pr‡ctica nos ocuparemos de aproximar el valor de la derivada
![]()
de una funci—n en un punto fijado
o tambiŽn el
valor de la derivada segunda
![]()
o de las derivadas de orden superior.
El hecho de usar la aproximaci—n numŽrica de
derivadas de funciones es el mismo que con la cuadratura numŽrica, que no se
conozca la expresi—n anal’tica de
o que ella sea muy complicada.
Por otro lado, las f—rmulas de derivaci—n numŽrica son esenciales para construir mŽtodos numŽricos para resolver ecuaciones diferenciales.
Consideraremos f—rmulas del tipo
![]()
Elegidos y fijados
,
, los nodos
y los
coeficientes
, la f—rmula asocia a cada
un nœmero real.
As’, si suponemos que
coincide con
y que
tenemos la
siguiente f—rmula
![]()
con
y se llama
f—rmula de diferencia progresiva. Su grado de
exactitud es 1.
Esta formula contiene el tŽrmino
, que se llama termino de error.
Este tŽrmino contiene el factor
, que se trata de una derivada de orden superior a
, lo cual nos indica la clase de funciones para las cuales la
funci—n de aproximaci—n resulta v‡lida.
La velocidad de convergencia aumentar‡
cuando menor sea el valor de
, y por tanto tambiŽn conseguiremos una mejor aproximaci—n.
En esta pr‡ctica vamos a aproximar la
primera derivada de la funci—n
utilizando la
f—rmula anteriormente descrita con orden 2
![]()
y orden 4
![]()
Vamos a emplear distintos valores de
para comprobar
que como menor es el valor de
mejor es la
aproximaci—n. Esto lo calcularemos mediante el tŽrmino del error.
El algoritmo que hemos implementado calcula,
segœn el valor de
una aproximaci—n
de la derivada y el error absoluto y relativo que se produce al realizar la
aproximaci—n.
Los resultados obtenidos para la citada funci—n
son los
siguientes:
Para la f—rmula de orden 2:
|
H |
Aproximaci—n |
Error relativo |
Error Absoluto |
|
0.1000000000 |
0.5561281756 |
0.0005726200 |
0.0010307160 |
|
0.0100000000 |
0.5555612713 |
0.0000057157 |
0.0000102883 |
|
0.0010000000 |
0.5555556127 |
0.0000000572 |
0.0000001029 |
|
0.0001000000 |
0.5555555561 |
0.0000000006 |
0.0000000010 |
|
0.0000100000 |
0.5555555556 |
0.0000000000 |
0.0000000000 |
Observamos que efectivamente aumenta la
convergencia de la f—rmula a medida que disminuimos el valor de la
ya que
subdividimos m‡s el recinto sobre el cual aplicamos la f—rmula. TambiŽn
observamos que con esta f—rmula de orden 2 necesitamos usar valores de
peque–os para
conseguir una buena aproximaci—n, ya que en caso contrario obtenemos un error
considerable y por lo tanto una mala aproximaci—n.
Para la f—rmula de orden 4:
|
H |
Aproximaci—n |
Error relativo |
Error Absoluto |
|
0.1000000000 |
0.5555512746 |
0.0000042809 |
0.0000077056 |
|
0.0100000000 |
0.5555555551 |
0.0000000004 |
0.0000000008 |
|
0.0010000000 |
0.5555555556 |
0.0000000000 |
0.0000000000 |
|
0.0001000000 |
0.5555555556 |
0.0000000000 |
0.0000000000 |
|
0.0000100000 |
0.5555555556 |
0.0000000000 |
0.0000000000 |
Sin embargo, podemos observar que con la
f—rmula de orden 4 no obtenemos error pr‡cticamente apreciable para
relativamente
grandes ya que converge muy r‡pidamente.
As’ concluiremos que converge m‡s
rapidamente el mŽtodo de orden 4 que el mŽtodo de orden 2, no siendo as’
necesaria la subdivisi—n del recinto en partes muy peque–as, es decir, usando
cotas de
muy peque–as.
derivaci—n.for
c Aproximaci—n de derivadas de funciones.
program derivacion
implicit real*8 (a-h,o-z)
c La funci—n que aproximaremos ser‡ f(x) = ln x
f(x) = dlog(x)
f_der(x) = 1.0d+00/x
c Funci—n de aproximaci—n de grado 2
f_aprox2(x,h) = (1.0d+00/(2.0d+00 * h)) * (f(x+h) - f(x-h))
c Funci—n de aproximaci—n de grado 4
f_aprox4(x,h)=(1.0d+00/(12.0d+00*h))*(f(x-2.0d+00*h)-8.0d+00*
* f(x-h)+8.0d+00*f(x+h)-f(x+2.0d+00*h))
punt_x = 1.8d+00
h = 0.1d+00
print *, "APROXIMACION DE DERIVADAS DE FUNCIONES"
c Calculamos la funci—n aproximada y los errores absoluto
c y relativo. Orden 2.
print *, "Formula de orden 2"
write (*,100) 'H','Resultado','E.Absoluto','E.Relativo'
write (*,100) ('------------', i = 1, 4)
do i = 1, 5
res2 = f_aprox2(punt_x,h)
error_abs2 = abs(f_der(punt_x)-res2)
error_rel2 = error_abs2/f_der(punt_x)
write (*,200) h, res2, error_abs2, error_rel2
h = h * 0.1d+00
enddo
h = 0.1d+00
print *, " "
c Calculamos la funci—n aproximada y los errores absoluto
c y relativo. Orden 4.
print *, "Formula de orden 4"
write (*,100) 'H','Resultado','E.Absoluto','E.Relativo'
write (*,100) ('------------', i = 1, 4)
do i = 1, 5
res4 = f_aprox4(punt_x,h)
error_abs4 = abs(f_der(punt_x)-res4)
error_rel4 = error_abs4/f_der(punt_x)
write (*,200) h, res4, error_abs4, error_rel4
h = h * 0.1d+00
enddo
100 format(4A15\,/)
200 format(4F15.10\,/)
300 format(2F15.10\,/)
end