aspectospr´acticosdeprogramaci´oncient´ıfica · universidad de oviedo departamento de...

55
Universidad de Oviedo Departamento de F´ ısica Grado en F´ ısica Introducci´ on a la F´ ısica Computacional Curso 2014–15 Aspectos pr´ acticos de programaci´on cient´ ıfica Recomendaciones generales sobre programaci´ on Otras cuestiones m´ as concretas Errores en los c´ alculos

Upload: others

Post on 28-Jun-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Universidad de Oviedo Departamento de Fısica

Grado en Fısica

Introduccion a la Fısica Computacional

Curso 2014–15

Aspectos practicos de programacion cientıfica

Recomendaciones generales sobre programacion

Otras cuestiones mas concretas

Errores en los calculos

Page 2: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Recomendaciones generalessobre programacion

(Se hara referencia a Python.)

Page 3: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Sea cuidadoso y correcto

De la maxima importancia: programar con muchocuidado y correctamente.

Page 4: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Use pseudocodigo

Antes de escribir el codigo, escriba con todo detalleel algoritmo matematico en pseudocodigo, lo quefacilita enormemente la programacion si se usaPython.

Page 5: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Verifique una y otra vez

Verifique el codigo completamente, buscando erroresy omisiones, antes de comenzar a editarlo en unaterminal de ordenador.

Es peligrosamente facil escribir programas queparecen funcionar bien con test simples, pero no lohacen con casos mas complicados.

Page 6: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Use casos de prueba

Despues de escribir el programa, chequee y trace suejecucion usando lapiz y papel, con calculos a manode un caso tıpico sencillo.

Verifique los casos lımite, ası como los valores de laprimera y segunda iteraciones de cualquier bucle.

Page 7: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Modularice el codigo 1/2

Construya el programa en pasos, escribiendo yprobando segmentos del mismo (funciones): escribasubtareas autocontenidas como rutinas separadas (ygenericas).

Intente mantener esos segmentos de programarazonablemente pequenos, menores de una pagina decodigo siempre que sea posible, para hacer mas facilla lectura y depuracion de errores.

Page 8: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Modularice el codigo 2/2

Este punto es clave en todos los lenguajes deprogramacion. En Python cuando existen mas de treso cuatro niveles de indentacion es un sıntoma de queel programa no esta suficientemente modularizado ydebe replantearse su diseno.

Page 9: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Generalice un poco

Si el codigo puede ser escrito para manejar unasituacion algo mas general, entonces en muchos casosmerece la pena el esfuerzo extra para ello.

Sin embargo debemos tener cuidado de no introducirdemasiada generalidad en el codigo, debido a quepuede convertir una tarea simple de programacion enalgo bastante complicado.

Page 10: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Muestre resultados intermedios 1/2

Muestre en pantalla resultados intermedios ymensajes de diagnostico para asistir en la depuraciony conocimiento de las operaciones que realiza elprograma.

En los estados finales de preparacion del programa,una vez que estamos convencidos de que el programafunciona bien, se pueden comentar las instruccionescon las salidas intermedias.

Page 11: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Muestre resultados intermedios 2/2

No obstante lo dicho, en Python y otros lenguajesinterpretados (en los que existen instrucciones deejecutar el contenido de un fichero o de una tirade caracteres—string) siempre se pueden realizarentradas de datos que incluyan la asignacion devariables, lo que es bastante descriptivo.

Page 12: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Incluya mensajes de error

Un programa robusto siempre avisa al usuario de unasituacion para la que no este disenado. En general,escriba programas que sean faciles de analizar cuandoaparezca un error inevitable.

Page 13: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Use nombres de variable con sentido

A menudo ayuda dar nombres de variables consentido, debido a que tienen mas valor nemotecnicoque los nombres de variable con una sola letra.Cuidado con la confusion de siempre entre loscaracteres ‘O’ (letra O) y ‘0’ (el numero cero) y entre‘l’ (letra l minuscula) y ‘1’ (numero uno).

Sin embargo, tampoco es bueno usar nombres devariables excesivamente largos.

Page 14: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Incluya comentarios

Los comentarios dentro del codigo son utiles pararecordarnos mas adelante que hace el programa.

Cada funcion posea un comentario en el que seexplique el proposito, que significan las variables deentrada y salida, y el algoritmo usado.

En Python estos comentarios se deben incluir justodetras de los dos puntos (:) en la definicionde la funcion, de tal manera que se conviertenautomaticamente en docstrings.

Page 15: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Indente (sangre) las lıneas de codigo cuandosea conveniente

Indente cada lınea de codigo de manera apropiada(los bucles y las estructuras condicionales) y anadalıneas en blanco para mejorar la legibilidad del codigo.

