Autor Tema: Ecuación para modelar una botella de agua

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

26 Enero, 2024, 08:46 pm
Leído 174 veces

DaniM

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 207
  • País: cz
  • Karma: +0/-0
Me he topado con este post en Reddit donde un usuario ha representado esta botella de agua en Desmos:


Para ello ha usado la siguiente ecuación:

\(
r = \left(\frac{-0.286057}{2.10693z-0.108607} + 2.02014\right) \left(\left(1 - \frac{2\left(z-1.9776\right)}{\left(0.1188-1.9776\right)}\right)^{10^{10}} + 1\right)^{-1} \\
+ \left(-0.0111558\tan^{-1}\left(93.0395z-192.421\right) + 1.93344\right) \left(\left(1 - \frac{2\left(z-2.1\right)}{\left(1.9776-2.1\right)}\right)^{10^{10}} + 1\right)^{-1} \\
+ 1.9196 \left(\left(1 - \frac{2\left(z-2.5945\right)}{\left(2.1-2.5945\right)}\right)^{10^{10}} + 1\right)^{-1} \\
+ \left(0.1173 \sum_{i=0}^{5} \left(\left(1 - \frac{2\left(\left(4.77z-10.36\right) - \left(-\cos^{-1}\left(0.864^{\frac{1}{6}}\right)+\left(i+1\right)\pi\right)\right)}{\left(\left(\cos^{-1}\left(0.864^{\frac{1}{6}}\right)+i\pi\right) - \left(-\cos^{-1}\left(0.864^{\frac{1}{6}}\right)+\left(i+1\right)\pi\right)\right)}\right)^{10^{10}} + 1\right)^{-1} \left(-\cos\left(4.77z-10.36\right)^{6}+0.864\right) + 1.819\right) \\
+ \left(0.1173 \sum_{i=0}^{2} \left(\left(1 - \frac{2\left(\left(4.77z-10.36\right) - \left(-\cos^{-1}\left(0.864^{\frac{1}{6}}\right)+\left(i+1\right)\pi\right)\right)}{\left(\left(\cos^{-1}\left(0.864^{\frac{1}{6}}\right)+i\pi\right) - \left(-\cos^{-1}\left(0.864^{\frac{1}{6}}\right)+\left(i+1\right)\pi\right)\right)}\right)^{10^{10}} + 1\right)^{-1} \left(-\cos\left(4.77z-36.8\right)^{6}+0.864\right) + 1.874\right) \\
+ \left(\left(1 - \frac{2\left(z-5.715\right)}{\left(2.5945-5.715\right)}\right)^{10^{10}} + 1\right)^{-1} + \left(0.0149162\tan^{-1}\left(74.4986z-462.793\right) + 1.93244\right) \left(-0.009z + 1.057\right) \\
+ \left(\left(1 - \frac{2\left(z-6.475\right)}{\left(5.715-6.475\right)}\right)^{10^{10}} + 1\right)^{-1} + \left(0.185201\sin\left(4.44755z-14.7007\right)^{3} + 1.76787\right) \left(\left(1 - \frac{2\left(z-7.827\right)}{\left(6.475-7.827\right)}\right)^{10^{10}} + 1\right)^{-1} \\
+ \left(\left(1 - \frac{2\left(z-9.368\right)}{\left(7.827-9.368\right)}\right)^{10^{10}} + 1\right)^{-1} + \left(-3.4754\times10^{11}e^{-4.44482z}\cdot z^{5.7976} - 0.00000128717z^{5.7976} + 2.65169\right) \\
+ \left(\left(1 - \frac{2\left(z-11.624\right)}{\left(9.368-11.624\right)}\right)^{10^{10}} + 1\right)^{-1} + \left(\frac{0.000676371}{0.760976z-8.81051} + 0.7\right) \left(\left(1 - \frac{2\left(z-12.026\right)}{\left(11.624-12.026\right)}\right)^{10^{10}} + 1\right)^{-1} \\
+ \left(0.0488948\sec\left(-47.006z+553.729\right) + 0.609895\right) \left(\left(1 - \frac{2\left(z-12.07655\right)}{\left(12.026-12.07655\right)}\right)^{10^{10}} + 1\right)^{-1} \\
+ \left(41.5116z^{4} - 1512.49z^{3} + 18377.9z^{2} - 74576.6z + 1299.68\right) \left(\left(1 - \frac{2\left(z-12.226\right)}{\left(12.07655-12.226\right)}\right)^{10^{10}} + 1\right)^{-1} \\
+ \left(\frac{0.00763208}{z-13.1178} + 0.813235\right) \left(\left(1 - \frac{2\left(z-13.108\right)}{\left(12.226-13.108\right)}\right)^{10^{10}} + 1\right)^{-1}
 \)

