XSIforum.com

Formulas matematicas, del papel al codigo.

0 Usuarios y 1 Visitante están viendo este tema.

Formulas matematicas, del papel al codigo.
« en: 04 Febrero 2014, 09:33:27 »
Bueno... pues creo que es justo reconocer que no me ha sido nada facil decidirme por el problema o tarea a plantear. La primera cuestión viene al hilo del comentario sobre la probable participación en estos ejercicios dado que no es un tema muy 'popular'. Eso me ha hecho desestimar la primera idea que tenia para plantear, por ser en efecto, demasiado especifica y, aunque relacionada con el 3D, creo que no muy habitual.
Bien.. Intentare empezar con algo simple para que puedan participar el mayor numero posible de usuarios.
La idea se podría plantear así:
    -como pasar formulas matemáticas, del 'papel' al código del programa.
Cuando queremos añadir una nueva funcionalidad a una aplicación que estemos haciendo, es normal tener que echar mano de algún 'technical paper', muy típicos de Pixar o Siggraph y encontrarnos formulas así..

 
Bien mirada no es gran cosa y hasta para alguien con matematicas de 7º de EGB, parece simple de pasar a C++ :  A = 1 + Fdr / 1 - Fdr;  donde A y Fdr son valores flotantes, (un numero con  decimales)  o  del tipo 'float', en C++.
Y ahora, resolvemos una un pelin más compleja...?


Donde 'Fdr' es el valor 'float' que usamos antes y el signo 'n' es otro float que suele el valor del 'index of refraction' abreviado como 'IOR' o 'eta'.
Alguien se anima?
Espero que lo encontréis más o menos interesante. Aunque quizás para algunos sea ‘pan comido’.
Saludos..
« Última modificación: 04 Febrero 2014, 11:09:33 por povmaniaco »

gorka

  • **
  • 509
Re:Formulas matematicas, del papel al codigo.
« Respuesta #1 en: 04 Febrero 2014, 09:59:02 »
Gracias povmaniaco, me acabo de dar cuenta lo ignorante que soy. xDDDDD

agedito

  • ***
  • 1524
  • ¡¡Yo lo que quiero es milonguear!!
Re:Formulas matematicas, del papel al codigo.
« Respuesta #2 en: 04 Febrero 2014, 10:10:04 »
Antes de nada, corregir un error en el enunciado. En cualquier lenguaje de programación los operadores tienen una prioridad, y en C++ (y en casi todos) la multiplicación es más prioritaria que la suma, así que para implementar la fórmula, tenemos que priorizar las sumas con paréntesis:
A = (1 + Fdr)/(1 - Fdr);

Porque si no:
A = 1 + Fdr/1 -Fdr sería A = 1 + (Fdr/1) -Fdr  = 1 + Fdr - Fdr = 1

La fórmula del problema es parecida, la dejo para los que están comenzando.

Otra anotación importante, no se puede dividir por cero )ni en matemáticas y en informática casi aún menos), por lo tanto hay que tener eso en cuenta (qizás en la adquisición del valor Fdr o n en la segunda fórmula.

Re:Formulas matematicas, del papel al codigo.
« Respuesta #3 en: 04 Febrero 2014, 11:27:03 »
Agedito: Más razon que un santo.. El primer enunciado ha sido 'mal copiado', porque de hecho, esta implementado tal como dices:
Código: [Seleccionar]
/* Term of dipole boundary condition distance.
     represents the change in fluence due to internal reflection at the surface */
    float A = (1+Fdr)/(1-Fdr);
Saludos..

Re:Formulas matematicas, del papel al codigo.
« Respuesta #4 en: 04 Febrero 2014, 15:28:32 »
Probablemente no tenga mucho sentido expresarlo en python pero...
Código: [Seleccionar]
A = lambda Fdr: (1 + Fdr) / (1 - Fdr)
Fdr = lambda n: 1.440 / n ** 2 + 0.710 / n + 0.0636 * n + 0.668

agedito

  • ***
  • 1524
  • ¡¡Yo lo que quiero es milonguear!!
Re:Formulas matematicas, del papel al codigo.
« Respuesta #5 en: 04 Febrero 2014, 16:49:26 »
Amplio un poco más la cosa ¿y si quisiéramos ganar unos milisegundos?
Aunque se puede hacer con la fórmula que ha planteado povmaniaco, quizás es más fácil empezar con esta:



¿Como se puede escribir para que el cálculo sea más rápido?
No es solo teórico, es algo que se usa cuando un cálculo se repite miles o millones de veces (yo lo estoy usando en el tileador)

P.D: Las funciones de lambda son lo que más me gusta de python
« Última modificación: 04 Febrero 2014, 17:09:21 por agedito »

Re:Formulas matematicas, del papel al codigo.
« Respuesta #6 en: 04 Febrero 2014, 17:23:22 »
Muy interesante lo de ganar aunque sea milisegundos, ya que esta operación está dentro de un loop, que se repite por ejemplo, por cada foton de luz trazado en la escena.. osea, millones de veces :)
Cesar, ya me has dado deberes: repasar las funciones lambda de python  :o

Re:Formulas matematicas, del papel al codigo.
« Respuesta #7 en: 04 Febrero 2014, 18:38:25 »
Creo que lo tengo! :)

