Mostrando entradas con la etiqueta Programación. Mostrar todas las entradas
Mostrando entradas con la etiqueta Programación. Mostrar todas las entradas

El método de la trisección Examen interciclo semestre mar-ago 2021

31 de mayo de 2021

El método numérico llamado método de la trisección no existe, sin embargo, resulta en un práctica interesante de programación.

La única diferencia entre el método de la bisección y el de la trisección es que, en este último, el intervalo de búsqueda de la raíz se divide en tres parte iguales.

La definición completa del examen se encuentra en https://www.scribd.com/doc/306301095/Ejercicios-Basicos-de-Programacion

Una posible solución

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Thu May 20 19:36:44 2021
Me tomó 27 minutos resolver
27*3 + 15 min. para leer el texto = 96 min.
96 min. + 5 min. para subir a evirtual = 101 min.
@author: Angel Vázquez-Patiño
"""
from math import factorial

def seno(x):
    suma = 0
    for i in range(50):
        numerador = ((-1)**i)*(x**(2*i+1))
        denominador = factorial(2*i+1)
        suma += numerador/denominador
    return suma

def f(x):
    return seno(2*x+1)-(3/5)*x+1

def triseccion(f, a, b):
    aproximaciones = [(a+b)/2]
    e_a = 1 # para que entre al menos una vez al while
    while e_a > 0.000001:
        mi = a + (b-a)/3
        md = (mi + b)/2
        
        if f(a)*f(mi) < 0:
            aproximaciones.append((a+mi)/2)
            b = mi
        elif f(mi)*f(md) < 0:
            aproximaciones.append((mi+md)/2)
            a, b = mi, md
        elif f(md)*f(b) < 0:
            aproximaciones.append((md+b)/2)
            a = md
        elif f(mi) == 0:
            aproximaciones.append(mi)
            return aproximaciones
        elif f(md) == 0:
            aproximaciones.append(md)
            return aproximaciones
        
        e_a = abs((aproximaciones[-1]-aproximaciones[-2])/aproximaciones[-1])
    return aproximaciones

def grabar(lista, path):
    with open(path, 'w') as f:
        f.write('Aproximación, Valor\n')
        for i in range(len(lista)):
            f.write(str(i)+','+str(lista[i])+'\n')
a, b = -19, 3.5          
aproxs = triseccion(f, -19, 3.5)
grabar(aproxs, 'interciclo_resultados.csv')
# FIN de esta posible solución del examen (hay muchas otras formas de resolverlo)

# De aquí en adelante no es parte del examen
import numpy as np # Esto no he utilizado en la solución en sí del examen
from matplotlib import pyplot as plt # Esto no he utilizado en la solución en sí del examen
xs = np.linspace(a, b, 100)
ys = [seno(2*i+1)-3*i/5+1 for i in xs]
ys = np.array(ys)

plt.figure(figsize=(4,3))
plt.plot(xs, ys, label='$f(x)$', lw=2)
plt.scatter([1.21], [0], label='raíz', color='k')
plt.axhline(0, color='gray')
plt.axvline(0, color='gray')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()

El juego de las palabras cosidas Prueba 2 semestre mar-ago 2021

20 de mayo de 2021

Prueba dos de la materia de Programación Orientada al Cálculo Científico del semestre marzo - agosto 2021. Tomado el día jueves 20 de mayo de 2021.

Planteamiento

El juego comienza generando una letra del alfabeto (incluyendo la letra ñ) de manera aleatoria (0.5 puntos). Con esa primera letra, el jugador 1 debe escribir una palabra. El jugador 2 debe escribir una siguiente palabra que comience con la letra con la que termina la palabra del jugador 1. Esa palabra debe ser una que no haya sido escrita antes por ningún jugador. De la misma manera, el jugador 1 debe escribir una nueva palabra que comience con la última letra de la última palabra escrita por el jugador 2. Esa palabra debe ser una que no haya sido escrita antes por ningún jugador. Se repite estos pasos hasta que termine el juego (1 punto). El juego termina cuando los dos jugadores, de manera sucesiva, no son capaces de escribir palabras diferentes (i.e., que no hayan sido ingresadas antes por cualquiera de los dos jugadores) o siguiendo la regla del juego (e.g., cuando el jugador escribe una palabra que no comienza con la última letra de la última palabra escrita) (1.5 puntos). Un jugador tiene la posibilidad de indicar que no puede escribir una palabra válida presionando la tecla Enter sin antes escribir ningún carácter; cuando en dos jugadas sucesivas se presiona Enter, se termina el juego (0.5 puntos). Gana el juego la persona que haya escrito el mayor número de caracteres (se suma la cantidad de caracteres de todas las palabras ingresadas por cada jugador); se lo debe indicar cuando termina el juego (0.5 puntos). Al finalizar el juego, todas las palabras (una palabra es una cadena de al menos un carácter) diferentes ingresadas por los jugadores deben ser escritas en un archivo junto con el puntaje de cada jugador (1 punto).

Si usa Python, la siguiente línea de código le ayuda a generar las letras del abecedario: import string; print(string.ascii_lowercase).

Ejemplos de la ejecución del juego se muestran en el documento Ejercicios Básicos de Programación.

Una posible solución

import string
from random import choice

def letra():
    letras = list(string.ascii_lowercase)
    letras.append('ñ')
    return choice(letras)

palabras1 = [] # palabras del jugador 1
palabras2 = [] # palabras del jugador 2

ultima_letra = letra()
palabras_repetidas = 0 # permite terminar el juego
palabras_que_comienzan_mal = 0 # permite terminar el juego
enters = 0 # permite terminar el juego
jugador = 1 # la uso como bandera
print(ultima_letra)
while palabras_repetidas < 2 and palabras_que_comienzan_mal < 2 and enters < 2:
    palabra = input('Jugador '+str(jugador)+': ')
    if palabra in palabras1 or palabra in palabras2:
        palabras_repetidas += 1
    else:
        palabras_repetidas = 0
    if palabra != '':
        if palabra[0] != ultima_letra:
            palabras_que_comienzan_mal += 1
        else:
            palabras_que_comienzan_mal = 0
    
    if palabra == '':
        enters += 1
    else:
        enters = 0
    if (not palabra in palabras1) and palabra != '' and palabra[0] == ultima_letra:
        if jugador == 1:
            palabras1.append(palabra)
        else: # cuando jugador es igual a 2
            palabras2.append(palabra)
            
    if palabra != '':
        ultima_letra = palabra[-1]
    
    if jugador == 1: # uso de la estrategia de bandera
        jugador = 2  # para cambiar de jugador en cada iteración
    else:
        jugador = 1

print('\nPalabras repetidas sucesivas:', palabras_repetidas)
print('Palabras sucesivas con primera letra incorrecta:', palabras_que_comienzan_mal)
print('\"Enters\" sucesivos:', enters, end='\n\n')

puntaje1, puntaje2 = 0, 0 # puntajes para los jugadores

for elemento in palabras1:
    puntaje1 += len(elemento)
for elemento in palabras2:
    puntaje2 += len(elemento)

if puntaje1 > puntaje2:
    print('¡Ganó jugador 1!')
elif puntaje2 > puntaje1:
    print('¡Ganó jugador 2!')
else:
    print('¡Hubo empate!')

print('\tJugador 1:', puntaje1, 'puntos.')
print('\tJugador 2:', puntaje2, 'puntos.')

with open('prueba2.csv', 'w') as f:
    f.write('Jugador 1, Jugador 2\n')
    longitud = max(len(palabras1), len(palabras2))
    for i in range(longitud):
        
        if not(i >= len(palabras1)):
            f.write(palabras1[i]+',')
        else:
            f.write(',')
        if not(i >= len(palabras2)):
            f.write(palabras2[i]+'\n')
        else:
            f.write(',\n')

Examen supletorio programación semestre sep 2020 - feb 2021

5 de marzo de 2021

Examen supletorio de la materia de Programación Orientada al Cálculo Científico del semestre septiembre 2020 - febrero 2021. Tomado el día viernes 5 de marzo de 2021.

Planteamiento

  1. Lea CON PANDAS el archivo predictores_estacionarios_luego_de_mutual_info_regression.csv (3 puntos). La primera columna en el archivo es el índice (que es una fecha) que debe usar para el DataFrame 1 de pandas (4 puntos).
  2. Para cada columna del DataFrame 1 de Pandas que contenga la información del archivo (no el índice del DataFrame), ajuste una recta. De cada recta ajustada a los datos, de cada columna del DataFrame 1, tome el valor de la pendiente. (8 puntos)
  3. Genere un nuevo DataFrame 2 de Pandas que contenga las mismas columnas que el DataFrame 1 referido en el punto 1 y 2 (4 puntos). En la única fila que va a tener este nuevo DataFrame 2, debe poner las pendientes que calculó en el punto 2. Es decir, en cada columna debe estar la pendiente correspondiente a la recta ajustada a los datos de las columnas correspondientes del DataFrame 1 (4 puntos).
  4. Guarde el nuevo DataFrame 2 de Pandas referido en el punto 3 como archivo csv (ponga el nombre que quiera al archivo) (3 puntos). El archivo csv no debe ser guardado con el índice que tiene el DataFrame (4 puntos).
  5. Suba a EVIRTUAL solamente el archivo .py de su script. Debe subir un (1) script. Puede subir hasta las 09h00. Solamente calificaré lo que suba a EVIRTUAL.

Nota: La información del DataFrame 2 debe ser guardado utilizando Pandas.

Solución

import pandas as pd
from scipy.optimize import curve_fit

def f(x, m, a):
    ''' Función que evalua una función que es un polinomio de primer grado.
    x: valor de la abscisa
    m: valor de la pendiente
    a: valor del intercepto
    '''
    return m*x + a

# index_col = 0 indica que la primera columna del archivo se usará como índice
df1 = pd.read_csv('predictores_estacionarios_luego_de_mutual_info_regression.csv',
                  index_col=0)

df2 = pd.DataFrame(columns=df1.columns, index=['Pendiente'])

for columna in df1.columns:
    # línea que permite verificar resultados
    print('Columna', columna)
    parametros, _ = curve_fit(f, range(len(df1[columna])), df1[columna])
    # línea que permite verificar resultados
    print('\tPendiente: {0}\n\tIntercepto: {1}'.format(parametros[0], parametros[1]))
    df2[columna] = parametros[0]
    
# index=False indica que no se guardará el índice en el archivo csv
df2.to_csv('pendientes.csv', index=False)

Graficación de datos experimentales en 3D: dispersión, superficie, malla y líneas de contorno

24 de junio de 2015

clear all;
clc;

% Ejemplo que indica cómo graficar un conjunto de puntos en 3D. Estos
% puntos pueden ser datos producto de un experimento de dos variables
% independientes (x, y en este ejemplo) y una variable dependiente (z en
% este ejemplo).
%
% En este caso vamos a utilizar una función z = x^2 + y^2 para generar los
% datos de prueba de la variable dependiente (z). Como se dijo anteriormente,
% estos datos no necesariamente deben venir de una función definida, sino
% que pueden ser datos de algún experimento. Por lo tanto, dichos datos
% podrían no estar linealmente espaciados (en el ejemplo, gracias a la
% generación de datos aleatorios con rand, los datos de las variables
% independientes no son linealmente espaciados).

% Generación de 150 datos aleatorios que constituyen los valores de las
% variables independientes. Estos puntos (x,y) son los que serán evaluados
% con la función de un paraboloide.
x=rand(150,1)*20-10;
y=rand(150,1)*20-10;

% Generamos los datos de la variable dependiente evaluando la función en
% los puntos datos por las variables x, y.
z=x.^2+y.^2;

% Graficación de los puntos (gráfica de dispersión) en 3D.
subplot(2,2,1); scatter3(x,y,z); title('Scatter 3D')

% Dado que los puntos generados no son linealmente espaciados. Encontramos
% una función de interpolación que pase por cada uno de los datos datos.
F=TriScatteredInterp(x,y,z);

% Generamos datos linealmente espaciados desde el límite inferior de los
% datos de x (min(x)) hasta el límite superior de y (max(x)).
xlin=linspace(min(x),max(x));
% Generamos datos linealmente espaciados desde el límite inferior de los
% datos de x (min(y)) hasta el límite superior de y (max(y)).
ylin=linspace(min(y),max(y));

% Generamos una rejilla de malla (matriz) de datos linealmente espaciados
% que serán utilizados para la evaluación de la función interpolada (F)
[X,Y]=meshgrid(xlin,ylin);

% Evaluación de los puntos de la malla con la función (F) producto de la
% interpolación.
Z=F(X,Y);

subplot(2,2,2); surf(X,Y,Z); title('Superficie: z = x^2 + y^2')
subplot(2,2,3); mesh(X,Y,Z); title('Malla: z = x^2 + y^2')
subplot(2,2,4); contour(X,Y,Z);

Figura 1: resultado final del programa.

Apache Wicket 1.5.3 en Eclipse Helios

26 de noviembre de 2011

En una entrada anterior [1] publiqué cómo hacer un "Hola Mundo" en Eclipse usando el Framework Apache Wicket. Indiqué que lo había hecho con la versión 1.3 de Wicket. He encontrado la forma en la que se debe crear un nuevo proyecto con la versión más reciente del Framework. Dejo el vídeo [2].

Referencias:
[1] http://ingfomentor.blogspot.com/2011/11/hola-mundo-con-wicket-en-eclipse-sobre.html
[2] http://youtu.be/3fdiCBb4rK8

Hola Mundo con Apache Wicket en Eclipse sobre servidor Apache Tomcat

3 de noviembre de 2011

La idea fue probar la forma de crear aplicaciones con el framework java Apache Wicket utilizando Eclipse. Lo logré, mas he optado por hacerlo en NetBeans pues es mucho más fácil con el plugin [1] que se tiene para ese IDE (si no se instala el plugin, asegurarse de que se tiene la última versión del IDE) y sobre todo tiene la versión 1.4, en cambio en Eclipse se crea y utiliza la versión 1.3 (debe haber cómo utilizar la última versión de Wicket, pero he decidido no seguir gastando tiempo en hacer eso).

Si se desea comenzar a utilizar Apache Wicket recomiendo seguir el libro Enjoying Web Development with Wicket de Kent Ka Iok Tong que, aunque es del 2007, me ha ayudado sobremanera.

1. Descargar Apache Tomcat [2].
2. Instalar el servidor Apache Tomcat en Eclipse [3]. Para provar un proyecto web básico verificando que el servidor funcione [4].
3. Instalar Plugin Maven 2 en Eclipse [5].
4. Creamos un nuevo proyecto Maven 2

Instalación de NetBeans IDE 7.0.1 en Ubuntu 11.04

18 de septiembre de 2011

  1. Descargar el IDE desde la página oficial de NetBeans [1].
  2. Con el paquete en algún directorio local, desde el terminal tecleamos [2]: sudo sh netbeans-7.0.1-ml-linux.sh
  3. Se nos lanza el instalador.

Error en el tipo de datos cargados en la función SIM

7 de septiembre de 2011

La idea principal fue crear un ejecutable en Matlab [1] en donde se hace uso de funciones de redes neuronales. Este ejecutable debía servir sin la necesidad de que Matlab esté instalado en el equipo. El problema surgió cuando se genero el ejecutable. En una de las funciones, a saber, la función sim, no podía funcionar con uno de los parámetros que matlab "automáticamente" cambiaba de tipo al cargar. Se hacía la carga de la siguiente manera 

load('net.mat');

El error era el siguiente:

Warning: Class ':all:' is an unknown object class. Object 'net' of this class has been converted to a structure.

La solución [2] simplemente fue agregar una línea de código al comienzo del archivo que contenía la línea mencionada (load('net.mat');), es línea fue la siguiente:

%#function network

Con esto ya no se cambiaba el tipo de objeto y la ejecución era exitosa.

Referencias

Operador

29 de agosto de 2010

Los operadores son un tipo de tokens que indican una evaluación para ser realizada en objetos o datos, y en definitiva sobre identificadores o constantes; devolviendo un valor cuyo tipo depende del operador y el tipo de sus operandos.

Los operadores realizan alguna función sobre uno, dos o tres operandos.

Operadores Unitarios
 
Los operadores que requieren un operando son llamados operadores unarios. Por ejemplo, el operador "--" es un operador unario que decrementa el valor de su operando en una unidad y puede ser utilizada en la mayoría de lenguajes como notación forma prefija o posfija.

Operadores Binarios
 
Los operadores que requieren dos operandos se llaman operadores binarios. Por ejemplo el operador "=" es un operador binario que asigna el valor del operando del lado derecho al operando del lado izquierdo.

Operadores Ternarios
 
Los operadores ternarios son aquellos que requieren tres operandos. Por ejemplo el lenguaje Java tiene un operador condicional "?:" que es el único operador ternario en este lenguaje.

Este operador ternario usa notación infija; y cada parte del operador aparece entre operandos:

expresión ? operación1 : operación2

Fuentes
  • Manzanedo del Campo, Miguel Ángel. “Operadores.” Guía de Iniciación al Lenguaje JAVA, October 1999. http://zarza.usal.es/~fgarcia/doc/tuto2/II_3.htm.
  • Deitel. "Cómo programar en Java". 5ta edición

Related Posts with Thumbnails