4 votos

Diferencia de los múltiplos más cercanos de dos números reales

Estoy tratando de encontrar un algoritmo / función de un programa de ordenador que estoy trabajando. El siguiente aspecto:

$$F(f_1,f_2) = \Delta $$

where $\Delta$ is to be the smallest possible difference among a constrained set of integer multiples of $f_1$ and integer multiples of $f_2$. To put it another way,

$$\Delta = \left\lvert n_1f_1 - n_2f_2\right\rvert\,\,s.t.\,\,\forall a_1,a_2 \in \{z_1,z_1+1,...,z_2\}, \left\lvert n_1f_1-n_2f_2 \right\rvert \le \left\lvert a_1f_1-a_2f_2 \right\rvert \; where\; z_1,z_2 \in \mathbb Z_{\gt 0}$$

Since I only need this for a very specific application, if it helps, we can also assume a few things about $f_1,\,f_2,\,z_1,$ and $z_2$:

$f_1$ and $f_2$ are musical notes from a 12 note, equally tempered scale. This means that $f_1 = (\sqrt[12]{2})^{c_1}f_0$ and $f_2 = (\sqrt[12]{2})^{c_2}f_0$ for some integers $c_1$, $c_2$ and some fundamental frequency $f_0$. Typically $f_0$ is $440hz$. This cannot be assumed here, but we can assume that $f_0$ is some known constant.

We can also assume that $z_1=1$ and $z_2=6$

Obviamente, este problema podría ser resuelto muy fácilmente con una fuerza bruta programa de ordenador, como se ilustra en el pseudo código de abajo:

function(f1,f2){
      var delta = f1 - f2
      var temp = 0
      for(i=1;i<7;i++) {
         for(k=1;k<7;k++){
            temp = abs(i*f1 - k*f2)
            if(temp < delta){
               delta = temp
            }
         }
      }

      return delta
   }

Pero, tiene que haber una solución más elegante, ¿verdad? Alguien me puede ayudar aquí?

2voto

Rob Dickerson Puntos 758

En primer lugar, no estoy del todo seguro de lo que está mal con la "fuerza bruta" enfoque: se va a resolver su problema, y lo hará en una mínima cantidad de tiempo en que incluso el más simple y el equipo más lento.

Sin embargo, digamos que usted quería resolver el problema de mucho mayor tamaño $z_2$. Básicamente se está tratando de resolver el Diophantine aproximación problema de la búsqueda de una "mejor" racional aproximación a $f_1/f_2$, y el enfoque general es mirar el convergents de la continuación de la fracción de $f_1/f_2$.

Así, por ejemplo, vamos a decir $f_1=f_0$ e $f_2 = 2^{4/12}f_0$ (es decir, una tercera mayor).

Tenemos $$f_1/f_2 = \cfrac{1}{1+\cfrac{1}{3+\cfrac{1}{1+ \cfrac{1}{5+\cfrac{1}{1+\ddots}}}}}$$ y el convergents son $$1, \frac{3}{4}, \frac{4}{5}, \frac{23}{29},\ldots$$ así que si $z_2 = 6$, desea $n_1 = 5, n_2 =4$; si $z_2 = 30$, que se puede hacer mejor mediante el establecimiento $n_1 = 29$ e $n_2 = 23$.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X