s2Eva_IIT2004_T1 Calcular raíz cúbica recursiva

Ejercicio: 2Eva_IIT2004_T1 Calcular raíz cúbica recursiva

Usar la fórmula recursiva:

x = \frac{2 x^3+n}{3 x^2}

considere controlar el número de iteraciones como máximo 100 veces (tarea). Para evitar un bucle infinito si la diferencia no disminuye (convergente).

Algoritmo en Python

# 2Eva_IIT2004_T1 Calcular raíz cúbica recursiva

def cubic(n, tolera = 0.0001):
    xi = 1
    diferencia = 1
    while (diferencia>tolera):
        xn = (2*(xi**3)+n)/(3*(xi**2))
        diferencia = abs(xn-xi)
        xi = xn
    return(xi)

resultado del algoritmo

>>> cubic(8)
2.0000000000120624
>>> cubic(27)
3.0000000000000973
>>> 

s1Eva_IIT2004_T4 Matriz de paridad

Ejercicio: 1Eva_IIT2004_T4 Matriz de paridad

Establecer una matriz de n filas y n+1 columnas.

matriz = np.zeros(shape=(n,n+1),dtype=int)

Para cada casilla en cada fila y columna, generar un aleatorio de dos posibilidades que mínimo puede ser cero.

aleatorio = int(rnd.random()*2)+0

con lo que se genera la matriz de números aleatorios.
bit en Matriz de Paridad
Al finalizar una fila, considere la suma de fila para revisar la paridad con el residuo de la división para 2.

    residuo = sumafila % 2

Si hay residuo el número es impar y se debe escribir el número 1 en la última casilla de toda la fila (fila, n), es decir se completa la paridad.

En el caso opuesto, que no hay residuo=0, el conteo de ‘1’ ya es par y se deja el valor cero en la última casilla.

Algoritmo en Python

# 1Eva_IIT2004_T4 Matriz de paridad
import numpy as np
import random as rnd

# INGRESO
n = 7 # tamaño matriz

# PROCEDIMIENTO
# matriz de n filas y n+1 columnas
matriz = np.zeros(shape=(n,n+1),dtype=int)

# recorre matriz
for fila in range(0,n,1):
    sumafila = 0
    for columna in range(0,n,1):
        aleatorio = int(rnd.random()*2)+0
        matriz[fila,columna] = aleatorio
        sumafila = sumafila + aleatorio
    # revisa residuo paridad
    residuo = sumafila % 2  
    if residuo: # sumafila es impar
        matriz[fila,n] = 1

# SALIDA
print(' Matriz obtenida')
print(matriz)

resultado:

 Matriz obtenida
[[0 1 1 1 0 1 1 1]
 [1 1 0 1 0 0 1 0]
 [0 1 1 1 0 1 1 1]
 [1 0 0 1 1 0 1 0]
 [0 1 0 0 0 1 0 0]
 [1 0 0 0 1 1 0 1]
 [1 0 0 0 1 0 1 1]]
>>> 

Nota: Observe que la matriz contiene números aleatorios, por lo que el resultado varía cada vez que se ejecuta el algoritmo.

s1Eva_IIT2004_T3 Estimar π por Montecarlo

Ejercicio: 1Eva_IIT2004_T3 Estimar π por Montecarlo

[ algoritmo ] [ diagrama flujo ]

Ingresar la cantidad de puntos n para ubicar en el plano de forma aleatoria dentro del rango del cuadrado que contiene al círculo. 

Usar una variable k como el contador para los puntos que caen dentro del círculo.

Al generar aleatoriamente cada punto (x,y), se puede calcular la distancia al centro usando Pitágoras.

d= \sqrt{x^2 +y^2}

Se repite el proceso para n puntos y al final se calcula el valor estimado de pi según la relación del enunciado.

\frac{k}{n} =\frac{\pi}{4}

Nota: no se usa como variable la palabra “pi” debido a que es nombre de variable reservada.

[ algoritmo ] [ diagrama flujo ]
..


Algoritmo en Python

# 1Eva_IIT2004_T3 Estimar Pi por Montecarlo
# Propuesta de solución. edelros@espol.edu.ec
# se usa todo el círculo
import random as rnd
import numpy as np

# INGRESO
n = int(input('¿Cuántos puntos?: '))
radio = 1

