UNIVERSIDAD SIMON BOLIVAR
Departamento de Computacion
CI2611 - Taller de Algoritmos y Estructuras I
Enero-Marzo 1998
Proyecto #4
 Distribuido: Martes, 2 de Marzo de 1999
Entrega: 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

tex2html_wrap457

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.
 

picture211

tex2html_wrap_inline389

Para fines computacionales, es conveniente considerar la conductancia de un resistor, que se define como el valor inverso de la resistencia (tex2html_wrap_inline391). (Tradicionalmente, la conductancia se denota con la letra G.)
 

picture211

tex2html_wrap_inline393

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:
 

picture234

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:
 

picture244

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:
 

picture256

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 (hacer-resistor resistencia)
  (asociar-tipo 'resistor resistencia))

(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))

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 (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))))

(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))))

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

Circuitor2

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)))

tex2html_wrap_inline403 (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:

figure304
 
 

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:
 

picture331

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.
 

picture355

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?).
 


Hector Luis Palacios V.

Mon Mar 1 13:08:24 AST 1999