No obstante, en Python la indentacion es parte dellenguaje, o sea que la recomendacion anterior esrealmente una obligacion.

Page 16: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Use bucles ‘limpios’

No ponga nunca instrucciones innecesarias dentro delos bucles pues se va a repetir su ejecucion varias(y en ocasiones muchas) veces. Mueva expresionesy variables afuera del bucle si no varıan dentro delmismo.

Use solo los bucles estrictamente necesarios, sobretodo en lenguajes compilados como Python. Eneste lenguale, el uso del modulo Numpy facilita lavectorializacion del codigo, evitando ası bucles.

Page 17: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Declare siempre las constantes 1/2

De nombres a las constantes que nunca cambian en elcodigo. Ası son faciles de cambiar segun se necesite,si deseamos modificar el codigo, con solo cambiar suvalor en la instruccion que los define.

Ademas, al utilizar nombres para las constantes, semejora la legibilidad del codigo y se describe mejor elpapel que cada constante tiene en el programa.

Page 18: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Declare siempre las constantes 2/2

Cuando se aplica esto a Python lo mas facil es usarvariables, teniendo la precaucion de no modificarlas.Para ello conviene seguir una norma: por ejemplo,las variables con letras mayusculas se “consideran”constantes.

Tambien se pueden usar tuplas (que son inmutables),pero ello conlleva usar un ındice para referirsea constantes concretas, lo que puede resultarengorroso.

Page 19: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Use estructuras de datos apropiadas

Use estructuras de datos adecuadas para el problemaconcreto a resolver. Si el problema se adapta mejoral uso de vectores de dimension tres, use ese tipo devectores y no los de dimension uno o dos.

Page 20: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Use vectores de todos los tipos

En Python se utilizan normalmente listas (y listas delistas) para ello.

No obstante, para calculo numerico es mejor usar losarrays y matrices del modulo Numpy.

Page 21: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Use funciones predefinidas

En los lenguajes de programacion cientıficos estandisponibles muchas funciones matematicas, comosin, log, exp, etc. En Python estan casi todas en elmodulo Math.

Tambien existen funciones de conversion entre tiposde numeros.

Page 22: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Use bibliotecas (librerıas) de programas

Use rutinas preprogramadas de una biblioteca deprogramas, en vez de programarlas usted mismo,siempre que sea posible. Esas rutinas estan bienchequeadas y depuradas, y pueden considerarse elestado del arte de la cuestion. Sin embargo no usenunca esas rutinas a ciegas.

En este aspecto, Python esta muy bien provisto, puesexisten cientos de paquetes y modulos de funcionespara casi cualquier tarea de programacion que puedapensarse.

Page 23: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

No optimice el codigo demasiado

Los que aprenden programacion deben preocuparselo primero por escribir codigo legible y correcto, queproduzca los resultados deseados. Existen muchostrucos de programacion que hacen el codigo masrapido y eficiente, pero deben dejarse para masadelante en la carrera de programador.

No sacrifique la claridad de programacion en unesfuerzo por hacer el codigo mas rapido. La claridaddel codigo es preferible a la optimizacion del mismocuando los dos criterios entran en conflicto.

Page 24: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Otras cuestiones mas concretas

(Se hara referencia a Python.)

Page 25: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Calculo de sumas

En Python existe una funcion dentro de Numpypara realizar sumas. Usese la misma siempre que seaposible.

Cuando se deba sumar una larga lista de numerosreales en coma flotante se produce menor error deredondeo si los numeros se suman en orden demagnitud creciente (aunque ello requiere un bucle, loque alarga la ejecucion en lenguajes interpretados).

Page 26: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Constantes matematicas

En ocasiones se deben usar constantes matematicascomo π y e. Algunos lenguajes no las tienen definidas,pero el modulo Scipy de Python sı.

Otras constantes se pueden calcular a partir de sudefinicion, pero en otros casos hay que teclearlas:hagalo (copiandolas de la referencia bibliograficacorrespondiente) con la maxima precision posible yel maximo cuidado.

Page 27: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Exponentes 1/2

Debe tenerse cuidado al escribir expresiones queincluyan exponentes. La funcion general yx secalcula en muchos lenguajes como exp(x ln y),independientemente de si x es o no entero.

Cuando x es entero es preferible utilizar otro metodo.Por ejemplo, x3 = xxx, y x puede ser positivo onegativo (con la expresion que incluye el logaritmo elordenador darıa error).

Page 28: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Exponentes 2/2

En ocasiones se tiene que calcular i = (−1)k, con kentero, debiendo evitarse esa exponenciacion.

Si esa expresion aparece en un bucle, se debe haceri = 1 en el exterior del bucle, antes de comenzarlo, ydespues en el interior hacer i = −i.

En Python se calcula en una sola lınea de codigo:

i = 1 if k%2 == 0 else −1