# PROCEDIMIENTO
punto = np.zeros(shape=(n,2),dtype=float)
k = 0
i = 0
while i<n:
    x = rnd.random()*(2*radio)-1
    y = rnd.random()*(2*radio)-1

    d = np.sqrt(x**2+y**2)
    if d<=radio:
        k = k + 1
    punto[i] = [x,y]
    i = i + 1

estimadopi = 4*k/n

# SALIDA
print(k,n)
print('estimador pi: ', estimadopi)
print(punto)

la estimación de π con números aleatorios que se ubican dentro del círculo de radio 1 es:

¿Cuántos puntos?: 1000
781 1000
estimador pi:  3.124
[[ 0.15581724  0.43992571]
 [-0.11114653 -0.86426905]
 [ 0.51257751 -0.1969925 ]
 ...
 [ 0.26965478 -0.01555604]
 [-0.89575602  0.56077385]
 [ 0.33467618 -0.59497405]]
>>> 

[ algoritmo ] [ diagrama flujo ]
..


Diagrama de Flujo

[ algoritmo ] [ diagrama flujo ]

ejercicios resueltos Matlab parc_iit2004_t3 pdf

s1Eva_IT2004_T3 Sortear parejas para tenis

Ejercicio: 1Eva_IT2004_T3 Sortear parejas para tenis

Propuesta de solución en Python:

La variable n indica el número de parejas o tamaño de los vectores para almacenar la «pareja» y el contador de «veces» que juega cada una.

# INGRESO
n = int(input('cuantas parejas: '))

El ejercicio se divide en dos partes: la primera para seleccionar de forma aleatoria la pareja de la dama (una por una), es decir se sortean los caballeros (quien), y la segunda parte se realiza el proceso para los caballeros.

dama = n+1
while not(dama>(2*n)):
    quien = int(rnd.random()*n)+1
    pareja[dama] = quien
    veces[quien] = veces[quien]+1
    dama = dama + 1

En cada sorteo se registra cuántas veces participa cada uno.

Algoritmo en Python

# ICM00794-Fundamentos de Computación - FCNM-ESPOL
# 1Eva_IT2004_T3 Sortear parejas para tenis

import random as rnd
import numpy as np

# INGRESO
n = int(input('cuantas parejas: '))

# PROCEDIMIENTO
pareja = np.zeros(2*n+1,dtype=int)
veces  = np.zeros(  n+1,dtype=int)

dama = n+1
while not(dama>(2*n)):
    quien = int(rnd.random()*n)+1
    pareja[dama] = quien
    veces[quien] = veces[quien]+1
    dama = dama + 1

# SALIDA
print(pareja[n+1:])
print('veces: ')
print(veces)

print('juegan varias veces: ')
caballero = 1
while not(caballero>n):
    if (veces[caballero]>1):
        print(caballero)
    caballero = caballero + 1

print('los que no juegan: ')
caballero = 1
while not(caballero>n):
    if (veces[caballero]==0):
        print(caballero)
    caballero = caballero + 1

con un ejemplo de resultado:

cuantas parejas: 10
[ 6  2  1  8  3  9 10  1  7  9]
veces: 
[0 2 1 1 0 0 1 1 1 2 1]
juegan varias veces: 
1
9
los que no juegan: 
4
5
>>> 

s1Eva_IT2004_T2 Verificar ISBN

Ejercicio: 1Eva_IT2004_T2 Verificar ISBN

Propuesta de solución en Python, para un número ISBN dadoisbn libro

ISBN = 9684443242

Luego de pedir el número ISBN, se inicia extrayendo el dígito verificador escrito, quedando el resto de dígitos del número hacia la izquierda para realizar los cálculos.

vescrito = ISBN%10
n = ISBN//10

Tarea: verificar el número de dígitos del ISBN

Para la posición del dígito se usa un contador.

Las operaciones se acumulan en suma, de la que se obtiene el residuo de la división para 11.

El residuo corresponde al verificador calculado que se compara con el verificador escrito para dar el veredicto.

Algoritmo en Python

# ICM00794-Fundamentos de Computación - FCNM-ESPOL
# 1Eva_IT2004_T2 Verificar ISBN
# propuesta: edelros@espol.edu.ec

# INGRESO
ISBN = int(input('cual ISBN: '))

