¿Puede un circuito eléctrico hacer una recursión?

4

¿Puede recursionar un circuito eléctrico?

Por recursión me refiero a cualquier tipo de recursión, cola, binario, anidado, etc.: enlace

Por circuito eléctrico me refiero a una placa simple sin chips especiales, solo cables, resistencias, diodos, condensadores, etc.

    
pregunta shinzou

2 respuestas

7

Primero debemos decidir qué es realmente la recursión. Cuando toma una función recursiva, puede existir una transformación que se deshaga de la recursión, pero introduce estado . En otros casos, la transformación tendrá que introducir estado y iteración. Por lo tanto, escribir una función de forma recursiva es una forma de establecer el estado y posiblemente la iteración implícita , en lugar de explícita . En otras palabras, la recursión es solo una forma de escribir la cosa.

El estado está ahí de todos modos , simplemente no lo está anotando explícitamente en el papel. En lenguajes como C, las llamadas a funciones recursivas generalmente almacenan su estado en la pila.

Ahora, cualquier circuito que tenga estado (carga almacenada, energía, etc.) - y eso será todo, en realidad - es, por definición, recursivo. No es necesaria ninguna iteración :)

Concretamente, trabajemos en un filtro IIR de primer orden. Su salida puede ser dada por una función recursiva. Dada una señal de entrada x(t) , la salida y(x(t), t) = a1*y(x(t-1), t-1) + b0*x(t) , donde a1 y b0 son constantes que parametrizan la respuesta. Esto está en tiempo discreto: t es un número entero con la unidad de un número de ciclos de reloj.

La implementación de C, suponiendo que t>=0 y x(-1) == 0 , sería:

float a1, b0;

// Recursive, Implicit State
float y(float (*x)(int), int t) {
  return t != 0 ? a1 * y(x(t-1), t-1) + b0 * x(t) : b0 * x(t);
}

// Non-Recursive, Explicit State
float y(float (*x)(int), int t) {
  static float y_prev = 0.0;
  if (1) { // optional to ensure correct use only
    static int t_prev = 0;
    assert(t_prev == t-1 || t == 0);
  }
  return y_prev = a1 * y_prev + b0 * x(t);
}

El código también se puede implementar como un filtro de respuesta de impulso infinito de condensador conmutado de primer orden. Ciertamente puede construir un sistema de este tipo:

simular este circuito : esquema creado usando CircuitLab

SW1 cambia dos veces en cada ciclo de reloj. Con los valores mostrados, para una precisión de 12 bits, el reloj está limitado a 10 kHz debido a la constante de tiempo R4-C1. U1, U2, U3 son seguidores de voltaje, por ejemplo, amplificadores operacionales configurados para ganancia = 1.

Si configuramos a1=(1-b0) y lo transformamos en una ecuación diferencial de tiempo continuo, podemos obtener la "misma" respuesta (continua) con un circuito RC:

simular este circuito

Aquí, T es el período de reloj del reloj que alimenta el circuito del capacitor conmutado que se encuentra arriba, y U1 es un seguidor de voltaje.

Cuando las frecuencias de interés se limitan a ~ 1/10 de la frecuencia de reloj, los circuitos de tiempo continuo y tiempo discreto (capacitor conmutado) responden de la misma manera.

Ambos circuitos, y el código, pueden ser modelados por una función recursiva, también conocida como una relación de recurrencia .

    
respondido por el Kuba Ober
8

Lo que esa página denomina "recursivo lineal" se puede hacer en cierta medida en hardware, donde se llama aproximación sucesiva . El ejemplo de Newton-Raphson es bueno ya que está bastante cerca de cómo funcionaban las computadoras de los directores de armas analógicas.

Pero en general es una mala idea adaptar la intuición del programador (basada en la ejecución de una serie de instrucciones) a los circuitos electrónicos (basados en el flujo continuo).

    
respondido por el pjc50

Lea otras preguntas en las etiquetas