Una manera de hacerlo es definir una función a trozos en el que cada trozo es una función que rota alrededor de un eje y representa una sección de la botella, pero él ha "comprimido" todos los trozos en una única función, y en uno de los comentarios el usuario en cuestión dice lo siguiente:

Citar
you can model a function to be accurate over a small part of the domain, then multiply it by something like (x^100 + 1)^-1 which makes every other x value go to 0. simply sum all the small parts and you have effectively combined many piecewise functions into one.

Esto me ha parecido muy interesante. Ahora, lo que no entiendo es cómo una persona humana llega a esos coeficientes tan arbitrarios, y sobre todo a la locura de los sumatorios con arcocosenos y demás. Entiendo que lo ha hecho tanteando, pero aun así, me parece que incluso tanteando no lograría sacar yo eso ni en tres vidas haciendo prueba y error. 😅

¿Cómo llega uno a estas cosas? Ramanujan decía que los teoremas que descubría en realidad se los revelaba una diosa mientras éste dormía, pero desgraciadamente no todos tenemos el privilegio de tener una línea abierta con el más allá. Le preguntaría al tipo directamente, pero me ha parecido curioso compartirlo aquí y ya de paso dejar la pregunta.

26 Enero, 2024, 10:43 pm
Respuesta #1

Masacroso

  • “Lo que oigo, lo olvido; lo que veo, lo recuerdo; lo que hago, lo aprendo” (antiguo proverbio chino)
  • Moderador Global
  • Mensajes: 4,607
  • País: es
  • Karma: +0/-0
No sé cómo lo ha hecho él, pero Wolfram Mathematica te permite hacerlo con cualquier tipo de contorno si no recuerdo mal, utilizando series de Fourier con un determinado número de sumandos. A más sumandos, más precisión. En el siguiente enlace lo explican en más detalle:

https://mathematica.stackexchange.com/questions/171755/how-can-i-draw-a-homer-with-epicycloids

Entonces, lo que haría yo, diseñaría una curva en algún programa como inkscape o similar, y luego le aplicaría lo comentado en el enlace anterior. Además hoy en día con lenguajes de programación como Julia seguro se puede implementar lo mismo que con Wolfram Mathematica de manera mucho más eficiente, en principio utilizando wavelets en vez de senos y cosenos, ya que son más indicados en general para trabajo digital.

27 Enero, 2024, 10:42 am
Respuesta #2

DaniM

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 207
  • País: cz
  • Karma: +0/-0
No sé cómo lo ha hecho él, pero Wolfram Mathematica te permite hacerlo con cualquier tipo de contorno si no recuerdo mal, utilizando series de Fourier con un determinado número de sumandos. A más sumandos, más precisión. En el siguiente enlace lo explican en más detalle:

https://mathematica.stackexchange.com/questions/171755/how-can-i-draw-a-homer-with-epicycloids