Page 29: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Evite mezclar modos

En general, se debe evitar mezclar numeros enterosy numeros reales en las expresiones. Para usar unavariable entera n en una expresion con numeros realesse deberıa utilizar una funcion de conversion comofloat(n).

En calculos en coma flotante en Python, m/n,con m y n enteros, debe calcularse comofloat(m)/float(n). Asimismo 1/m debe codificarsecomo 1/float(m) (1.0/m tambien valdrıa), 1/2como 0.5, etc.

Page 30: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Precision

Use siempre que sea posible doble precision (floaten Python). Casi siempre son suficientes sus 17cifras significativas (aunque parezca que no en ciertoscalculos).

Page 31: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Accesos a memoria 1/2

En los bucles escriba el codigo de manera quelos accesos a memoria se realicen sobre posicionesadyacentes.

Fortran guarda los elementos de la matriz n × m,a(i,j) haciendo variar el primer ındice, esto es,guarda de manera consecutiva a(1,1), a(2,1),a(3,1), . . . , a(n,1), a(1,2), a(2,2), a(3,2), . . . ,a(n,2), . . . .

C lo hace al reves, variando primero el ultimo ındice.

Page 32: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Accesos a memoria 2/2

Por defecto Python utiliza la manera de C paraguardar los vectores (listas) mutidimensionales,mientras que Numpy utiliza la manera de Fortran.Solo en caso de disenar rutinas en uno de estoslenguajes compilados para llamarlas desde Pythondebemos preocuparnos de estas cuestiones.

Page 33: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Cuando evitar vectores 1/3

Aunque la descripcion matematica de un algoritmoindique que se calcula una secuencia de valores, estono implica obligatoriamente que necesitemos guardarlos valores calculados en un vector

A menudo es posible evitar el uso de vectores. Estoes especialmente cierto cuando solo necesitamos elultimo valor (o varios de los ultimos) de la secuencia.

Page 34: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Cuando evitar vectores 2/3

Por ejemplo, la descripcion teorica del metodo deNewton para determinar ceros de funciones dice:

xn+1 = xn −f(xn)

f ′(xn),

pero el pseudocodigo puede ser escrito en un buclesimplemente.

Page 35: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Cuando evitar vectores 3/3

Por ejemplo, (en Python):

for n in range(10):x −= f(x)/fp(x)

donde x es una variable real y f y fp son funcionesreales de variables reales (que deben aparecer en elcodigo en alguna parte). La asignacion del interior delbucle efectua automaticamente el reemplazamientodel viejo valor de x por el nuevo x− f(x)/fp(x).

Page 36: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Limite las iteraciones 1/3

En un algoritmo repetitivo debe limitarse siempre elnumero de pasos permitidos usando un bucle convariable de control, para prevenir bucles infinitoscausados por problemas no previstos. Ejemplo:

d = f(x)/fp(x)while abs(d) > 0.5e−6:

x −= dprint(x)d = f(x)/fp(x)

Page 37: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Limite las iteraciones 2/3

Si la funcion tiene un comportamiento raro, entonceses peligroso no limitar el numero de iteraciones. Esmejor usar un bucle controlado por una variable:

for n in range(n max ):d = f(x)/fp(x)x −= dprint(x)if abs(d) <= 0.5e−6: break

donde n max es el numero maximo de iteraciones.

Page 38: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Tenga cuidado con la igualdad de reales 1/3

La secuencia de pasos de un programa no debedepender de la igualdad de dos numeros reales decoma flotante.

En su lugar se deben utilizar tolerancias razonablesque nos permitan tener en cuenta los inevitableserrores de redondeo.

Page 39: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Tenga cuidado con la igualdad de reales 2/3

Por ejemplo una instruccion adecuada de salto con ndıgitos decimales de error puede ser (en Python):

if abs(x− y) < ǫ: . . .

suponiendo que x e y sean de magnitud comparablea 1. Aquı x, y y ǫ son variables reales con ǫ =1

2× 10−n.

Page 40: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Tenga cuidado con la igualdad de reales 3/3

La expresion anterior chequea si x e y se diferencianen un error absoluto menor que ǫ. Sin embargo si xe y tienen diferente orden de magnitud que 1, debeusarse el error relativo entre x e y:

if abs(x− y) < ǫ ∗max(abs(x), abs(y)): . . .

Page 41: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Pasos iguales con coma flotante 1/4

In algunas situaciones, notablemente al resolvernumericamete ecuaciones diferenciales, una variablet debe adquirir valores igualmente espaciados ensucesion, separados h a lo largo del eje real.

Page 42: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Pasos iguales con coma flotante 2/4

Una manera de hacer esto es (en Python):

t = t0print(0, t)for i in range(1, n+ 1):

...t += hprint(i, t)