# PROCEDIMIENTO
vescrito = ISBN%10
n = ISBN//10

contador = 9
suma = 0
while (n>0):
    digito = n%10
    n = n//10
    suma =  suma + digito*contador
    contador = contador -1

vcalculado = suma%11

if (vescrito==vcalculado):
    respuesta = 1
else:
    respuesta = 0

#SALIDA
print(respuesta)

Resultado del algoritmo

cual ISBN: 9684443242
1
>>> 
cual ISBN: 9684443243
0
>>> 

s2Eva_IIIT2003_T3 función distancia de Hamming

Ejercicio: 2Eva_IIIT2003_T3 función distancia de Hamming

Se deben comparar las cadenas U y V en los elementos de las mismas posiciones.
Primero se plantea un algoritmo para determinar el número de parejas diferentes que existen dentro de cada cadena.

Si las cadenas difieren en el tamaño, la respuesta será ‘-1’.

Algoritmo en Python

# ICM00794-Fundamentos de Computación - FCNM-ESPOL
# 2Eva_IIIT2003_T3 Distancia de Hamming

# INGRESO
U = '20001'
V = '10103'

# PROCEDIMIENTO
n = len(U)
m = len(V)

diferente= -1  # tamaño diferente U,V
if n == m:
    diferente = 0
    i = 0
    while not(i>=n):
        if U[i] != V[i]:
            diferente = diferente +1
        i = i + 1
# SALIDA
print('distancia Hamming: ', diferente)

resultado del algoritmo

distancia Hamming:  3
>>> 

Luego se procede a convertir el algoritmo a una función y hacer la llamada desde un programa, con lo que se cumple lo requerido en cada literal

Instrucciones en Python usando una función

# ICM00794-Fundamentos de Computación - FCNM-ESPOL
# 2Eva_IIIT2003_T3 Distancia de Hamming

# literal a. funcion
def dHamming(U,V):
    n = len(U)
    m = len(V)

    diferente = -1
    if n == m:
        diferente = 0
        i = 0
        while not(i>=n):
            if U[i] != V[i]:
                diferente = diferente +1
            i = i + 1
    return(diferente)

# Programa -------------
# INGRESO
U = '20001'
V = '10103'

# PROCEDIMIENTO
diferente = dHamming(U,V)

# SALIDA
print('distancia Hamming: ', diferente)

Tarea: Añadir la lectura de los datos desde un archivo.

s2Eva_IIIT2003_T2 Raíz cuadrada por Newton, recursiva

Ejercicio: 2Eva_IIIT2003_T2 Raíz cuadrada por Newton

Recuerde que toda función recursiva requiere un valor inicial para la primera iteración. Empezando para n=0 con el valor de x:

f(1) = \frac{x}{2}

En el caso que n>1, se usa la expresión recursiva:

f(n) = 0.5\Bigg(f(n-1) + \frac{x}{f(n-1)}\Bigg)

Los valores tabulados para x=9 y n=10

ingrese x: 9
aproximación n-esima: 10
i , f(i)
0 nan
1 4.5
2 3.25
3 3.0096153846153846
4 3.000015360039322
5 3.0000000000393214
6 3.0
7 3.0
8 3.0
9 3.0
10 3.0
>>> 

Observe que a partir de la iteración 6, ya no muestra diferencia entre resultados consecutivos.

Para x= 9.5 con x=10

ingrese x: 9.5
aproximación n-esima: 10
i , f(i)
0 nan
1 4.75
2 3.375
3 3.0949074074074074
4 3.082233060472589
5 3.0822070015946474
6 3.0822070014844885
7 3.0822070014844885
8 3.0822070014844885
9 3.0822070014844885
10 3.0822070014844885
>>> 


Algoritmo en Python

La función no debe admitir valores de x negativos o cero, de darse el caso se responde np.NaN que corresponde a no es un número o ‘Not a Number’.

# 2Eva_IIIT2003_T2 Raíz cuadrada por Newton
import numpy as np

# literal a. función recursiva
def raizNewton(x,n)
    if n<=0 or x<=0:
        # no se admiten negativos o cero
        f = np.NaN
    else:
        if n == 1:
            f = x/2  # valor inicial
        if n>1:
            f = 0.5 *(raizNewton(x,n-1)+x/raizNewton(x,n-1))
    return (f)

