diff --git a/BONGEE.CSV b/BONGEE.CSV new file mode 100644 index 0000000..7bb4756 --- /dev/null +++ b/BONGEE.CSV @@ -0,0 +1,500 @@ +0 10.000 +1 -8.849 +2 -10.357 +3 8.776 +4 11.846 +5 -7.451 +6 -12.131 +7 7.205 +8 13.533 +9 -5.712 +10 -13.715 +11 5.302 +12 14.998 +13 -3.651 +14 -15.047 +15 3.091 +16 16.182 +17 -1.297 +18 -16.068 +19 0.605 +20 17.025 +21 1.309 +22 -16.721 +23 -2.110 +24 17.475 +25 4.118 +26 -16.956 +27 -4.998 +28 17.484 +29 7.069 +30 -16.729 +31 -7.994 +32 17.013 +33 10.091 +34 -16.005 +35 -11.023 +36 16.032 +37 13.107 +38 -14.762 +39 -14.004 +40 14.523 +41 16.031 +42 -12.987 +43 -16.849 +44 12.482 +45 18.773 +46 -10.683 +47 -19.466 +48 9.920 +49 21.241 +50 -7.868 +51 -21.761 +52 6.861 +53 23.342 +54 -4.576 +55 -23.643 +56 3.347 +57 24.983 +58 -0.856 +59 -25.022 +60 -0.563 +61 26.079 +62 3.226 +63 -25.815 +64 -4.795 +65 26.549 +66 7.587 +67 -25.947 +68 -9.261 +69 26.327 +70 12.130 +71 -25.356 +72 -13.854 +73 25.356 +74 16.745 +75 -23.995 +76 -18.458 +77 23.598 +78 21.307 +79 -21.835 +80 -22.945 +81 21.032 +82 25.685 +83 -18.863 +84 -27.180 +85 17.658 +86 29.740 +87 -15.093 +88 -31.020 +89 13.500 +90 33.330 +91 -10.558 +92 -34.324 +93 8.603 +94 36.314 +95 -5.318 +96 -36.952 +97 3.040 +98 38.553 +99 0.544 +100 -38.771 +101 -3.092 +102 39.920 +103 6.917 +104 -39.657 +105 -9.673 +106 40.299 +107 13.669 +108 -39.504 +109 -16.557 +110 39.592 +111 20.645 +112 -38.224 +113 -23.580 +114 37.722 +115 27.669 +116 -35.752 +117 -30.557 +118 34.639 +119 34.548 +120 -32.053 +121 -37.288 +122 30.322 +123 41.079 +124 -27.121 +125 -43.564 +126 24.783 +127 47.046 +128 -20.985 +129 -49.168 +130 18.067 +131 52.233 +132 -13.710 +133 -53.884 +134 10.259 +135 56.425 +136 -5.400 +137 -57.502 +138 1.480 +139 59.418 +140 3.807 +141 -59.823 +142 -8.109 +143 61.022 +144 13.730 +145 -60.666 +146 -18.312 +147 61.067 +148 24.155 +149 -59.879 +150 -28.898 +151 59.416 +152 34.836 +153 -57.338 +154 -39.605 +155 55.964 +156 45.497 +157 -52.959 +158 -50.144 +159 50.648 +160 55.836 +161 -46.702 +162 -60.204 +163 43.452 +164 65.536 +165 -38.576 +166 -69.462 +167 34.411 +168 74.269 +169 -28.642 +170 -77.588 +171 23.614 +172 81.705 +173 -17.019 +174 -84.254 +175 11.209 +176 87.522 +177 -3.882 +178 -89.144 +179 -2.601 +180 91.412 +181 10.535 +182 -91.964 +183 -17.553 +184 93.097 +185 25.942 +186 -92.452 +187 -33.329 +188 92.333 +189 41.996 +190 -90.388 +191 -49.562 +192 88.926 +193 58.304 +194 -85.603 +195 -65.837 +196 82.737 +197 74.432 +198 -77.991 +199 -81.702 +200 73.692 +201 89.915 +202 -67.514 +203 -96.678 +204 61.792 +205 104.260 +206 -54.211 +207 -110.267 +208 47.117 +209 116.965 +210 -38.205 +211 -121.964 +212 29.832 +213 127.531 +214 -19.704 +215 -131.276 +216 10.189 +217 135.471 +218 0.995 +219 -137.731 +220 -11.470 +221 140.331 +222 23.507 +223 -140.894 +224 -34.718 +225 141.703 +226 47.363 +227 -140.387 +228 -59.045 +229 139.238 +230 72.015 +231 -135.897 +232 -83.865 +233 132.667 +234 96.842 +235 -127.199 +236 -108.529 +237 121.809 +238 121.166 +239 -114.162 +240 -132.331 +241 106.588 +242 144.261 +243 -96.767 +244 -154.530 +245 87.045 +246 165.372 +247 -75.116 +248 -174.361 +249 63.343 +250 183.732 +251 -49.437 +252 -191.061 +253 35.777 +254 198.585 +255 -20.092 +256 -203.885 +257 4.778 +258 209.203 +259 12.421 +260 -212.130 +261 -29.093 +262 214.916 +263 47.475 +264 -215.160 +265 -65.141 +266 215.127 +267 84.313 +268 -212.430 +269 -102.550 +270 209.345 +271 122.061 +272 -203.504 +273 -140.393 +274 197.200 +275 159.744 +276 -188.084 +277 -177.651 +278 178.469 +279 196.302 +280 -166.026 +281 -213.228 +282 153.093 +283 230.612 +284 -137.361 +285 -245.980 +286 121.193 +287 261.514 +288 -102.305 +289 -274.741 +290 83.084 +291 287.843 +292 -61.273 +293 -298.351 +294 39.284 +295 308.455 +296 -14.884 +297 -315.694 +298 -9.487 +299 322.269 +300 36.037 +301 -325.730 +302 -62.303 +303 328.295 +304 90.467 +305 -327.531 +306 -118.045 +307 325.675 +308 147.194 +309 -320.317 +310 -175.411 +311 313.716 +312 204.834 +313 -303.491 +314 -232.940 +315 291.928 +316 261.853 +317 -276.673 +318 -289.036 +319 260.047 +320 316.602 +321 -239.729 +322 -342.003 +323 218.074 +324 367.347 +325 -192.797 +326 -390.081 +327 166.289 +328 412.313 +329 -136.304 +330 -431.492 +331 105.272 +332 449.730 +333 -70.986 +334 -464.486 +335 35.914 +336 477.883 +337 2.112 +338 -487.394 +339 -40.584 +340 495.163 +341 81.632 +342 -498.683 +343 -122.712 +344 500.123 +345 165.917 +346 -497.007 +347 -208.670 +348 491.535 +349 253.032 +350 -481.265 +351 -296.393 +352 468.437 +353 340.788 +354 -450.653 +355 -383.581 +356 430.193 +357 426.786 +358 -404.709 +359 -467.748 +360 376.531 +361 508.464 +362 -343.361 +363 -546.269 +364 307.587 +365 583.153 +366 -266.964 +367 -616.448 +368 223.937 +369 648.145 +370 -176.321 +371 -675.582 +372 126.620 +373 700.761 +374 -72.709 +375 -721.037 +376 17.150 +377 738.433 +378 42.122 +379 -750.330 +380 -102.486 +381 758.783 +382 165.951 +383 -761.210 +384 -229.841 +385 759.709 +386 296.111 +387 -751.743 +388 -362.034 +389 739.463 +390 429.518 +391 -720.390 +392 -495.793 +393 696.737 +394 562.726 +395 -666.092 +396 -627.514 +397 630.737 +398 691.992 +399 -588.335 +400 -753.330 +401 541.248 +402 813.346 +403 -487.220 +404 -869.197 +405 428.695 +406 922.693 +407 -363.506 +408 -970.991 +409 294.185 +410 1015.909 +411 -218.655 +412 -1054.617 +413 139.538 +414 1088.956 +415 -54.848 +416 -1116.126 +417 -32.701 +418 1138.005 +419 125.007 +420 -1151.838 +421 -219.269 +422 1159.557 +423 317.300 +424 -1158.469 +425 -416.215 +426 1150.574 +427 517.750 +428 -1133.257 +429 -618.946 +430 1108.604 +431 721.470 +432 -1074.090 +433 -822.300 +434 1031.899 +435 923.047 +436 -979.614 +437 -1020.642 +438 919.531 +439 1116.652 +440 -849.348 +441 -1207.975 +442 771.486 +443 1296.158 +444 -683.768 +445 -1378.084 +446 588.747 +447 1455.295 +448 -484.381 +449 -1524.682 +450 373.356 +451 1587.805 +452 -253.772 +453 -1641.584 +454 128.451 +455 1687.621 +456 4.370 +457 -1722.889 +458 -141.730 +459 1749.054 +460 285.258 +461 -1763.168 +462 -431.862 +463 1766.987 +464 583.045 +465 -1757.662 +466 -735.594 +467 1737.064 +468 890.895 +469 -1702.470 +470 -1045.628 +471 1655.886 +472 1201.082 +473 -1594.737 +474 -1353.847 +475 1521.185 +476 1505.134 +477 -1432.823 +478 -1651.465 +479 1331.991 +480 1793.996 +481 -1216.464 +482 -1929.212 +483 1088.773 +484 2058.241 +485 -946.892 +486 -2177.556 +487 793.554 +488 2288.292 +489 -626.939 +490 -2386.943 +491 449.991 +492 2474.684 +493 -261.099 +494 -2548.064 +495 63.417 +496 2608.333 +497 144.455 +498 -2652.134 +499 -359.158 diff --git a/Equipo1-DocumentacionPractica1.pdf b/Equipo1-DocumentacionPractica1.pdf new file mode 100644 index 0000000..037da98 Binary files /dev/null and b/Equipo1-DocumentacionPractica1.pdf differ diff --git a/bongee b/bongee new file mode 100755 index 0000000..659cac1 Binary files /dev/null and b/bongee differ diff --git a/bongee_prediction.h b/bongee_prediction.h new file mode 100644 index 0000000..50b065d --- /dev/null +++ b/bongee_prediction.h @@ -0,0 +1,187 @@ +// +// bongee_prediction.h +// +// +// Creado por Rodrigo Garcia y Jesus Enrique Domìnguez el 25 de septiembre del 2020. +// + +#ifndef bongee_prediction_h +#define bongee_prediction_h + + +/* +* System headers required by the following declarations +* (the implementation will import its specific dependencies): +*/ + +#include +#include + +/* +* Application specific headers required by the following declarations +* (the implementation will import its specific dependencies): +*/ + +/* Constants declarations. */ + +/* Set EXTERN macro: */ + +#ifndef bongee_prediction_IMPORT + #define EXTERN +#else + #define EXTERN extern +#endif + +/* Types declarations. */ + + +/* Global variables declarations. */ +#define COLUMNS 2 + + +/* Function prototypes. */ + + +/* + * + * La funcion vista_Menu proporciona al usuario un menu con la bienvenida y la forma de operar del sistema. + * Pedira los datos y las mandara a la siguiente funcion del proceso. + * + * @params + * void + + * @returns + entero que confirma si se repetira el proceso o no +*/ + + +EXTERN int vista_Menu(void); + + +/* + * + * La funcion vista_Resultados proporciona al usuario los resultados de su prediccion. + * Determinara si el proceso desea repetirse. + * + * @params + * tiempo (double): + tiempo en el futuro que se predijo + * muestras (double): + muestras que se tomaron en el proceso de inferencia + * tiempo_choque (double): + tiempo en el cual se genero el primer choque. + * chocado (int) + variable para identificar si hubo un choque. + + * @returns + entero con la confirmacion de si se debe repetir o no +*/ + + +EXTERN int vista_Resultados(double tiempo, double muestras, double tiempo_choque, int chocado); + + +/* + * + * La funcion controlador_Proceso settea las variables y llama a los procesos dependiendo de + * lo que se tenga que hacer ahora. + * + * @params + * masa (double): + valor de la masa recibida del menu + * k_constante (int): + valor de la constante k del resorte + * tiempo (double): + cantidad de tiempo a predecir en segundos + * muestras (double): + cantidad de muestras que se tomaran entre el tiempo dado + + * @returns + Estado para repetirse o no +*/ + + +EXTERN int controlador_Proceso(double masa, int k_constante, double tiempo, double muestras); + + +/* + * + * La funcion modelo_Euler_Method predice la posicion de la persona en el bongee dependiendo de los valores dados + * y la regresa al controlador para ser analizada + * + * @params + * delta_t (double): + variable del tiempo entre muestras dentro del periodo de tiempo dado por el usuario + * index (int): + indice que calculara el metodo + * masa (double): + valor de la masa de la persona proporcionado por el usuario + * k_resorte (int): + constante k del resorte proporcionado por el usuario + + * @returns + posicion obtenida de la prediccion en el index determinado +*/ + + +EXTERN double modelo_Euler_Method(double delta_t,int index, double masa, int k_resorte); + +/* + * + * La funcion modelo_Imprime_Archivo imprime una matriz recibida en una archivo CSV + * + * @params + * Archivo (FILE *): + Puntero al archivo donde se imprimira la matriz + * columnas (size_t): + Columnas de la matriz + * buffer[][columnas] (double): + Matriz recibida para imprimir + * filas (size_t): + Filas de la matriz + + * @returns + void +*/ + +EXTERN void modelo_Imprime_Archivo(FILE * Archivo, size_t columnas, double buffer[] [columnas], size_t filas); + + +/* + * La funcion modelo_Nuevo_Archivo instacia un apuntador a un archivo nuevo + * + * @param + * nombre_archivo (char *): + Nombre del archivo + * modo (char *): + Modo en que sera abierto el archivo {r, rb, a, ab, w, wb} + + * @return + apuntador al archivo abierto. +*/ + +EXTERN FILE * modelo_Nuevo_Archivo(char *nombre_archivo, char *modo); + + +/* + * + * La funcion modelo_Grafica genera un plot del archivo CSV previamente creado. + * + * @params + * nombre_archivo (* char): + Archivo el cual sera graficado por GNUplot + + * @returns + void +*/ + +EXTERN void modelo_Grafica (char * nombre_archivo); + + + +#undef bongee_preditcion_IMPORT +#undef EXTERN + + + +#endif /* bongee_prediction_h */ diff --git a/controlador_Proceso.c b/controlador_Proceso.c new file mode 100644 index 0000000..a43e4f4 --- /dev/null +++ b/controlador_Proceso.c @@ -0,0 +1,69 @@ +#include"bongee_prediction.h" + +#define COLUMNAS 2 +#define INDEX 0 +#define POSICION 1 + +#define ARCHIVO "BONGEE.CSV" + +int controlador_Proceso(double masa, int k_constante,double tiempo, double muestras) +{ + int muestras_entero,index, chocado=0, muestra_choque, repetir; + double delta_t, posicion_en_index, inicio = 10; + long int gramos; + + FILE * Archivo = NULL; + + + muestras_entero = (int) muestras; + + double matriz_datos[muestras_entero][COLUMNAS]; + + Archivo = modelo_Nuevo_Archivo(ARCHIVO,"w"); + + + delta_t = tiempo/muestras; + gramos = masa*1000; + + + system("clear"); + + //printf("%d kg\t%d N/m\t%.3lf delta t\n\n",masa, k_constante,delta_t); + + for(index = 0;index < muestras_entero;index++) + { + posicion_en_index = modelo_Euler_Method(delta_t,index,masa,k_constante); + + //printf("\n\nPosicion en muestra %d = %.3lf",index,posicion_en_index); + + matriz_datos[index][INDEX] = index; + matriz_datos[index][POSICION] = posicion_en_index; + + if(posicion_en_index < inicio && index != 0) + { + chocado = 1; + muestra_choque = index; + } + } + + modelo_Imprime_Archivo(Archivo,COLUMNAS,matriz_datos,muestras); + + fclose(Archivo); + + + //Llamada a la funcion que genera el plot + modelo_Grafica(ARCHIVO); + + repetir = vista_Resultados(tiempo,muestras,muestra_choque*delta_t,chocado); + + if(repetir == 1) + { + return 1; + } + + else + { + return 0; + } + +} diff --git a/modelo_Euler_Method.c b/modelo_Euler_Method.c new file mode 100644 index 0000000..91243ac --- /dev/null +++ b/modelo_Euler_Method.c @@ -0,0 +1,22 @@ +#include +#include"bongee_prediction.h" + +#define G 9.81 + +double modelo_Euler_Method(double delta_t,int index, double masa, int k_resorte) +{ + int count; + double pos1 = 10, pos2 = 10, temp, m = 60; + float bt = 10; + + for(count = 0;count < index;count++) + { + temp = (-pos1)*(((-bt*delta_t)/m) + 1 +((k_resorte*(pow(delta_t,2)))/m)) - (2*(-bt*delta_t)/m)*pos2 + (pow(delta_t,2))*G; + + pos1 = pos2; + pos2 = temp; + } + + return pos2; + +} diff --git a/modelo_Grafica.c b/modelo_Grafica.c new file mode 100644 index 0000000..25457eb --- /dev/null +++ b/modelo_Grafica.c @@ -0,0 +1,20 @@ +#include"bongee_prediction.h" + +#define NUM_COMMANDS 2 + +void modelo_Grafica (char * nombre_archivo) +{ + char * commandsForGnuplot[] = {"set title \"Prediccion de bongee\"","plot 'BONGEE.CSV' using 1:2 t 'Trayectoria' with lines"}; + FILE * gnuplotPipe = NULL; + + gnuplotPipe = popen("gnuplot -persistent","w"); + + //Para general el plot + for(int i = 0;i < NUM_COMMANDS;i++) + { + fprintf(gnuplotPipe,"%s \n",commandsForGnuplot[i]); + } + + pclose(gnuplotPipe); + +} diff --git a/modelo_Manejo_Archivos.c b/modelo_Manejo_Archivos.c new file mode 100644 index 0000000..51569f4 --- /dev/null +++ b/modelo_Manejo_Archivos.c @@ -0,0 +1,26 @@ +#include"bongee_prediction.h" + +FILE * modelo_Nuevo_Archivo(char * nombre_archivo, char * modo) +{ + FILE * file; + + file = fopen(nombre_archivo,modo); + + return file; +} + +void modelo_Imprime_Archivo(FILE * Archivo, size_t columnas, double buffer[] [columnas], size_t filas) +{ + int count_rows,count_columns=0; + + for(count_rows = 0;count_rows < filas;count_rows++) + { + fprintf(Archivo,"%.0lf ",buffer[count_rows][count_columns]); + count_columns++; + fprintf(Archivo,"%.3lf",buffer[count_rows][count_columns]); + + count_columns=0; + + fprintf(Archivo,"\n"); + } +} diff --git a/prediction_method.c b/prediction_method.c new file mode 100644 index 0000000..3502a4c --- /dev/null +++ b/prediction_method.c @@ -0,0 +1,24 @@ +// +// prediction_method.c +// +// +// Creado por Rodrigo Garcia el 25 de septiembre del 2020 +// + +#include "bongee_prediction.h" + +int main(void) +{ + int ciclo = 1; + + while(ciclo == 1) + { + ciclo = vista_Menu(); + } + + printf("\n\nHasta luego!!\n\n"); + + return 0; +} + + diff --git a/vista_Menu.c b/vista_Menu.c new file mode 100644 index 0000000..2dde23a --- /dev/null +++ b/vista_Menu.c @@ -0,0 +1,41 @@ +#include"bongee_prediction.h" + +int vista_Menu(void) +{ + int k_resorte, repetir; + double tiempo_a_calcular,muestras,masa; + + system("clear"); + + printf("\n\n\tMetodo de Euler para inferencia de salto en bongee\n\n"); + printf("\n\nEl sistema le permitira determinar si es seguro saltar prediciendo la trayectoria de oscilacion del resorte\nmediante el metodo de Euler\n\nSi en algun momento la persona atada golpea el suelo, se avisara en pantalla."); + printf("\n\nPresiona ENTER para continuar..."); + __fpurge(stdin); + getchar(); + + system("clear"); + + printf("\n\nIngrese la masa de la persona (kg):"); + scanf("%lf",&masa); + + printf("\n\nIngrese la constante 'k' del resorte (N/m):"); + scanf("%d",&k_resorte); + + printf("\n\nIngrese cuanto tiempo en el futuro desea predecir (seg):"); + scanf("%lf",&tiempo_a_calcular); + + printf("\n\nIngrese la cantidad de muestras que desea tomar en ese intervalo de tiempo:"); + scanf("%lf",&muestras); + + repetir = controlador_Proceso(masa,k_resorte,tiempo_a_calcular,muestras); + + if(repetir == 1) + { + return 1; + } + + else + { + return 0; + } +} diff --git a/vista_Resultados.c b/vista_Resultados.c new file mode 100644 index 0000000..f1eff3d --- /dev/null +++ b/vista_Resultados.c @@ -0,0 +1,37 @@ +#include"bongee_prediction.h" + +int vista_Resultados(double tiempo, double muestras, double tiempo_choque, int chocado) +{ + int repetir; + + printf("\n\n\t Se ha creado el archivo!\n\n"); + + printf("\n\nSe infirio un periodo de: %.0lf segundos.\n",tiempo); + printf("Se tomaron un total de:%.0lf muestras.\n",muestras); + printf("¿La persona chocara? "); + + if(chocado == 1) + { + printf("Si\n"); + printf("Chocara por primera vez a un tiempo de %.2lf segundos del inicio.\n\n",tiempo_choque); + } + + else + { + printf("No\n\n"); + } + + printf("¿Desea predecir de nuevo con otros datos? 1-SI 0-NO\n\n"); + printf("Opcion: "); + scanf("%d",&repetir); + + if(repetir == 1) + { + return 1; + } + + else + { + return 0; + } +}