Aquı i y n son variables enteras, y t0, t y h sonvariables reales.

Page 43: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Pasos iguales con coma flotante 3/4

Una alternativa es:

for i in range(n+ 1):t = t0 + float(i) ∗ hprint(i, t)...

En el primer codigo se realizan n sumas, cada unacon un cierto error de redondeo. El valor final de tcasi nunca valdra t0 + nh.

Page 44: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Pasos iguales con coma flotante 3/4

En la segunda situacion se evita ese problema a costade realizar n multiplicaciones. Que metodo de los doses mejor depende de cada problema particular. Si nonos importa que los valores de t sigan exactamente lasecuencia t0+ih (y lo tenemos presente en el codigo)entonces es mejor el primer metodo.

No obstante, Python y Numpy permiten generarvectores y arrays mediante las funciones arange ylinspace, que seran en todo caso preferidas.

Page 45: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Evaluacion de funciones 1/2

A veces se necesitan valores de funciones determinadasen puntos arbitrarios. Por ejemplo, supongamos quenecesitamos determinar valores de la funcion:

f(x) = 2x+ log x− sin x.

Un metodo simple es usar una instruccion de la forma:

y = 2x+ log(x)− sin(x)

en lugares apropiados del codigo dentro del programa.Aquı x e y son variables reales.

Page 46: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Evaluacion de funciones 2/2

Sin embargo, cuando la llamada a esa funcion se vaa repetir en varios puntos del programa es preferibledefinir una funcion (en Python):

def f(x):return 2 ∗ x+ log(x)− sin(x)

¿Que implementacion es la mejor? Depende de lasituacion. La forma con una asignacion unica essimple y segura. Una funcion es util para evitar repetircodigo.

Page 47: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Evite usar potencias al evaluar polinomios 1/3

La evaluacion de potencias es costosa frentea la multiplicacion. Por ello, en el calculo deexpresiones polinomicas (que aparecen a menudoen programacion) se debe utilizar la ‘multiplicacionanidada’. Para evaluar el polinomio:

p(x) = a0 + a1x+ a2x2 + · · ·+ an−1x

n−1 + anxn,

se deben agrupar los terminos para permitir lamultiplicacion anidada:

p(x) = ((((anx+an−1)x+ · · · )x+a2)x+a1)x+a0.

Page 48: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Evite usar potencias al evaluar polinomios 2/3

El pseudocodigo para evaluar p(x) comienza con elparentesis mas interior y trabaja hacia afuera. EnPython, si a esta definido como una lista de longitudn+ 1, se tendrıa (conocidos x, a y n):

p = a[n]for i in range(n− 1,−1,−1):

p = p ∗ x+ p[i]print(p)

Page 49: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Evite usar potencias al evaluar polinomios 3/3

Al final del algoritmo el valor de p contiene elvalor evaluado del polinomio. Hemos visto que no seutilizan potencias sino multiplicaciones y sumas. Esemetodo se denomina regla de Horner o de Rufini, ytambien multiplicacion anidada o sintetica.

No obstante, en Numpy se pueden (y deben) usarrutinas especıficas para trabajar con polinomios.

Page 50: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Errores en los calculos

Page 51: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Errores absolutos y relativos

(Veanse los apuntes.)

Page 52: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Evite restar numeros muy proximos en comaflotante 1/3

Cuando se restan dos numeros muy proximos en comaflotante se pierden muchas cifras significativas.

Ejemplo: x1 = 0.1234567891 y x2 = 0.1234567834,cada uno de ellos con 10 cifras significativas. Sudiferencia:

y = x1 − x2 = 0.0000000057

tiene solo 2 cifras significativas.

Page 53: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Evite restar numeros muy proximos en comaflotante 2/3

Un ejemplo que se suele poner es la resolucion de laecuacion de segundo grado (con raices reales):

ax2 + bx+ c = 0,

cuya solucion general habitual es:

x12 =−b±D

2a, D =

√b2 − 4ac,

Page 54: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Evite restar numeros muy proximos en comaflotante 3/3

Cuando, por ejemplo, c es muy pequeno, producegrandes errores. (Se puede probar con a = 1, b = 0.1,c = −8 × 10−17.)

Para evitar restar b y D, la formula anterior debeusarse con el signo de D igual al de −b, por ejemplo:

D = sqrt(b∗∗2− 4 ∗ a ∗ c)t = −0.5 ∗ (b+D) if b >= 0 else −0.5 ∗ (b−D)x1, x2 = t/a, c/t

Page 55: Aspectospr´acticosdeprogramaci´oncient´ıfica · Universidad de Oviedo Departamento de F´ısica Grado en F´ısica Introduccio´n a la F´ısica Computacional Curso 2014–15

Redondeado y truncado

(Veanse los apuntes.)