Entonces, lo que haría yo, diseñaría una curva en algún programa como inkscape o similar, y luego le aplicaría lo comentado en el enlace anterior. Además hoy en día con lenguajes de programación como Julia seguro se puede implementar lo mismo que con Wolfram Mathematica de manera mucho más eficiente, en principio utilizando wavelets en vez de senos y cosenos, ya que son más indicados en general para trabajo digital.

¡Muy bueno! Hasta ahora había visto los típicos cardioides y otras formas simples, pero no me imaginaba que se pudiera parametrizar una curva hasta el punto de crear algo tan sofisticado como un Bart Simpson.  :D

Por curiosidad, ¿es imprescendible usar números complejos para ello o es simplemente más cómodo o rápido? Veo que en el enlace que has puesto dice:

Citar
the idea is to transform each point as a complex number (z) and take the Discrete Fourier Transform (cn) up to a prescribed order m

Y en la ecuación de la botella de agua veo que también aparecen números imaginarios. ¿Sería posible conseguir un resultado similar trabajando únicamente con números reales, dado un conjunto de puntos? Estoy pensando en juntar varias ecuaciones del estilo \( r = f(\theta) \) definidas en sistemas de coordenadas polares; no sé qué tan viable sería eso.

27 Enero, 2024, 11:01 am
Respuesta #3

DaniM

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 207
  • País: cz
  • Karma: +0/-0
Bueno, veo que en el post de Reddit hay nuevos comentarios y uno parece responder afirmativamente a mi pregunta:

Citar
The idea is this:

You can take an object, any object, and fit a line to it. For example, imagine you have some object with a curve. You can fit part of a sine, cosine, or polynomial function to that curve and, for at least part of that fitted function, that curve will be traced.

Now cut off the part of the fitted function that doesn't fit the rest of that curve (since trig functions are periodic and polynomials change direction).

The next step is to repeat this fitting processes where you left off on the last line. After repeating this process you will end up with a ton of different spliced together lines that "perfectly" fit any possible shape you want.

Es básicamente dividir la figura que queremos representar en varios trozos, identificar un número suficiente de puntos de cada trozo, interpolarlos según la curva que mejor se ajuste a dichos puntos, repetir el proceso con el siguiente trozo, y así sucesivamente. Y al final juntar todas las ecuaciones que han ido saliendo, ¿no?

27 Enero, 2024, 10:05 pm
Respuesta #4

Masacroso

  • “Lo que oigo, lo olvido; lo que veo, lo recuerdo; lo que hago, lo aprendo” (antiguo proverbio chino)
  • Moderador Global
  • Mensajes: 4,607
  • País: es
  • Karma: +0/-0
Estoy pensando en juntar varias ecuaciones del estilo \( r = f(\theta) \) definidas en sistemas de coordenadas polares; no sé qué tan viable sería eso.

Supongo que se podría hacer algo así también, pero el método que conozco es el de las series de Fourier, que es muy usado en informática para muchísimos procesos. De hecho tengo entendido que el algoritmo más importante en informática (e ingeniería en general) es el de la transformada rápida de Fourier, más conocida por sus siglas FFT.

Es básicamente dividir la figura que queremos representar en varios trozos, identificar un número suficiente de puntos de cada trozo, interpolarlos según la curva que mejor se ajuste a dichos puntos, repetir el proceso con el siguiente trozo, y así sucesivamente. Y al final juntar todas las ecuaciones que han ido saliendo, ¿no?

Entiendo que la idea es que, a partir de un dibujo, tomar una curva continua que sea muy semejante, y luego someter esa curva continua a una descomposición de Fourier, es decir, hallar un cierto número de sumandos de su serie de Fourier. Cada uno de esos sumandos se puede entender como una trayectoria que describe una circunferencia de determinado radio, la suma de todas esas trayectorias generan una trayectoria que aproxima el dibujo inicial, cuanto más sumandos sean más parecida al dibujo original será.

