4 votos

Fracción continuada, vecinos más cercanos

Para establecer los registros de divisor/multiplicador adecuados en un bucle de bloqueo de fase, utilizo una expansión de fracción continua, que detengo si el numerador o el denominador de la fracción es mayor que 4095. Esto funciona realmente bien. Mi pregunta es: ¿Existe algún algoritmo/estrategia que me dé el siguiente valor más bajo y/o más alto?

Ejemplo: con registros de tamaño 32, para aproximar pi, encuentro 22/7 = 3,1429. El siguiente más bajo sería 25/8 = 3,1250 El siguiente más alto sería 19/6 = 3.1667 Actualmente resuelvo esto mediante una búsqueda exhaustiva, lo siguiente es el código equivalente de matlab/octave. La implementación real del código c es más eficiente, pero esto es sólo una forma corta de expresar el principio.

lo = unique((1:31)./floor((1:31)/pi));
hi = unique((1:31)./ceil((1:31)/pi));
rats(lo(2))
rats(hi(end-1))

Así que repitiendo mi pregunta de otra manera: ¿Cómo evitar la búsqueda exhaustiva para encontrar estos valores?

Normalmente lo que veo es que para valores hasta 4096, es que los valores más cercanos son multiplico el mejor valor hasta 4096. Por ejemplo para pi ~ 22/7 = 4092/1302 Entonces las respuestas parecen ser en muchos casos

lo = round(pi*(1302+1))/(1302+1)
hi = round(pi*(1302-1))/(1302-1)

Pero no siempre es así.

Edición: El mensaje original utilizaba unique(sort(...)). Dado que unique ya ordena esto era redundante.

0 votos

¿Podría explicar las reglas de "siguiente superior" y "siguiente inferior"? Las fracciones continuas siempre darán la mejor aproximación racional, ¿qué es lo que buscas? Usar 4096 como límite significa que serán aproximaciones muy precisas - es un número bastante grande para ver en una fracción continua.

0 votos

Para mi aplicación, necesito ajustar la frecuencia del sintetizador en pasos muy pequeños. Necesito seguir una frecuencia de entrada de varios GHz. La constante de tiempo del bucle es de varios minutos. Si veo que mi bucle se retrasa, quiero cambiar la relación de mi bucle de bloqueo de fase a la siguiente frecuencia más alta/baja. En cuestión de días, el bucle debería rastrear dentro de 10^-9 en promedio. La forma de fuerza bruta puede lograr esto, pero me preguntaba si hay una manera más elegante.

0 votos

No veo por qué necesitas una clase. Digamos que estás aproximando 3.14 usando a/b donde a y b son menores de 32.

1voto

David Puntos 6

Utiliza el árbol Stern Brocot.

para cualquier fracción $\frac{p}{q}$ , calcula los dos ancestros (inferior y superior) más cercanos $\frac{p_l}{q_l}$ y $\frac{p_h}{q_h}$ .

El siguiente más bajo será $$\frac{kp+p_l}{kq+q_l} $$ con el mayor $k$ (podría ser $0$ ) tal que el numerador y el denominador estén en el límite correcto (inferior a 4096). Lo mismo para el siguiente más alto. Así que $k=\min((4096-p_l)/p,(4096-q_l)/q)$

Si su implementación es correcta, calcular los ancestros más cercanos lleva tanto tiempo como encontrar el coeficiente de Bezout de $p$ y $q$ .


Ejemplo completo : $\frac{17}{7}$

Para encontrar el ancestro inferior más cercano, halle los coeficientes de Bezout utilizando el Algoritmo euclidiano

Verás que $$17\times 5-7\times 12=1$$

Por lo tanto, $\frac{12}{5}$ es el ancestro inferior más cercano y $\frac{17-12}{7-5}=\frac{5}{2}$ es el ancestro superior más cercano.

Ahora $k=\min((4096-12)/17,(4096-5)/7)=240$ .

Por lo tanto, $\frac{240\times17+12}{240\times 7+5}=\frac{4092}{1685}$ es el más bajo.

0 votos

En mi implementación inicialmente empiezo en la cima del árbol, recuerdo donde voy a la izquierda/derecha, hasta que encuentro mi fracción p/q, entonces continúo ramificando o atravieso hacia atrás y luego para ph/qh tomo la ruta hacia la ubicación de la derecha, parando cuando el número se hace mayor a 4095. En tu respuesta afirmas que "El siguiente inferior será ..." y luego qive una ecuación y dices que k podría ser cero. Usando k = 0 esto da como un valor para el siguiente menor pl/ql. Esta era la definición del siguiente inferior. Lo siento, sólo tengo una formación en ingeniería, no soy un matemático.

1 votos

@user3310744 Quizás te he entendido mal, pero pensaba que la siguiente bajada de $\frac{p}{q}$ podría tener un denominador mayor que $q$ Por eso he añadido la fórmula con $k$ . Si no, entonces $k=0$ pero si es así, debe atenerse a la fórmula con el $k$ . Por ejemplo $\frac{2}{3}$ tiene el ancestro inferior más cercano $\frac{1}{2}$ . Así que $k=(4096-2)/3=1364$ y $\frac{1364\times2+1}{1364\times 3+2}=\frac{2729}{4094}$ es la fracción inferior más cercana de $\frac{2}{3}$

0 votos

Vale, lo entiendo y puedo reproducirlo. Confundí pl/ql y ph/qh con el siguiente valor inferior/superior. Pero estos eran los ANCESTROS más cercanos. Gracias.

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