Exercicio práctico de derivación numérica con Sage

En Sage non existe un comando para calcular a derivada numérica. Porén é moi doado construir unha función que o faga por nós:

# derivada numerica de segundo orden
def dn2(x,y): 
    end = len(y)-1
    d[0]     = (-y[2]+4*y[1]-3*y[0])/(x[2]-x[0])
    d[1:end] = [(y[i+1]-y[i-1])/(x[i+1]-x[i-1]) for i in [1..end-1]]
    d[end]   = (3*y[end]-4*y[end-1]+y[end-2])/(x[end]-x[end-2])
    return d

Obsérvese que a fórmula centrada non se pode usar no primeiro e derradeiro punto. Para aproximar a derivada neles usamos as fórmulas cara adiante e cara atrás. Ademais, a orde de erro é O(h²) en todas elas, para obter unha aproximación da mesma precisión en tódolos puntos.
Agora, podemos aproximar o valor da derivada dunha función, por exemplo, do seno no intervalo [0, π/4]:

sage: t = [0,0.01..pi/4]
sage: d = dn2(t, map(lambda x: sin(x), t))

Se representamos a derivada exacta do seno xunto coa aproximación, veremos a súa similitude:

sage: plot(cos(x), 0, pi/4, legend_label='cos(x)') + \
....: line(zip(t,d), legend_label='dn2(x,sin(x))', \
....: color='green', marker='+', linestyle='')

dn2-sage

Se calculamos o erro máximo, vermos que é pequeno:

sage: max([abs(cos(i)-j) for i, j in zip(t,d)])
3.333216667877892e-05

E como as fórmulas son da orde O(h²), ao reducir o paso por 10, o erro máximo redúcese por cen:

sage: t = [0,0.001..pi/4]
sage: d = dn2(t, map(lambda x: sin(x), t));
sage: max([abs(cos(i)-j) for i, j in zip(t,d)])
3.33333216806508e-7
Advertisements
Esta entrada foi publicada en Cálculo numérico, Derivación numérica, Matlab/Octave. Ligazón permanente.

2 Responses to Exercicio práctico de derivación numérica con Sage

  1. Pingback: Derivación numérica | fundmat

  2. Pingback: Exercicios das clases prácticas | fundmat

Deixar unha resposta

introduce os teu datos ou preme nunha das iconas:

Logotipo de WordPress.com

Estás a comentar desde a túa conta de WordPress.com. Sair /  Cambiar )

Google+ photo

Estás a comentar desde a túa conta de Google+. Sair /  Cambiar )

Twitter picture

Estás a comentar desde a túa conta de Twitter. Sair /  Cambiar )

Facebook photo

Estás a comentar desde a túa conta de Facebook. Sair /  Cambiar )

Conectando a %s