Aunque si se diseña el dibujo en un programa de dibujo vectorial, tal dibujo ya está descrito por un conjunto de funciones matemáticas que representan diferentes tipos de curvas estandarizadas usadas para dibujarlo, como son las curvas de Bézier. Por tanto, en este contexto, hacer la aproximación de Fourier es sólo algo con sentido didáctico ya que el dibujo original ya estaría perfectamente descrito por un conjunto finito de funciones matemáticas. Un archivo SVG es, en verdad, un archivo de texto que contiene la información matemática para generar el dibujo que describe, es decir, una imagen SVG es perfecta en el sentido que son matemáticas y no depende de una resolución determinada o de información específica para cada píxel, a diferencia de otros formatos de imagen como JPG o BMP.

27 Enero, 2024, 10:58 pm
Respuesta #5

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 2,415
  • País: ar
  • Karma: +1/-0
  • Sexo: Masculino
  • Dentro de la ciencia todo,fuera de la ciencia nada


Una manera de hacerlo es definir una función a trozos en el que cada trozo es una función que rota alrededor de un eje y representa una sección de la botella, ....




Hola, de esa manera yo lo haría, partiría de una funcion a trozos $$r(z)$$ para generara una superficie de revolución, es decir tengo definida una función continua para cada intervalo donde es útil la función.


\( r(z)=\begin{bmatrix}{ f_0(z)}&{si}&{z_0\leq z<z_1}\\{ f_1(z)}&{si}&{z_1\leq z<z_2}\\{ f_2(z)}&{si}&{z_2\leq z<z_3}\\{...}&{...}&{...}\\{ f_{n-1}(z)}&{si}&{z_{n-1}\leq z<z_n}\end{bmatrix} \)


ahora como haría para unir todo en una única función


cada función  en el trozo entre los parámetros a y b la multiplicaría por 


$$F(z,a,b)=\dfrac12-\dfrac12 \dfrac{(z-a)(z-b)}{|(z-a)(z-b)|}  $$


esto es


\( r(z)_{total}=\displaystyle\sum\limits_0^{n-1} f_i(z)\cdot F(z,z_i,z_{i+1}) \)


observa que $$F(z,a,b)$$  toma valor $$0$$ fuera del intervalo $$[a,b]$$ y $$1$$ si esta dentro


Así que $$r(z)_{total}$$ escogerá automaticamente que trozo de la función es el adecuado para devolverte el radio correcto para cada altura z, en una única función


cuando $$z=z_i$$ en cualquier cambio de función de un trozo otro, evidentemente habría un error, pero es salvable programación salvando los errores  de división por cero asignando el valor de $$1/2$$ a $$F(z,z,b)$$ y a $$F(z,a,z)$$ y obviamente si la función a trozos es continua, el programa que evalúa la función con un solo parámetro $$z$$ no notara diferencia ya que sumara cada uno de los termino no nulos multiplicado por un medio y como ambos coinciden en valor... resultara la función continua.... va ... que puedes probar que funciona.
sino arréglatelas para sumar un valor despreciable(o por debajo  de la precisión que necesites en el resultado)  a z, un epsilon >0, para que cuando esté muy cerca de $$z_i$$  la resta contra este  valor no resulte nula y por lo tanto calcule 1 o 0 sin presentar error por división por cero.
$$F(z,a,b)=\dfrac12-\dfrac12 \dfrac{(z-a+\varepsilon)(z-b+\varepsilon)}{|(z-a+\varepsilon)(z-b+\varepsilon)|}  $$


si $$\Delta z >>\varepsilon$$ la diferencia entre los puntos de evaluación de z y el siguiente(a escala por debajo del tamaño de un pixel) ,es mucho menor que ese pequeño error entonces la función renderizara sin errores de calculo.


ejemplo si tengo una precisión de un micrón el épsilon lo puedes poner en un nanómetro que no te generara errores de calculo significativos a escala visible.

Saludos
Saludos  \(\mathbb {R}^3\)