# literal b. Programa ---------------
# INGRESO
x = float(input('ingrese x: '))
n = int(input('aproximación n-esima: '))

# PROCEDIMIENTO
print(' i , f(i)')
for i in range(0,n+1,1):
    print(i , raizNewton(x,i))

s1Eva_IIIT2003_T3 Coordenadas enteras en un círculo

Ejercicio: 1Eva_IIIT2003_T3 Coordenadas enteras en un círculo

[ mientras repita] [ para/for ]

Considere el círculo centrado en el origen (0,0),
siendo su intervalo entre [-radio, radio].

Recorrer las coordenadas de números  enteros en el recuadro limitado por
[-radio,radio] en cada lado, determinando la distancia del punto al origen.

radio = 10
x = [-10, -9, -8, -7, -6 ... 8, 9, 10]
\text{distancia} = \sqrt{x^2+y^2}
dist = np.sqrt(x**2 + y**2)

Con la distancia revisar si el punto está dentro del círculo.

if dist<=radio:
    encirculo = encirculo + 1
    sumadist  = sumadist + dist  

[ mientras repita] [ para/for ]
..


Algoritmo en Python: bucle para/for

# 1Eva_IIIT2003_T3 Coordenadas enteras en un círculo
import numpy as np

# INGRESO
radio = 10

# PROCEDIMIENTO
a =  - int(radio)
b = int(radio)

encirculo = 0
sumadist = 0
for y in range(a,b+1,1):
    for x in range(a,b+1,1):
        dist = np.sqrt(x**2 + y**2)
        if dist<=radio:
            encirculo = encirculo + 1
            sumadist  = sumadist + dist          

promdist = sumadist/encirculo
# SALIDA
print(' coordenadas enteras en círculo: ')
print(encirculo)
print('promedio distancias al centro: ')
print(promdist)

resultado:

 coordenadas enteras en círculo: 
317
promedio distancias al centro: 
6.698944789255016
>>> 

[ mientras repita] [ para/for ]
..


Algoritmo en Python: mientras-repita

# 1Eva_IIIT2003_T3 Coordenadas enteras en un círculo
import numpy as np

# INGRESO
radio = 10

# PROCEDIMIENTO
a =  - int(radio)
b = int(radio)

encirculo = 0
sumadist = 0
y = a
while y<=b+1:
    x = a
    while x<=b+1:
        dist = np.sqrt(x**2 + y**2)
        if dist<=radio:
            encirculo = encirculo + 1
            sumadist  = sumadist + dist
        x = x + 1
    y = y + 1

promdist = sumadist/encirculo
# SALIDA
print(' coordenadas enteras en círculo: ')
print(encirculo)
print('promedio distancias al centro: ')
print(promdist)

[ mientras repita] [ para/for ]

s1Eva_IIIT2003_T2 Verificar números triangulares

Ejercicio: 1Eva_IIIT2003_T2 Verificar números triangulares

[ mientras-repita ] [ repita-hasta ] [ diagrama flujo ]

El problema planteado es semejante a construir una pirámide, en la que se disponen de solo t bloques y se requiere saber si el número de bloques es exacto para formar una pirámide.

El ejercicio se desarrolla suponiendo que se construirá una pirámide con bloques de varios «pisos».

Se observa que el número de bloques coincide con el número de piso a construir.
Ejemplo:

  • Piso 1 tiene 1 bloque,
  • piso 2 tiene 2 bloques,
  • etc.
piso = 1  # contador
usados = 0 # acumulador

Cada piso usa una cierta cantidad de bloques que se cuentan como «usados», es decir se acumulan. La cantidad de bloques por piso es la misma que el número del piso, contador que se inicia con 1.

El lazo o bucle  repite el proceso de tal forma que los bloques usados  se acumulan en cada piso.

while (usados<t):
    usados = usados + piso
    piso = piso+1

Dado un número t de bloques ,se calcula la secuencia de números triangulares mientras los bloques usados sean menores que los t disponibles.

En caso que el número “usados” de la secuencia es igual a t, se considera al número t como un número triangular.

La respuesta es un valor de verdad, si es triangular 1, si no lo es 0.

[ mientras-repita ] [ repita-hasta ] [ diagrama flujo ]
..


