Distribuido: Martes, 2 de Marzo de 1999Entrega: Viernes, 12 de Marzo de 1999
Lecturas: Seccion 2.3.2 , 2.3.3 y 2.4.1 del SICP (Structure and Interpretation of Computer Programs)
Material de Consulta: Manual de PC Scheme, Guia, Programming in Scheme (Eisenberg)
Parte 1. Pre-laboratorio
Leer las secciones 2.3.2, 2.3.3 y 2.4.1 Preparar los ejercicios 2.50, 2.51, 2.53 y 2.54 en las páginas 146 y 147 del texto.
Parte 2. Circuitos Resistivos en Serie y en Paralelo
Martica Paz, preocupada por el aumento del costo de la vida ha decidido
poner a valer sus conocimientos de computación implementando un
analizador de circuitos para alquilárselo a estudiantes de ingeniería
eléctrica y electrónica. Elizabeth, su socia en este negocio,
sugiere comenzar con un programa que calcule la resistencia de circuitos
lineales simples. Estos son construídos con elementos primitivos
llamados resistencias ó resistores. Un resistor es
caracterizado por un número R llamado la resistencia del
resistor.
Para fines computacionales, es conveniente considerar la conductancia
de un resistor, que se define como el valor inverso de la resistencia (
).
(Tradicionalmente, la conductancia se denota con la letra G.)
Un resistor es el ejemplo mas simple de un tipo de elemento llamado
circuito
de dos terminales -- esto es, un circuito que tiene exactamente dos
terminales a los cuales se puede conectar otros circuitos:
Los circuitos pueden ser combinados uniendo sus terminales. La resistencia
(y conductancia) de un circuito es determinada por la resistencia de sus
partes y la forma en que están interconectadas. El sistema inicial
de Martica y Elizabeth provee dos métodos de combinación
basicos para construir circuitos de dos terminales a partir de circuitos
de dos terminales más simples. El primer método es llamado
combinación serial:
La resistencia total de dos circuitos conectados en forma serial es la suma de las resistencias de las partes.
El segundo método es combinación paralela:
La conductancia total de dos circuitos conectados en paralelo es la suma de la conductancia de las partes.
Después de varias horas de trabajo, Martica y Elizabeth obtuvieron un programa bastante elegante que manipula combinaciones seriales y paralelas. En este programa, los resistores, las combinaciones seriales y las combinaciones paralelas son representados como objetos de un determinado tipo.
(define (resistor? cir) (eq? (tipo cir) 'resistor))
(define (hacer-serial cir1 cir2)
(asociar-tipo 'combinacion-serial
(list cir1 cir2)))
(define (combinacion-serial? cir)
(eq? (tipo cir1) 'combinacion-serial))
(define (hacer-paralela cir1 cir2)
(asociar-tipo 'combinacion-paralela
(list cir1 cir2)))
(define (combinacion-paralela? cir)
(eq? (tipo cir1) 'combinacion-paralela))
(define (hacer-resistor resistencia)
(asociar-tipo 'resistor resistencia))
Martica y Elizabeth también implementaron dos operaciones genéricas sobre estos tres tipos de circuitos -- resistencia y conductancia. El método usado para manipular operaciones genéricas es similar al usado en la sección 2.3.2 del texto.
(define (conductancia cir)
(cond ((resistor? cir)
(conductancia-resistor
(contenido cir)))
((combinacion-paralela? cir)
(conductancia-paralela
(contenido cir)))
((combinacion-serial? cir)
(conductancia-serial (contenido cir)))
(else (error "Tipo de circuito desconocido - CONDUCTANCIA" cir))))
(define (resistencia cir)
(cond ((resistor? cir)
(resistencia-resistor
(contenido cir)))
((combinacion-paralela? cir)
(resistencia-paralela
(contenido cir)))
((combinacion-serial? cir)
(resistencia-serial (contenido cir)))
(else (error "Tipo de circuito desconocido - RESISTENCIA" cir))))
Ejercicio 1 Considere el programa de Martica y Elizabeth.
a. Complete resistencia y conductancia implementando los procedimientos que faltan. Utilice selectores abstractos.
b. Martica y Elizabeth probaron su programa haciendo el cálculo de la resistencia del siguiente circuito:
r1
r2
r4
Ellas tipearon:
(define r1 (hacer-resistor 10))
(define r2 (hacer-resistor 30))
(define r3 (hacer-resistor 20))
(define r4 (hacer-resistor 40))
(define N (hacer-paralela (hacer-serial r1 r2)
(hacer-paralela r3 r4)))
(resistencia N) 10.000
y la respuesta fue correcta (como Elizabeth verificó).
Utilice el mismo ejemplo para probar que su programa funciona.
Ejercicio 2 ¿Cuántas veces fue llamado el procedimiento resistencia para calcular la resistencia de N?. ¿Cuáles fueron los argumentos de resistencia en cada llamada? (para especificar los argumentos, puedes hacer un sketch de la parte del circuito que cada argumento representa o puedes dar una descripcion en palabras - por ejemplo, ``r3 en paralelo con r4''.)
Extensiones en L
Dado un circuito de dos terminales B, podemos formar un nuevo circuito de dos terminales añadiendo una sección-L. La seccion-L es construída usando dos circuitos de dos terminales S y P como sigue:
Esta operación es llamada extension-L de una base B por una parte serial S y una parte paralela P (esto es porque S queda en serie con B y P queda en paralelo).
Ejercicio 3 Escriba un procedimiento extender-L que use hacer-serial y hacer-paralela para combinar tres circuitos de dos terminales - base , parte-serial y parte-paralela - y producir el circuito extendido ilustrado arriba.
Ejercicio 4 Use su procedimiento extender-L para extender el circuito N y obtener un nuevo circuito. Use N como la base, un resistor de 10 ohms como la parte serial y otro resistor de 10 ohms como la parte paralela. Verifique que el circuito resultante tenga una resistencia de 15 ohms. Indique cuál es la expresión que usó para generar el circuito y obtener su resistencia.
Haciendo l-extensiones repetidamente a una base, dadas las partes seriales
y paralelas, obtenemos un circuito llamado cascada. El siguiente
diagrama ilustra una cascada de 4 etapas:
Martica decidió que puede implementar fácilmente una cascada haciendo uso de su procedimiento L-extender, junto con el procedimiento aplicar-n-veces que ya conocemos:
(define (aplicar-n-veces f n)
(lambda (x)
(if (= n 0)
x
((aplicar-n-veces f (- n 1)) (f x)))))
Ella definió el siguiente procedimiento para construir cascadas dado un número de etapas:
(define (extension-cascada etapas base parte-serial parte-paralela)
((aplicar-n-veces <???> etapas <???>)))
Ejercicio 5 Complete el procedimiento extension-cascada.
Ejercicio 6 Un problema clásico de teoría de circuitos
usado para atormentar a los estudiantes de ingeniería eléctrica
es calcular la resistencia de una cascada infinita de resistores de 1 ohm.
Use su procedimiento extension-cascada para generar cascadas cada vez mas largas de este tipo y encontrar su resistencia. Muestre las expresión que utilizó para generar las cascadas. ¿En qué valor la resistencia parece converger?.
Ejercicio 7 Martica y Elizabeth le mostraron su sistema a Elsa Bestafar y como ejemplo, trataron de calcular la resistencia de una cascada larga. Para su sorpresa, encontraron que a pesar de que el programa daba las respuestas correctas, parecía que corría mas lento que antes. Observaron cuidadosamente el código y encontraron que Martica había cambiado la definición de resistencia-paralela:
(define (resistencia-paralela cir1)
(/ (* (resistencia (rama-izq cir))
(resistencia (rama-der cir)))
(+ (resistencia (rama-izq cir))
(resistencia (rama-der cir)))))
Explique por qué este cambio hace que el programa vaya tan lento. Como ejemplo, considere una cascada en la que cada uno de las partes seriales, paralelas y base sean un simple resistor. Si la cascada tiene n etapas:
a. ¿Cuántos resistores hay en la cascada?
b. ¿Cuántas veces se corre el procedimiento resistencia-resistor en el cálculo de la resistencia de la cascada si el sistema usa la versión original del procedimiento resistencia-paralela?.
c. ¿Cuántas veces se corre resistencia-resistor para calcular la resistencia de una cascada de n estados después de que Martica instaló la nueva versión de resistencia-paralela,? (Usted debe poder obtener una respuesta exacta en términos de n. Sin embargo, si no lo puede hacer, dé una respuesta parcialmente correcta.)
d. Explique en que forma el cambio de Martica ha afectado el tiempo
de ejecución del sistema. (Por ejemplo, el tiempo de ejecucion aumentó
¿en un factor constante?, ¿en forma cuadrática?, ¿exponencial?).