Autor |
Mensaje |
Coudet
Nivel 6
Edad: 34
Registrado: 29 Nov 2009
Mensajes: 294
Carrera: Mecánica
|
|
Buenas, tengo una duda con un ejercicio de pascal: se trata de un programa de pascal que tiene que calcular la derivada por medio de una aproximación de una secante a la función, para eso el usuario ingresa los coeficientes del polinimio y el punto donde quiere calcular la derivada. La cuestión en realidad es que para ese método me hace falta un "error" de aproximación, y esa aproximación, dice el enunciado, "debe ser la óptima para valores almacenados en simple precisión".
En fin, el programa ya lo tenemos prácticamente hecho, puede calcular la derivada y eso, el problema es que no confiamos en lo que pusimos como aproximación y he ahí la duda.
Lo que planteamos en un principio, no sabemos si erróneamente o no, es que por ser en simple precisión está guardado en 8 bits, y pensamos en el número decimal de 8 bits de menor módulo posible, lo cual nos da el 2^(-7) en decimal (0,0078125) pero descreemos que eso esté bien, ¿qué dicen?
|
|
|
|
_________________ -----
La Biblioteca de Apuntes está formada por y para alumnos de FIUBA, colaboremos entre todos para que resulte lo más útil y completa posible.
http://www.taringa.net/posts/ciencia-educacion/10489413/Biblioteca-de-Apuntes---FIUBA.html
|
|
|
|
|
Sebastian Santisi
Administrador Técnico
Edad: 42
Registrado: 23 Ago 2005
Mensajes: 17451
|
|
Pascal... ¿TurboPascal?; es un compilador de 16bits, ni idea cómo represente.
El estándar para números de punto flotantes es el IEEE-754, ahí los números de simple precisión son de 32 bits.
Acá tenés la representación: http://materias.fi.uba.ar/7502E/ieee.html
No sé en la implementación del compilador que estés usando si se usan esos o alguna cosa propia de Pascal no soportada a nivel hardware.
|
|
|
|
_________________
|
|
|
|
|
memovidal10
Nivel 4
Edad: 34
Registrado: 16 Mar 2009
Mensajes: 98
Carrera: Industrial
|
|
Es en el FreePascal
Nosotros queremos calcular la derivada de un polinomio de grado 4 por medio de la aproximación secante a la función. Nosotros planteamos [p(x)-p(x+h)]/h
pero como pascal no permite usar limite de h tendiendo a 0, lo que queremos es tomar el valor mas pequeño de h para que la aproximación sea la optima en valores almacenados en simple precisión. Pensamos en darle a H el valor mas pequeño que se pueda almacenar en simple precisión. Es correcto eso? En ese caso, cual es el numero mas pequeño en simple precisión?
Gracias por la respuesta!
|
|
|
|
|
|
|
|
|
Sebastian Santisi
Administrador Técnico
Edad: 42
Registrado: 23 Ago 2005
Mensajes: 17451
|
|
La parte numérica, ni idea, toco de oido.
Del enlace que te pasé, el simple más pequeño es ... de todos modos, tomá en cuenta que el épsilon entre dos números varía según entre qué número y qué número esté (o sea, cuanto más grande lo que representás, más grande la distancia entre valores distintos).
Si sabés de qué orden es el exponente del simple en los valores con los que estás operando, del tamaño de la mantisa deberías poder obtener cuánto vale el épsilon para ese rango.
|
|
|
|
_________________
|
|
|
|
|
MirianQ
Nivel 8
Edad: 35
Registrado: 29 Feb 2008
Mensajes: 675
Ubicación: Siempre desvirtuando... siempre.
Carrera: Electrónica y Informática
|
|
http://sistemas.itlp.edu.mx/tutoriales/pascal/u2_2_5.html
Hay estan los rangos de los ipos de datos en Pascal.
Y yo calculo que esta bien lo que decis de darle a h el valor mas pequeño represntable con ese tipo de dato que usas. Ahora pensa igual que el resultado tambien deberia poder almacenarse en una variable que lo pueda contener. A lo que voy, si usas un real para almacenar el resultado, como es simple precision, fijate que el resultado entre en esa variable. De lo contrario podrias usar doble precision.
Quizas si le das a h un valor tan chico, el resultadpo no te entre en la variable que querias guardar.
|
|
|
|
_________________
|
|
|
|
|
memovidal10
Nivel 4
Edad: 34
Registrado: 16 Mar 2009
Mensajes: 98
Carrera: Industrial
|
|
Mirian entiendo lo que decis... El enunciado dice que el valor alcanzazo "debe ser el optimo para valores almacenados en simple precisión"... Es eso lo que no termino de entender, como logro que sea el optimo? Tomo el valor mas chico de h? Probe con 1,5E-45 y todas las derivadas que calculo me dan 0...
|
|
|
|
|
|
|
|
|
Sebastian Santisi
Administrador Técnico
Edad: 42
Registrado: 23 Ago 2005
Mensajes: 17451
|
|
|
|
|
Coudet
Nivel 6
Edad: 34
Registrado: 29 Nov 2009
Mensajes: 294
Carrera: Mecánica
|
|
Paso el enunciado en limpio por si no se llega a entender: Realizar un programa que calcule el valor de la derivada de la función AX^4+BX^3+CX^2+DX+E. Por medio de una aproximación de una secante a la función. El usuario debe poder elegir el punto y la aproximación debe ser la óptima para valores almacenados en simple precisión.
Es eso: y sin ánimo de confundir quiero agregar que ya hicimos el programa que calcula las derivadas con el método que pide ahí, pero la aproximación que usamos debe estar mal, esa es la duda, cuál es el "h" mencionado en el mensaje de memo que tendríamos que usar. Mas que nada teniendo en cuenta también que usando h = 1E-38 (valor sacado de la página que linkeó MirianQ) nos da siempre cero la derivada
|
|
|
|
_________________ -----
La Biblioteca de Apuntes está formada por y para alumnos de FIUBA, colaboremos entre todos para que resulte lo más útil y completa posible.
http://www.taringa.net/posts/ciencia-educacion/10489413/Biblioteca-de-Apuntes---FIUBA.html
|
|
|
|
|
Sebastian Santisi
Administrador Técnico
Edad: 42
Registrado: 23 Ago 2005
Mensajes: 17451
|
|
El tema es lo que dije sobre el tema de la representación.
Los flotantes funcionan como mantisa y exponente; cuanto más grande el exponente, la mantisa, en valores absolutos rinde menos.
Estás haciendo varias operaciones. Es importante en primer lugar que y que . Si esas dos cosas no se cumplen, entonces los dos números son indistinguibles y obviamente te va a dar cero. El problema no es por la h dividiendo, es por la suma y por la evaluación del polinomio.
Tu épsilon depende del tamaño del exponente. El valor más chico que vas a tener para cada exponente es en el que la mantisa sea 1.0000000...0001 (en binario).
|
|
|
|
_________________
|
|
|
|
|
Spike Spiegel
Nivel 9
Edad: 36
Registrado: 10 Ago 2007
Mensajes: 1507
Carrera: Informática
|
|
Es un error numérico llevar h al mínimo posible. Cuando digo numérico, me refiero a lo relacionado con Análisis Numérico.
Cuando te pide que la aproximación sea óptima, te está pidiendo que uses el h que minimice la cota de error, creo.
No sé, me suena extraño/ridículo que pidan cosas así existiendo una materia específica para ver el tema.
|
|
|
|
_________________
|
|
|
|
|
MirianQ
Nivel 8
Edad: 35
Registrado: 29 Feb 2008
Mensajes: 675
Ubicación: Siempre desvirtuando... siempre.
Carrera: Electrónica y Informática
|
|
Que te de cero, lo unico que me dice es que al calcular x y x+h, te esta dando igual... eso se debe a que el h que le estas sumando a x es muy chiquito y no es representable y/o significativo para la operacion matematica. Proba con un h mas o menos grande , un 0.05 y anda bajando hasta que te de algo razonable.
Nosotros en numerico usabamos un h = 0.05 -o de ese orden - , porque si te ibas mas abajo habia errores o cosas locas que no contribuian a la estabilidad del algoritmo (o algo asi, que se yo).
EDIT: uds dos muy universitarios, yo lo explique como maestra jardinera
|
|
|
|
_________________
|
|
|
|
|
Sebastian Santisi
Administrador Técnico
Edad: 42
Registrado: 23 Ago 2005
Mensajes: 17451
|
|
MirianQ escribió:
|
Que te de cero, lo unico que me dice es que al calcular x y x+h, te esta dando igual... eso se debe a que el h que le estas sumando a x es muy chiquito y no es representable y/o significativo para la operacion matematica. Proba con un h mas o menos grande , un 0.05 y anda bajando hasta que te de algo razonable.
Nosotros en numerico usabamos un h = 0.05 -o de ese orden - , porque si te ibas mas abajo habia errores o cosas locas que no contribuian a la estabilidad del algoritmo (o algo asi, que se yo).
|
El problema depende del valor de x.
Ejemplo, de la consola de Python (usa doubles, IIRC):
Código:
|
>>> 0.05 + 100000000000000
100000000000000.05
>>> 0.05 + 1000000000000000
1000000000000000.0
>>> '%.8f' % (0.05 + 100000000000000)
'100000000000000.04687500'
>>> '%.8f' % (0.05 + 1000000000000000)
'1000000000000000.00000000'
>>>
|
Eso sólo para la parte x + h; después, de los valores de A, B, C y D dependerá el valor del polinomio y si no se rompe ahí también.
La solución, de todos modos, es posible; pero implica hacer manejos de bit y creo que está fuera del alcance.
El enunciado tiene algo mal condicionado; o esperan que la respuesta sea: Para valores de x, A, B, C y D entre tal y tal, el valor de h funciona.
|
|
|
|
_________________
|
|
|
|
|
memovidal10
Nivel 4
Edad: 34
Registrado: 16 Mar 2009
Mensajes: 98
Carrera: Industrial
|
|
El usuario elije los valores de A, B, C, D y E... Y el punto en el que desea conocer la derivada... El valor de h depende de lo que elija el usuario dicen? Porq yo en el algoritmo lo puse como una constante y voy probando... Con 1E-7, 1E-8 funciona y da valores bien aproximados ... El tema es que no se si respeta lo que pide el enunciado de aproximacion optima a simple precision...
|
|
|
|
|
|
|
|
|
4WD
Administrador
Edad: 39
Registrado: 07 Sep 2006
Mensajes: 2430
Ubicación: Ingeniero
Carrera: Mecánica
|
|
Bueno, la respuesta ya más o menos te la respondieron entre todos, pero la ordeno un poco...
Tenés que minimizar el error y supongo que la fórmula que estás usando es , así que el error es de orden 1 (orden h). Si es alguna otra fórmula loca, es una potencia. No importa, lo importante es que tenés que hacer tan pequeño como sea posible. Desde ese punto de vista, lo ideal es el mínimo que puedas representar (1e-38?).
Pero esa no es toda la restricción. También tenés que calcular y que te dé distinto de . Eso no es tan fácil y representa una restricción adicional a la anterior.
A diferencia de punto fijo (o coma), donde los intervalos entre dos números que se pueden representar son regulares, en punto flotante, la grilla no es regular. Es decir, la separación se va agrandando cuanto más grandes son los números (@SS: el se agranda; se suele usar para lo relativo, que es constante en punto flotante). Por eso la diferencia entre dos números que se pueden representar dependen del número que se trate.
Para resolver esto se define la unidad de máquina () que permite acotar ese error de representación. La expresión de se puede demostrar que es , donde es la cantidad de dígitos de la mantisa con la que estás trabajando, cuando se hace con redondeo. Capaz se podría hacer alguna acotación más fina pero no tiene sentido en este caso.
Lo que tenés que hacer es definir como constante y no (necesitás buscar cuántos dígitos de mantisa tiene el tipo de dato). Entonces, una vez que el usuario ingresó el donde quiere calcular la derivada, calculás .
Probá con varios valores de verificar que con eso efectivamente se cumpla que sea distinto de . Ese es el valor (en realidad es una cota bastante buena) mínimo que podés tomar para y poder calcular la derivada sin que se anule el numerador.
Esto se da en la unidad I de Análisis Numérico I y no tendrían por qué saberlo. Ergo, deberían haberlo explicado cuando presentaron el TP...
Saludos
|
|
|
|
_________________
|
|
|
|
|
memovidal10
Nivel 4
Edad: 34
Registrado: 16 Mar 2009
Mensajes: 98
Carrera: Industrial
|
|
Buenisimo! Muchas Gracias, ahora me cerro todo... Declare como constante MU, por lo que tengo entendido, la mantisa de un numero real almacendo en simple precisión ocupa 23 bits... O sea que MU=0.5E-22... Probé con ese pero parece que ese valor hace que x=x+h.
Me gustaría averiguar cuanto ocupa la mantisa de un numero real almacenado en simple precisión en el FreePascal, probe con MU=0,5E-10 y funca perfecto! Pero no se si la mantiza ocupa 11 bits... En fin, otra duda, yo uso la funcion [f(x)-f(x-h)]/h y el signo de la derivada me da bien, pero cuando uso x+h me da el signo al reves... Muchas gracias a todos por las respuestas claras y rápidas, raro que nos pidan esto cuando ni lo vimos... Saludos!
|
|
|
|
|
|
|
|
|
|
Ir a página 1, 2 Siguiente
|
Ver tema siguiente
Ver tema anterior
Podés publicar nuevos temas en este foro No podés responder a temas en este foro No podés editar tus mensajes en este foro No podés borrar tus mensajes en este foro No podés votar en encuestas en este foro No Podéspostear archivos en este foro No Podés bajar archivos de este foro
|
Todas las horas son ART, ARST (GMT - 3, GMT - 2 Horas)
Protected by CBACK CrackerTracker365 Attacks blocked.
|