Algoritmo en Python: Bucle/Lazo mientras-repita

# ICM00794-Fundamentos de Computación - FCNM-ESPOL
# 1Eva_IIIT2003_T2 Números triangulares
# Propuesta de solución. edelros@espol.edu.ec

# INGRESO
t = int(input('Verificar si es triangular: '))

# PROCEDIMIENTO
piso = 1
usados = 0
while (usados<t):
    usados = usados + piso
    piso = piso+1

# verifica si es triangular
if usados==t:
    estriangular = 1
else:
    estriangular = 0

# SALIDA
print(estriangular )

[ mientras-repita ] [ repita-hasta ] [ diagrama flujo ]
..


Algoritmo en Python: Bucle/Lazo Repita-hasta

# ICM00794-Fundamentos de Computación - FCNM-ESPOL
# 1Eva_IIIT2003_T2 Números triangulares
# Propuesta de solución. edelros@espol.edu.ec

# INGRESO
t = int(input('Verificar si es triangular: '))

# PROCEDIMIENTO
piso = 1
usados = 0
while not(usados>=t):
    usados = usados+piso
    piso = piso+1

# verifica si es triangular
if usados==t:
    estriangular = 1
else:
    estriangular = 0

# SALIDA
print(estriangular )

[ mientras-repita ] [ repita-hasta ] [ diagrama flujo ]
..


Diagrama de Flujo

Diagrama de Flujo de números triangulares

[ mientras-repita ] [ repita-hasta ] [ diagrama flujo ]


Propuesta de solución con diagrama de flujo, Python y otra versión con Matlab

ejercicios resueltos Python Parc_IIIT2003_T2 pdf

ejercicios resueltos Matlab parc_iiit2003_t2 pdf

[ mientras-repita ] [ repita-hasta ] [ diagrama flujo ]

s2Eva_IIT2003_T2 Mostrar un triángulo de Pascal

Ejercicio: 2Eva_IIT2003_T2 Mostrar un triángulo de Pascal

Para crear la matriz de Pascal en Python se usa la librería Numpy, con lo que se crea un arreglo de tamaño nxn lleno de ceros.

ejemplo:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
…. …. …. …. …. ….

Al recorrer la matriz por cada fila f y columna c, si la posición matriz[f,c] es la primera columna a la izquierda (c==0) o la diagonal (f==c) se escribe 1.

Si la posición de la matriz[f,c] es debajo de la diagonal, se suman los valores de las casilla inmediata superior e izquierda superior.

pascal[f,c] = pascal[f-1,c] + pascal[f-1,c-1]

Al terminar el recorrido se tendrá la matriz con el triángulo de Pascal.

Propuesta de solución en Python: py_pdf, también en versión matlab: m_pdf

Tarea: Convertir el algoritmo a función.

Algoritmo en Python

# ICM00794-Fundamentos de Computación - FCNM-ESPOL
# 2Eva_IIT2003_T2 Mostrar un triángulo de Pascal
# propuesta: edelros@espol.edu.ec

import numpy as np

# INGRESO
n = int(input('tamaño del triangulo: '))

# PROCEDIMIENTO
pascal = np.zeros(shape=(n,n),dtype=int)
f = 0
while (f<n):
    c = 0
    while (c<=f):
        if (c==0 or c==f):
            pascal[f,c] = 1
        else:
            pascal[f,c] = pascal[f-1,c] + pascal[f-1,c-1]
        c = c+1
    f = f+1

print(pascal)

resultado del algoritmo en una matriz

tamaño del triangulo: 10
[[  1   0   0   0   0   0   0   0   0   0]
 [  1   1   0   0   0   0   0   0   0   0]
 [  1   2   1   0   0   0   0   0   0   0]
 [  1   3   3   1   0   0   0   0   0   0]
 [  1   4   6   4   1   0   0   0   0   0]
 [  1   5  10  10   5   1   0   0   0   0]
 [  1   6  15  20  15   6   1   0   0   0]
 [  1   7  21  35  35  21   7   1   0   0]
 [  1   8  28  56  70  56  28   8   1   0]
 [  1   9  36  84 126 126  84  36   9   1]]
>>>

ejercicios resueltos Python final_iit2003_t2 pdf

ejercicios resueltos Matlab final_iit2003_t2 pdf