P(x) = x * (x * (2 * x + 3) + 5) + 8

Código: [Seleccionar]
from timeit import timeit

print timeit('[x * (x * (2 * x + 3) + 5) + 8 for x in range(100)]', number=10000)  # 0.169502451164
print timeit('[2 * x ** 3 + 3 * x ** 2 + 5 * x + 8 for x in range(100)]', number=10000)  # 0.251716987485

agedito

  • ***
  • 1524
  • ¡¡Yo lo que quiero es milonguear!!
Re:Formulas matematicas, del papel al codigo.
« Respuesta #8 en: 04 Febrero 2014, 18:44:28 »
Efectivamente, premio para el caballero:
De la forma clásica serían: 3 sumas, 3 multiplicaciones y 2 potencias
usando la propiedad distributiva (para que veáis que lo que enseñaban en la escuela servía para algo :p) serían: 3 sumas y 3 multiplicaciones. Por lo que nos ahorramos las potencias.
Cuando estamos dentro de bucles grandes, se nota



Re:Formulas matematicas, del papel al codigo.
« Respuesta #9 en: 05 Febrero 2014, 11:53:41 »
Despues de leerme todo el hilo, lo unico que ha pasado por mi cabeza ha sido: "Vale, me voy al pub".

pd: muy interesante todo.

agedito

  • ***
  • 1524
  • ¡¡Yo lo que quiero es milonguear!!
Re:Formulas matematicas, del papel al codigo.
« Respuesta #10 en: 05 Febrero 2014, 12:10:36 »
Despues de leerme todo el hilo, lo unico que ha pasado por mi cabeza ha sido: "Vale, me voy al pub".
:p

Re:Formulas matematicas, del papel al codigo.
« Respuesta #11 en: 05 Febrero 2014, 20:11:31 »
Efectivamente, premio para el caballero:
De la forma clásica serían: 3 sumas, 3 multiplicaciones y 2 potencias
usando la propiedad distributiva (para que veáis que lo que enseñaban en la escuela servía para algo :p) serían: 3 sumas y 3 multiplicaciones. Por lo que nos ahorramos las potencias.
Cuando estamos dentro de bucles grandes, se nota




Genial.. porque tengo unas cuantas más dentro del mismo bucle.. asi que más deberes ( Google search "propiedad distributiva").
Porque a ver.. aplicando eso a 'mi' propuesta de ejercicio, que esta implementada asi*:
Código: [Seleccionar]
float IOR = 1.3; // (1)
float Fdr = -1.440  / (IOR*IOR)+ 0.710  / IOR + 0.668 + 0.0636 * IOR;
*No la implementé yo, si no un estudiante chino, en el GSOC 2010.
(1)  este es un valor introducido por el usuario, pero que pongo aqui para saber el valor de IOR dentro de la operación.
Veamos.. Realmente la función Fdr ( Fressnel diffuse reflection ) se resuelve matematicamente, pero aqui han introducido los valores ponderados de algunas variables, para optimizar un poco el código dentro del loop.
Deberes: estudiar como aplicar las propiedades distributivas a Fdr.. y a otras por el estilo.
:)
Saludos


agedito

  • ***
  • 1524
  • ¡¡Yo lo que quiero es milonguear!!
Re:Formulas matematicas, del papel al codigo.
« Respuesta #12 en: 05 Febrero 2014, 21:02:51 »
float Fdr = (-1.440 /IOR+ 0.710)  / IOR + 0.668 + 0.0636 * IOR;

aquí solo te ahorras una multiplicación (por eso puse el ejemplo del polinomio que era más notable el cambio)

Re:Formulas matematicas, del papel al codigo.
« Respuesta #13 en: 05 Febrero 2014, 22:20:29 »
float Fdr = (-1.440 /IOR+ 0.710)  / IOR + 0.668 + 0.0636 * IOR;

aquí solo te ahorras una multiplicación (por eso puse el ejemplo del polinomio que era más notable el cambio)

Aha.. Mi intención es 'aprender' el metodo en cuestión, ya que como dije, hay unas cuantas ecuaciones más que creo que entendiendo lo de las propiedades distributivas, puedo optimizarlas y ahorrar algo de tiempo de proceso.
:)

Re:Formulas matematicas, del papel al codigo.
« Respuesta #14 en: 06 Febrero 2014, 21:25:15 »
Bien.. Agedito,  he comprobado tu metodo de ahorrarse una multiplicación, con Python 3.3.2 y, solo me da una pequeña variacion en el 16-avo decimal.
Tal cual está:
Código: [Seleccionar]
IOR = 1.3
Fdr = -1.440  / (IOR*IOR)+ 0.710  / IOR + 0.668 + 0.0636 * IOR
0.44476284023668644


Con tu método:
Código: [Seleccionar]
IOR = 1.3
Fdr = (-1.440 /IOR+ 0.710)  / IOR + 0.668 + 0.0636 * IOR
0.44476284023668655

Creo que la 'impresición' es mínima y el ahorro de tiempo puede ser importante, ya que esa operacion se ejecuta muchas veces en cada render :)
Que opinais?
« Última modificación: 07 Febrero 2014, 18:54:01 por povmaniaco »