{"id":2719,"date":"2020-11-21T12:46:33","date_gmt":"2020-11-21T17:46:33","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/girni\/?p=2719"},"modified":"2021-12-30T11:49:24","modified_gmt":"2021-12-30T16:49:24","slug":"funciones-girni_lora_libreria","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/girni\/funciones-girni_lora_libreria\/","title":{"rendered":"3.2 Funciones girni_lora_libreria"},"content":{"rendered":"<p>El archivo contiene un grupo de\u00a0 funciones usadas para procesar los datos de este prototipo, se separaron del bloque principal de instrucciones con\u00a0 el objetivo de simplificar el desarrollo del las actividades principales.<\/p>\n<p>Recuerde disponer de este archivo en la misma carpeta que el algoritmo que invoca a la librer\u00eda.<\/p>\n<p>archivo de libreria: <a href=\"https:\/\/drive.google.com\/file\/d\/1XgGYzy0o6ZDTMH3E6OnXvyLdXpI6LH5W\/view?usp=sharing\">girni_lora_libreria<\/a><\/p>\n<h2>datos de muestras<\/h2>\n<p><strong><em>tabulaPunto(unarchivo,directorio)<\/em><\/strong>:<br \/>\nLee el archivo de un punto, tabula cada lectura por dispositivo en diccionario,<br \/>\npor modo: rx, rx y remitente de cada paquete: baliza.<\/p>\n<p><strong><em>describePunto(punto)<\/em><\/strong>:<br \/>\nestadistica descriptiva de un punto, calcula: count, mean, std, min, 25%, 50%, 75%, min, max<\/p>\n<p><em><strong>resumen_medida(punto,medida,descriptor<\/strong><\/em>):<br \/>\nRealiza la tabla resumen de puntos por la medida y descriptor a partir de la tabla de los puntos estadisticos descritos<\/p>\n<h2>Linealizaci\u00f3n para ecuaci\u00f3n<\/h2>\n<p><em><strong>pares_usar<\/strong><\/em>(<em><strong>tabla<\/strong><\/em>, <strong><em>baliza<\/em><\/strong>, <strong><em>analiza<\/em><\/strong>,<strong><em>unabaliza<\/em><\/strong>, unsector ='', medida = 'rssi',modo = 'rx')<\/p>\n<p>Selecciona desde la tabla puntos a usar respecto a una baliza, el resultado se entrega en una lista que contiene los pares ordenados y sus etiquetas [pares, par_etiqueta]<\/p>\n<p><em><strong>linealiza_lstsq<\/strong><\/em>(<em><strong>xi<\/strong><\/em>,<em><strong>yi<\/strong><\/em>,digitos = 3)<br \/>\nemplea el m\u00e9todo de minimos cuadrados para entregar la ecuacion mediante un diccionario que contiene los par\u00e1metros para aplicarla.<\/p>\n<p>La variable d\u00edgitos indica cu\u00e1ntos d\u00edgitos se usar\u00e1n para la ecuaci\u00f3n en formato latex.<\/p>\n<p>El procedimiento se describe en: <a href=\"http:\/\/blog.espol.edu.ec\/girni\/rssidistancia-linealizacion-funcion-python\/\">Rssi(distancia) Linealizaci\u00f3n \u2013 funci\u00f3n Python<\/a><\/p>\n<pre>unaecuacion = {<span style=\"color: #008000\">'alpha'<\/span>   : alpha,\r\n               <span style=\"color: #008000\">'beta'<\/span>    : beta,\r\n               <span style=\"color: #008000\">'eq_latex'<\/span>: fdtxt0,\r\n               <span style=\"color: #008000\">'intervalox'<\/span> : [np.min(xi),np.max(xi)],\r\n               <span style=\"color: #008000\">'error_medio'<\/span>: dyi0mean,\r\n               <span style=\"color: #008000\">'error_std'<\/span>  : dyi0std,\r\n               <span style=\"color: #008000\">'eqg_latex'<\/span>  : grtxt0,\r\n               <span style=\"color: #008000\">'intervaloy'<\/span>  : [np.min(yi),np.max(yi)],\r\n               <span style=\"color: #008000\">'errorx_medio'<\/span>: dxi0mean,\r\n               <span style=\"color: #008000\">'errorx_std'<\/span>  : dxi0std,\r\n               }\r\n<\/pre>\n<h2>Proceso de triangulaci\u00f3n<\/h2>\n<p><em><strong>dist_rssi<\/strong><\/em>(<strong><em>valor,ecuacion_rssi<\/em><\/strong>).\u00a0 Evalua la ecuacion de distancia(rssi) revisando los intervalos disponibles para el <strong>valor<\/strong> de rssi dado<strong>.<\/strong><\/p>\n<p><strong><em>cruce2circulos<\/em><\/strong>(<strong><em>x1<\/em><\/strong>,<strong><em>y1<\/em><\/strong>,<em><strong>r1<\/strong><\/em>,x2,y2,r2). Revisa intervalo de area de cruce entre dos c\u00edrculos de centro y radio: x1, y1, r1 \/\/ x2, y2, r2.<\/p>\n<p><strong><em>raices2circulos<\/em><\/strong>(<em>x1<\/em>,<em><strong>y1<\/strong><\/em>,<em><strong>r1<\/strong><\/em>,x2,y2,r2,tolera=1e-10). Busca las intersecci\u00f3n entre 2 circulos de centro y radio: x1,y1,r1 || x2,y2,r2 . Revisa con cruce2circulos().<\/p>\n<p><em><strong>intersectacirculos<\/strong><\/em>(<em><strong>radio<\/strong><\/em>,<em><strong>centro<\/strong><\/em>,tolera=1e-10). Busca las intersecciones entre parejas de varios c\u00edrculos y las entrega como [raicesx,raicesy], usa las funciones cruce2circulos() y con raices2circulos() que se encuentran en el enlace: <a href=\"http:\/\/blog.espol.edu.ec\/analisisnumerico\/s3eva_it2018_t1-interseccion-de-dos-circulos\/#intersecta2circulos\">Soluci\u00f3n General de intersecci\u00f3n de c\u00edrculos<\/a><\/p>\n<p><em><strong>trilatera<\/strong><\/em>(<em><strong>radio<\/strong><\/em>,<em><strong>centro<\/strong><\/em>,tolera=1e-10). Busca el baricentro entre las intersecciones de varios c\u00edrculos, punto central en el \u00e1rea de<br \/>\nintersecci\u00f3n entre varios circulos. Requiere el resultado de la funci\u00f3n:<br \/>\nraiztodas = intersectacirculos(centro,radio, tolera = 1e-10)<\/p>\n<hr \/>\n<h2>Algoritmo Python<\/h2>\n<pre><span style=\"color: #ff0000\"># Girni LoRa librerias 2020-10-07<\/span>\r\n<span style=\"color: #ff0000\"># LoRa-Multipunto, lecturas de Rssi y SNR<\/span>\r\n<span style=\"color: #ff0000\"># Girni 2020-10-07 propuesta: edelros@espol.edu.ec<\/span>\r\n\r\n<span style=\"color: #d35400\">import<\/span> numpy <span style=\"color: #d35400\">as<\/span> np\r\n<span style=\"color: #d35400\">import<\/span> pandas <span style=\"color: #d35400\">as<\/span> pd\r\n<span style=\"color: #d35400\">import<\/span> scipy.optimize <span style=\"color: #d35400\">as<\/span> sp\r\n\r\n<span style=\"color: #d35400\">def<\/span> <span style=\"color: #0000e6\">tabulaPunto<\/span>(unarchivo,carpeta, prefijo = <span style=\"color: #008000\">'multipunto'<\/span>):\r\n    <span style=\"color: #008000\">''' Lee el archivo de un punto dentro del carpeta,\r\n        elimina el prefijo el nombre del archivo,\r\n        tabula cada lectura por dispositivo en diccionario,\r\n        por modo: rx, rx\r\n        y remitente de cada paquete: baliza\r\n        Prepara para procesar estadistica descriptiva\r\n    '''<\/span>\r\n    <span style=\"color: #ff0000\"># Datos estructura<\/span>\r\n    punto = {<span style=\"color: #008000\">'rx'<\/span>:{},\r\n             <span style=\"color: #008000\">'tx'<\/span>:{},\r\n             <span style=\"color: #008000\">'nombre'<\/span>: <span style=\"color: #008000\">' '<\/span>}\r\n    \r\n    <span style=\"color: #ff0000\"># Lectura de unarchivo<\/span>\r\n    unarchivoubica = carpeta+<span style=\"color: #008000\">'\/'<\/span>+unarchivo\r\n    archivoPunto = <span style=\"color: #ff00ff\">open<\/span>(unarchivoubica,<span style=\"color: #008000\">'r'<\/span>)\r\n\r\n    <span style=\"color: #ff0000\"># nombre del punto desde nombre archivo<\/span>\r\n    pnombre = unarchivo\r\n    pnombre = pnombre.strip(<span style=\"color: #008000\">'.txt'<\/span>)\r\n    n = <span style=\"color: #ff00ff\">len<\/span>(prefijo)\r\n    pnombre = pnombre[n:]\r\n    punto[<span style=\"color: #008000\">'nombre'<\/span>] = pnombre\r\n    \r\n    linea = archivoPunto.readline()\r\n    <span style=\"color: #d35400\">while<\/span> (linea!=<span style=\"color: #008000\">''<\/span>):\r\n        linea_rx = linea.startswith(<span style=\"color: #008000\">'rx'<\/span>)\r\n        linea_tx = linea.startswith(<span style=\"color: #008000\">'tx'<\/span>)\r\n        <span style=\"color: #d35400\">if<\/span> linea_rx <span style=\"color: #d35400\">or<\/span> linea_tx:\r\n            <span style=\"color: #ff0000\"># formato de trama:<\/span>\r\n            <span style=\"color: #ff0000\"># tx_rx, c1_ff, d1_d2_d3, numtrama,<\/span>\r\n            <span style=\"color: #ff0000\"># rssitx, snrtx, rssi_rx,snr_rx<\/span>\r\n            texto = linea.strip(<span style=\"color: #008000\">'\\n'<\/span>)\r\n            texto = texto.split(<span style=\"color: #008000\">','<\/span>)\r\n            rx_tx      = texto[0]\r\n            dir_recibe = texto[1]\r\n            dir_remite = texto[2]\r\n            ID_paquete = <span style=\"color: #ff00ff\">int<\/span>(texto[3])\r\n            rssi_tx    = <span style=\"color: #ff00ff\">float<\/span>(texto[4])\r\n            snr_tx     = <span style=\"color: #ff00ff\">float<\/span>(texto[5])\r\n            rssi_rx    = <span style=\"color: #ff00ff\">float<\/span>(texto[6])\r\n            snr_rx     = <span style=\"color: #ff00ff\">float<\/span>(texto[7])\r\n            <span style=\"color: #ff0000\"># llena datos<\/span>\r\n            <span style=\"color: #d35400\">if<\/span> dir_remite <span style=\"color: #d35400\">in<\/span> punto[rx_tx].keys():\r\n                punto[rx_tx][dir_remite][<span style=\"color: #008000\">'rssi_rx'<\/span>].append(rssi_rx)\r\n                punto[rx_tx][dir_remite][<span style=\"color: #008000\">'snr_rx'<\/span>].append(snr_rx)\r\n                punto[rx_tx][dir_remite][<span style=\"color: #008000\">'secuencia_rx'<\/span>].append(ID_paquete)\r\n                punto[rx_tx][dir_remite][<span style=\"color: #008000\">'rssi_tx'<\/span>].append(rssi_tx)\r\n                punto[rx_tx][dir_remite][<span style=\"color: #008000\">'snr_tx'<\/span>].append(snr_tx)\r\n            <span style=\"color: #d35400\">else<\/span>:\r\n                punto[rx_tx][dir_remite] = {<span style=\"color: #008000\">'rssi_rx'<\/span>: [rssi_rx],\r\n                                            <span style=\"color: #008000\">'snr_rx'<\/span> : [snr_rx],\r\n                                            <span style=\"color: #008000\">'secuencia_rx'<\/span>:[ID_paquete],\r\n                                            <span style=\"color: #008000\">'rssi_tx'<\/span>: [rssi_tx],\r\n                                            <span style=\"color: #008000\">'snr_tx'<\/span> : [snr_tx]}\r\n        <span style=\"color: #ff0000\"># siguiente l\u00ednea<\/span>\r\n        linea = archivoPunto.readline()\r\n    archivoPunto.close()\r\n    <span style=\"color: #d35400\">return<\/span>(punto)\r\n\r\n<span style=\"color: #d35400\">def<\/span> <span style=\"color: #0000e6\">describePunto<\/span>(punto):\r\n    <span style=\"color: #008000\">''' estadistica descriptiva de un punto\r\n    calcula y registra count, mean, std,\r\n    min,25%,50%,75%,max\r\n    '''<\/span>\r\n    estadistica = {}\r\n    <span style=\"color: #d35400\">for<\/span> modo <span style=\"color: #d35400\">in<\/span> punto.keys():\r\n        estadistica[modo] = {}\r\n        <span style=\"color: #ff0000\"># analiza rssi y snr para rx y tx<\/span>\r\n        <span style=\"color: #d35400\">for<\/span> disp <span style=\"color: #d35400\">in<\/span> punto[modo].keys():\r\n            estadistica[modo][disp] = <span style=\"color: #008000\">''<\/span>\r\n            valores = pd.DataFrame(punto[modo][disp])\r\n            descrito = valores.describe()\r\n            descrito = descrito.drop(<span style=\"color: #008000\">'secuencia_rx'<\/span>,axis=1)\r\n            estadistica[modo][disp] = descrito       \r\n    <span style=\"color: #d35400\">return<\/span>(estadistica)\r\n\r\n\r\n<span style=\"color: #d35400\">def<\/span> <span style=\"color: #0000e6\">resumen_medida<\/span>(punto,medida,descriptor):\r\n    <span style=\"color: #008000\">'''\r\n    Realiza la tabla resumen de puntos por\r\n    medida ('rssi' o 'snr')\r\n    y descriptor ('count, mean, std,\r\n     min,25%,50%,75%,max)\r\n    a partir de la tabla de los puntos estadisticos descritos\r\n    '''<\/span>\r\n    rsm_disp = pd.DataFrame()\r\n    <span style=\"color: #d35400\">for<\/span> disp <span style=\"color: #d35400\">in<\/span> punto:\r\n        undisp_rx = punto[disp][medida+<span style=\"color: #008000\">'_rx'<\/span>]\r\n        etiquetarx = medida+<span style=\"color: #008000\">'_rx_'<\/span>+disp\r\n        rsm_disp[etiquetarx] = undisp_rx.copy()\r\n    <span style=\"color: #d35400\">for<\/span> disp <span style=\"color: #d35400\">in<\/span> punto:\r\n        undisp_tx = punto[disp][medida+<span style=\"color: #008000\">'_tx'<\/span>]\r\n        etiquetatx = medida+<span style=\"color: #008000\">'_tx_'<\/span>+disp\r\n        rsm_disp[etiquetatx] = undisp_tx.copy()\r\n    unafila = rsm_disp.loc[descriptor]\r\n    <span style=\"color: #d35400\">return<\/span>(unafila)\r\n\r\n<span style=\"color: #d35400\">def<\/span> <span style=\"color: #0000e6\">pares_usar<\/span>(tabla,baliza, analiza,\r\n                unabaliza, unsector =<span style=\"color: #008000\">''<\/span>, \r\n                medida = <span style=\"color: #008000\">'rssi'<\/span>, modo = <span style=\"color: #008000\">'rx'<\/span>):\r\n    <span style=\"color: #008000\">''' Selecciona en tabla los puntos a usar\r\n        respecto a una baliza  y sector\r\n        resultado en [pares, par_etiqueta]\r\n    '''<\/span>\r\n    \r\n    <span style=\"color: #ff0000\"># balizas referencia para analizar<\/span>\r\n    baliza_key = <span style=\"color: #ff00ff\">list<\/span>(baliza.keys())\r\n    baliza_val = <span style=\"color: #ff00ff\">list<\/span>(baliza.values())\r\n\r\n    donde = baliza_val.index(unabaliza)\r\n    cualbaliza = baliza_key[donde]\r\n\r\n    <span style=\"color: #ff0000\"># banderas de uso y atipicos<\/span>\r\n    bal_sec = cualbaliza+unsector\r\n    tabla[<span style=\"color: #008000\">'usar_'<\/span>+bal_sec] = 0\r\n    tabla[<span style=\"color: #008000\">'atip_'<\/span>+bal_sec] = 0\r\n        \r\n    <span style=\"color: #ff0000\"># Parametros<\/span>\r\n    <span style=\"color: #d35400\">if<\/span> unsector == <span style=\"color: #008000\">''<\/span>:\r\n        analizarque = analiza[unabaliza]\r\n    <span style=\"color: #d35400\">else<\/span>:\r\n        analizarque = analiza[unabaliza][unsector]\r\n    atipico_std = analizarque[<span style=\"color: #008000\">'atipico_std'<\/span>]\r\n    bal_grp = analizarque[<span style=\"color: #008000\">'grp'<\/span>]\r\n    bal_tip = analizarque[<span style=\"color: #008000\">'tip'<\/span>]\r\n    bal_LOS = analizarque[<span style=\"color: #008000\">'LOS'<\/span>]\r\n            \r\n    <span style=\"color: #ff0000\"># usar segmento de grupo\/tipo, bandera True\/False<\/span>\r\n    <span style=\"color: #d35400\">for<\/span> cadapunto <span style=\"color: #d35400\">in<\/span> tabla.index:\r\n        cond1 = tabla[<span style=\"color: #008000\">'grupo'<\/span>][cadapunto] <span style=\"color: #d35400\">in<\/span> bal_grp\r\n        cond2 = tabla[<span style=\"color: #008000\">'tipo'<\/span>][cadapunto] <span style=\"color: #d35400\">in<\/span> bal_tip\r\n        cond3 = tabla[<span style=\"color: #008000\">'LOS_'<\/span>+cualbaliza][cadapunto] <span style=\"color: #d35400\">in<\/span> bal_LOS\r\n        cond4 = <span style=\"color: #d35400\">True<\/span>\r\n        <span style=\"color: #d35400\">if<\/span> unsector != <span style=\"color: #008000\">''<\/span>:\r\n            cond4 = tabla[<span style=\"color: #008000\">'sector_'<\/span>+cualbaliza][cadapunto] == <span style=\"color: #ff00ff\">int<\/span>(unsector.strip(<span style=\"color: #008000\">'s'<\/span>))\r\n        usar = cond1 <span style=\"color: #d35400\">and<\/span> cond2 <span style=\"color: #d35400\">and<\/span> cond3 <span style=\"color: #d35400\">and<\/span> cond4\r\n        valor = 0\r\n        <span style=\"color: #d35400\">if<\/span> usar:\r\n            valor = 1\r\n        tabla.loc[cadapunto,<span style=\"color: #008000\">'usar_'<\/span>+bal_sec] = valor\r\n\r\n    <span style=\"color: #ff0000\"># datos hacia baliza<\/span>\r\n    pares = []\r\n    par_etiqueta = []\r\n    <span style=\"color: #d35400\">for<\/span> cadapunto <span style=\"color: #d35400\">in<\/span> tabla.index:\r\n        columna = medida+<span style=\"color: #008000\">'_'<\/span>+modo+<span style=\"color: #008000\">'_'<\/span>+cualbaliza\r\n        xk = tabla[<span style=\"color: #008000\">'dist_'<\/span>+cualbaliza][cadapunto]\r\n        yk = tabla[columna][cadapunto]\r\n        \r\n        <span style=\"color: #ff0000\"># no vacio y para usar<\/span>\r\n        cond1 = <span style=\"color: #d35400\">not<\/span>(np.isnan(yk))\r\n        cond2 = tabla[<span style=\"color: #008000\">'usar_'<\/span>+bal_sec][cadapunto]\r\n        <span style=\"color: #d35400\">if<\/span> cond1 <span style=\"color: #d35400\">and<\/span> cond2:\r\n            unpar = np.array([xk,yk])\r\n            \r\n            <span style=\"color: #ff0000\"># llena pares y etiquetas<\/span>\r\n            <span style=\"color: #d35400\">if<\/span> <span style=\"color: #ff00ff\">len<\/span>(pares)&gt;0:\r\n                pares = np.concatenate((pares,[unpar]),axis=0)\r\n                par_etiqueta = np.concatenate((par_etiqueta,[cadapunto]),\r\n                                              axis=0)\r\n            <span style=\"color: #d35400\">else<\/span>:\r\n                pares = np.array([unpar])\r\n                par_etiqueta = np.array([cadapunto])\r\n\r\n    <span style=\"color: #ff0000\"># ordena pares para gr\u00e1fica<\/span>\r\n    <span style=\"color: #d35400\">if<\/span> <span style=\"color: #ff00ff\">len<\/span>(pares)&gt;0:\r\n        ordenar = np.argsort(pares[:, 0])\r\n        pares = pares[ordenar]\r\n        par_etiqueta = par_etiqueta[ordenar]\r\n\r\n    <span style=\"color: #d35400\">return<\/span> ([pares, par_etiqueta])\r\n\r\n<span style=\"color: #d35400\">def<\/span> <span style=\"color: #0000e6\">linealiza_lstsq<\/span>(xi,yi,digitos = 3):\r\n    <span style=\"color: #008000\">''' usa minimos cuadrados para entregar la ecuacion\r\n        digitos: usados en expresion latex\r\n    '''<\/span>\r\n    unaecuacion = {}\r\n    <span style=\"color: #ff0000\"># Eje x en log10()<\/span>\r\n    xilog = np.log10(xi)\r\n    n = <span style=\"color: #ff00ff\">len<\/span>(xi)\r\n    \r\n    <span style=\"color: #ff0000\"># m\u00ednimos cuadrados (least square),<\/span>\r\n    <span style=\"color: #ff0000\"># distancia vs medida<\/span>\r\n    A = np.vstack([xilog, np.ones(n)]).T\r\n    [m0, b0] = np.linalg.lstsq(A, yi, rcond=<span style=\"color: #d35400\">None<\/span>)[0]\r\n    alpha = -m0\/10\r\n    beta  = b0\r\n\r\n    <span style=\"color: #ff0000\"># ecuaciones expresion rssi(d)<\/span>\r\n    fdist0 = <span style=\"color: #d35400\">lambda<\/span> d: -10*alpha*(np.log10(d))+beta\r\n    \r\n    fdtxt0 = <span style=\"color: #008000\">r'$ rssi = -10('<\/span> + <span style=\"color: #ff00ff\">str<\/span>(np.round(alpha,digitos))\r\n    fdtxt0 = fdtxt0 + <span style=\"color: #008000\">')log_{10}(d)'<\/span> <span style=\"color: #ff0000\"># +('<\/span>\r\n    texto = <span style=\"color: #008000\">'+'<\/span>\r\n    <span style=\"color: #d35400\">if<\/span> beta &lt;0:\r\n        texto = <span style=\"color: #008000\">'-'<\/span>\r\n    fdtxt0 = fdtxt0 + texto + <span style=\"color: #ff00ff\">str<\/span>(np.round(np.abs(beta),digitos))+<span style=\"color: #008000\">' $'<\/span>\r\n\r\n    <span style=\"color: #ff0000\"># Errores respecto a rssi(d) <\/span>\r\n    yi0  = fdist0(xi)\r\n    dyi0 = yi - yi0\r\n    dyi0mean = np.mean(np.abs(dyi0))\r\n    dyi0std  = np.std(dyi0, dtype=np.float64)\r\n\r\n    <span style=\"color: #ff0000\"># ecuaciones expresion d(rssi)<\/span>\r\n    grssi0 = <span style=\"color: #d35400\">lambda<\/span> rssi: 10**((beta-rssi)\/(10*alpha))\r\n    grtxt0 = <span style=\"color: #008000\">r\"$ d = 10^{(\"<\/span> + <span style=\"color: #ff00ff\">str<\/span>(np.round(beta,digitos)) + <span style=\"color: #008000\">' - '<\/span>\r\n    grtxt0 = grtxt0 + <span style=\"color: #008000\">'rssi)\/'<\/span> + <span style=\"color: #008000\">'(10('<\/span>+<span style=\"color: #ff00ff\">str<\/span>(np.round(alpha,digitos))+<span style=\"color: #008000\">'))} $'<\/span>\r\n\r\n    <span style=\"color: #ff0000\"># Errores respecto a rssi(d) <\/span>\r\n    xi0  = grssi0(yi)\r\n    dxi0 = xi - xi0\r\n    dxi0mean = np.mean(np.abs(dxi0))\r\n    dxi0std  = np.std(dxi0, dtype=np.float64)\r\n    \r\n    unaecuacion = {<span style=\"color: #008000\">'alpha'<\/span>   : alpha,\r\n                   <span style=\"color: #008000\">'beta'<\/span>    : beta,\r\n                   <span style=\"color: #008000\">'eq_latex'<\/span>: fdtxt0,\r\n                   <span style=\"color: #008000\">'intervalox'<\/span> : [np.min(xi),np.max(xi)],\r\n                   <span style=\"color: #008000\">'error_medio'<\/span>: dyi0mean,\r\n                   <span style=\"color: #008000\">'error_std'<\/span>  : dyi0std,\r\n                   <span style=\"color: #008000\">'eqg_latex'<\/span>  : grtxt0,\r\n                   <span style=\"color: #008000\">'intervaloy'<\/span> : [np.min(yi),np.max(yi)],\r\n                   <span style=\"color: #008000\">'errorx_medio'<\/span>: dxi0mean,\r\n                   <span style=\"color: #008000\">'errorx_std'<\/span>  : dxi0std,\r\n                   }\r\n    <span style=\"color: #d35400\">return<\/span>(unaecuacion)\r\n\r\n<span style=\"color: #d35400\">def<\/span> <span style=\"color: #0000e6\">dist_rssi<\/span>(valor,ecuacion_rssi, desplazar = 0):\r\n    <span style=\"color: #008000\">''' evalua ecuacion de distancia(rssi)\r\n        revisando los intervalos disponibles\r\n    '''<\/span>\r\n    <span style=\"color: #ff0000\"># resultados<\/span>\r\n    distancia = np.nan\r\n    e_mean = np.nan\r\n    e_1std = np.nan\r\n    e_2std = np.nan\r\n    \r\n    <span style=\"color: #ff0000\"># Revisa intervalos en ecuacion<\/span>\r\n    interv_fuera = 0\r\n    tamano = <span style=\"color: #ff00ff\">len<\/span>(ecuacion_rssi)\r\n    eq_cual = <span style=\"color: #ff00ff\">list<\/span>(ecuacion_rssi.keys())\r\n\r\n    <span style=\"color: #ff0000\"># revisa si hay ecuaciones<\/span>\r\n    <span style=\"color: #d35400\">if<\/span> tamano &gt;= 1:\r\n        <span style=\"color: #ff0000\"># en intervalo de todos los puntos?<\/span>\r\n        i_eq = <span style=\"color: #008000\">'r0'<\/span>\r\n        a = ecuacion_rssi[i_eq][<span style=\"color: #008000\">'intervaloy'<\/span>][0]\r\n        b = ecuacion_rssi[i_eq][<span style=\"color: #008000\">'intervaloy'<\/span>][1]\r\n        desplaza = 0; valor0 = valor\r\n        <span style=\"color: #d35400\">if<\/span> <span style=\"color: #008000\">'desplaza'<\/span> <span style=\"color: #d35400\">in<\/span> <span style=\"color: #ff00ff\">list<\/span>(ecuacion_rssi[i_eq].keys()):\r\n            desplaza = ecuacion_rssi[i_eq][<span style=\"color: #008000\">'desplaza'<\/span>]\r\n        <span style=\"color: #d35400\">if<\/span> desplazar == 1:\r\n            valor0 = valor - desplaza\r\n        <span style=\"color: #d35400\">if<\/span> valor0&lt;a:\r\n            interv_fuera = -1 <span style=\"color: #ff0000\"># izquierda<\/span>\r\n        <span style=\"color: #d35400\">if<\/span> valor0&gt;=b:\r\n            interv_fuera = 1  <span style=\"color: #ff0000\"># derecha<\/span>\r\n    <span style=\"color: #d35400\">if<\/span> interv_fuera!=0:\r\n        <span style=\"color: #d35400\">if<\/span> interv_fuera == 1: <span style=\"color: #ff0000\"># derecha<\/span>\r\n            i_eq = eq_cual[1]\r\n        <span style=\"color: #d35400\">if<\/span> interv_fuera == -1: <span style=\"color: #ff0000\"># izquierda<\/span>\r\n            i_eq = eq_cual[-1]\r\n        <span style=\"color: #ff0000\"># intervalo rssi [a,b)<\/span>\r\n        a = ecuacion_rssi[i_eq][<span style=\"color: #008000\">'intervaloy'<\/span>][0]\r\n        b = ecuacion_rssi[i_eq][<span style=\"color: #008000\">'intervaloy'<\/span>][1]\r\n        alpha = ecuacion_rssi[i_eq][<span style=\"color: #008000\">'alpha'<\/span>]\r\n        beta = ecuacion_rssi[i_eq][<span style=\"color: #008000\">'beta'<\/span>]\r\n        <span style=\"color: #ff0000\"># correccion de formula por desplazamiento<\/span>\r\n        desplaza = 0; valor1 = valor\r\n        <span style=\"color: #d35400\">if<\/span> <span style=\"color: #008000\">'desplaza'<\/span> <span style=\"color: #d35400\">in<\/span> <span style=\"color: #ff00ff\">list<\/span>(ecuacion_rssi[i_eq].keys()):\r\n            desplaza = ecuacion_rssi[i_eq][<span style=\"color: #008000\">'desplaza'<\/span>]\r\n        <span style=\"color: #d35400\">if<\/span> desplazar == 1:\r\n            valor1 = valor - desplaza\r\n        distancia = 10**((valor1-beta)\/(-10*alpha))\r\n        \r\n        <span style=\"color: #ff0000\"># errores estimados de distancia<\/span>\r\n        error_medio = ecuacion_rssi[i_eq][<span style=\"color: #008000\">'error_medio'<\/span>]\r\n        error_std  = ecuacion_rssi[i_eq][<span style=\"color: #008000\">'error_std'<\/span>]\r\n        dist_mean = 10**((valor-error_medio-beta)\/(-10*alpha))\r\n        dist_1std = 10**((valor-error_std-beta)\/(-10*alpha))\r\n        dist_2std = 10**((valor-2*error_std-beta)\/(-10*alpha))\r\n        e_mean = np.abs(distancia-dist_mean)\r\n        e_1std = np.abs(distancia-dist_1std)\r\n        e_2std = np.abs(distancia-dist_2std)\r\n\r\n    <span style=\"color: #ff0000\"># evalua valor si hay ecuacion<\/span>\r\n    <span style=\"color: #d35400\">if<\/span> tamano&gt;1 <span style=\"color: #d35400\">and<\/span> interv_fuera == 0:\r\n        donde = eq_cual.index(<span style=\"color: #008000\">'r0'<\/span>)\r\n        eq_cual.pop(donde)\r\n        <span style=\"color: #ff0000\"># Revisa que exista ecuacion en cada intervalo<\/span>\r\n        <span style=\"color: #d35400\">for<\/span> i_eq <span style=\"color: #d35400\">in<\/span> eq_cual:\r\n            <span style=\"color: #d35400\">if<\/span> ecuacion_rssi[i_eq] <span style=\"color: #d35400\">is<\/span> <span style=\"color: #d35400\">None<\/span>:\r\n                donde = eq_cual.index(i_eq)\r\n                eq_cual.pop(donde)\r\n                \r\n        <span style=\"color: #ff0000\"># revisa intervalo y evalua<\/span>\r\n        <span style=\"color: #d35400\">for<\/span> i_eq <span style=\"color: #d35400\">in<\/span> eq_cual:\r\n            <span style=\"color: #ff0000\"># correccion de formula por desplazamiento<\/span>\r\n            desplaza = 0; valor1 = valor\r\n            <span style=\"color: #d35400\">if<\/span> <span style=\"color: #008000\">'desplaza'<\/span> <span style=\"color: #d35400\">in<\/span> <span style=\"color: #ff00ff\">list<\/span>(ecuacion_rssi[i_eq].keys()):\r\n                desplaza = ecuacion_rssi[i_eq][<span style=\"color: #008000\">'desplaza'<\/span>]\r\n            <span style=\"color: #d35400\">if<\/span> desplazar == 1:\r\n                valor1 = valor - desplaza\r\n            <span style=\"color: #ff0000\"># intervalo rssi [a,b)<\/span>\r\n            a = ecuacion_rssi[i_eq][<span style=\"color: #008000\">'intervaloy'<\/span>][0]\r\n            b = ecuacion_rssi[i_eq][<span style=\"color: #008000\">'intervaloy'<\/span>][1]\r\n            \r\n            cond1 = (valor1&gt;=a) <span style=\"color: #d35400\">and<\/span> (valor1&lt;b)\r\n            \r\n            <span style=\"color: #d35400\">if<\/span> cond1:\r\n                alpha = ecuacion_rssi[i_eq][<span style=\"color: #008000\">'alpha'<\/span>]\r\n                beta = ecuacion_rssi[i_eq][<span style=\"color: #008000\">'beta'<\/span>]\r\n                distancia = 10**((valor1-beta)\/(-10*alpha))\r\n                \r\n                <span style=\"color: #ff0000\"># errores estimados de distancia<\/span>\r\n                error_medio = ecuacion_rssi[i_eq][<span style=\"color: #008000\">'error_medio'<\/span>]\r\n                error_std  = ecuacion_rssi[i_eq][<span style=\"color: #008000\">'error_std'<\/span>]\r\n                dist_mean = 10**((valor-error_medio-beta)\/(-10*alpha))\r\n                dist_1std = 10**((valor-error_std-beta)\/(-10*alpha))\r\n                dist_2std = 10**((valor-2*error_std-beta)\/(-10*alpha))\r\n                e_mean = np.abs(distancia-dist_mean)\r\n                e_1std = np.abs(distancia-dist_1std)\r\n                e_2std = np.abs(distancia-dist_2std)\r\n    \r\n    <span style=\"color: #d35400\">return<\/span>([distancia,e_mean,e_1std,e_2std,interv_fuera])\r\n\r\n<span style=\"color: #ff0000\"># Las siguientes funciones tienen como objetivo<\/span>\r\n<span style=\"color: #ff0000\"># realizar la trilateraci\u00f3n entre varios circulos<\/span>\r\n<span style=\"color: #ff0000\"># def trilatera(radio,centro,tolera=1e-10)<\/span>\r\n<span style=\"color: #ff0000\"># requieren las funiones:<\/span>\r\n<span style=\"color: #ff0000\"># def cruce2circulos(x1,y1,r1,x2,y2,r2)<\/span>\r\n<span style=\"color: #ff0000\"># def raices2circulos(x1,y1,r1,x2,y2,r2,tolera=1e-10)<\/span>\r\n<span style=\"color: #ff0000\"># def intersectacirculos(radio,centro,tolera=1e-10)<\/span>\r\n\r\n<span style=\"color: #d35400\">def<\/span> <span style=\"color: #0000e6\">cruce2circulos<\/span>(x1,y1,r1,x2,y2,r2):\r\n    <span style=\"color: #008000\">''' Revisa intervalo de area de cruce\r\n        entre dos c\u00edrculos de centro y radio\r\n        x1,y1,r1 \/\/ x2,y2,r2\r\n    '''<\/span>\r\n    uncruce = []\r\n    dx = x2 - x1\r\n    dy = y2 - y1\r\n    d_centros = np.sqrt(dx**2 + dy**2)\r\n    d_cruce   = r2 + r1\r\n    \r\n    <span style=\"color: #ff0000\"># los circulos se cruzan o tocan<\/span>\r\n    <span style=\"color: #d35400\">if<\/span> d_cruce &gt;= d_centros:\r\n\r\n        <span style=\"color: #ff0000\"># intervalos de cruce<\/span>\r\n        xa = np.max([x1-r1,x2-r2])\r\n        xb = np.min([x1+r1,x2+r2])\r\n        ya = np.max([y1-r1,y2-r2])\r\n        yb = np.min([y1+r1,y2+r2])\r\n        \r\n        <span style=\"color: #ff0000\"># cada circulo arriba, abajo<\/span>\r\n        abajo1 = 0 ; arriba1 = 0\r\n        abajo2 = 0 ; arriba2 = 0\r\n        <span style=\"color: #d35400\">if<\/span> ya&lt;=y1:\r\n            abajo1  = 1\r\n        <span style=\"color: #d35400\">if<\/span> yb&gt;=y1:\r\n            arriba1 = 1\r\n        <span style=\"color: #d35400\">if<\/span> ya&lt;=y2:\r\n            abajo2  = 1\r\n        <span style=\"color: #d35400\">if<\/span> yb&gt;=y2:\r\n            arriba2 = 1\r\n        sector  = [ abajo1*abajo2, abajo1*arriba2,\r\n                   arriba1*abajo2, arriba1*arriba2]\r\n        uncruce = [xa,xb,ya,yb,sector]\r\n    <span style=\"color: #d35400\">return<\/span>(uncruce)\r\n\r\n<span style=\"color: #d35400\">def<\/span> <span style=\"color: #0000e6\">raices2circulos<\/span>(x1,y1,r1,x2,y2,r2,tolera=1e-10):\r\n    <span style=\"color: #008000\">''' busca las intersecci\u00f3n entre 2 circulos\r\n        de centro y radio: x1,y1,r1 || x2,y2,r2\r\n        revisa con cruce2circulos()\r\n    '''<\/span>\r\n    casicero = tolera*np.min([r1,r2])\r\n    uncruce = cruce2circulos(x1,y1,r1,x2,y2,r2)\r\n    raizx = []; raizy = []\r\n    secruzan =  0\r\n    \r\n    <span style=\"color: #ff0000\"># si hay cruce de circulos<\/span>\r\n    <span style=\"color: #d35400\">if<\/span> <span style=\"color: #ff00ff\">len<\/span>(uncruce)&gt;0:\r\n        sectores = [[-1,-1],[-1,1], \r\n                    [ 1,-1],[ 1,1]]\r\n        [xa,xb,ya,yb,sector] = uncruce\r\n        xc = (xa+xb)\/2\r\n        dx = xb-xa\r\n        dy = yb-ya\r\n        k = <span style=\"color: #ff00ff\">len<\/span>(sector)\r\n        <span style=\"color: #d35400\">if<\/span> dx&lt;casicero: <span style=\"color: #ff0000\"># se tocan en un punto<\/span>\r\n            k = 1\r\n        <span style=\"color: #d35400\">for<\/span> j <span style=\"color: #d35400\">in<\/span> <span style=\"color: #ff00ff\">range<\/span>(0,k,1):\r\n            <span style=\"color: #d35400\">if<\/span> sector[j]==1:\r\n                s1 = sectores[j][0]\r\n                s2 = sectores[j][1]\r\n                <span style=\"color: #d35400\">def<\/span> <span style=\"color: #0000e6\">gx<\/span>(x,x1,r1,casicero):\r\n                    z = r1**2-(x-x1)**2\r\n                    <span style=\"color: #d35400\">if<\/span> np.abs(z)&lt;casicero:\r\n                        z = 0\r\n                    <span style=\"color: #d35400\">return<\/span>(z)\r\n                fx1 = <span style=\"color: #d35400\">lambda<\/span> x: s1*np.sqrt(gx(x,x1,r1,casicero)) + y1\r\n                fx2 = <span style=\"color: #d35400\">lambda<\/span> x: s2*np.sqrt(gx(x,x2,r2,casicero)) + y2\r\n                fx  = <span style=\"color: #d35400\">lambda<\/span> x: fx1(x)-fx2(x)\r\n                \r\n                fa = fx(xa)\r\n                fb = fx(xb)\r\n                raiz1 = np.nan\r\n                raiz2 = np.nan\r\n                \r\n                <span style=\"color: #ff0000\"># intervalo\/2 izquierda<\/span>\r\n                xc = xc + dx*tolera\r\n                fc = fx(xc)\r\n                cambio = np.sign(fa)*np.sign(fc)\r\n                <span style=\"color: #d35400\">if<\/span> cambio&lt;0:\r\n                    raiz1 = sp.bisect(fx,xa,xc,xtol=tolera)\r\n                    \r\n                <span style=\"color: #ff0000\"># intervalo\/2 derecha<\/span>\r\n                xc = xc - 2*dx*tolera\r\n                fc = fx(xc)\r\n                cambio = np.sign(fc)*np.sign(fb)\r\n                <span style=\"color: #d35400\">if<\/span> cambio&lt;0:\r\n                    raiz2 = sp.bisect(fx,xc,xb,xtol=tolera)\r\n                    \r\n                <span style=\"color: #ff0000\"># si hay contacto en un borde<\/span>\r\n                <span style=\"color: #d35400\">if<\/span> dx&lt;casicero <span style=\"color: #d35400\">and<\/span> dy&gt;0:\r\n                    raiz1 = xa\r\n                <span style=\"color: #d35400\">if<\/span> dy&lt;casicero <span style=\"color: #d35400\">and<\/span> dx&gt;0:\r\n                    raiz1 = x1\r\n                    \r\n                <span style=\"color: #ff0000\"># A\u00f1ade si existe raiz<\/span>\r\n                <span style=\"color: #d35400\">if<\/span> <span style=\"color: #d35400\">not<\/span>(np.isnan(raiz1)):\r\n                    raizx.append(raiz1)\r\n                    raizy.append(fx1(raiz1))\r\n                <span style=\"color: #d35400\">if<\/span> <span style=\"color: #d35400\">not<\/span>(np.isnan(raiz2)):\r\n                    raizx.append(raiz2)\r\n                    raizy.append(fx1(raiz2))\r\n                secruzan = 1\r\n    <span style=\"color: #ff0000\"># No hay cruce de circulos<\/span>\r\n    <span style=\"color: #d35400\">if<\/span> <span style=\"color: #ff00ff\">len<\/span>(uncruce) == 0:\r\n        dx = x2 - x1\r\n        dy = y2 - y1\r\n        m = dy\/dx\r\n        theta = np.arctan2(dy,dx)\r\n        dx1 = r1* np.cos(theta)\r\n        dx2 = r2* np.cos(theta)\r\n        xi1 = x1 + dx1\r\n        xi2 = x2 - dx2\r\n        b = y1 - m*x1\r\n        raizx = [(xi1+xi2)\/2]\r\n        raizy = [m*raizx[0]+b]\r\n        \r\n    raices = [raizx,raizy,secruzan]\r\n    <span style=\"color: #d35400\">return<\/span>(raices)\r\n\r\n<span style=\"color: #d35400\">def<\/span> <span style=\"color: #0000e6\">intersectacirculos<\/span>(radio,centro,tolera=1e-10):\r\n    <span style=\"color: #008000\">''' busca las intersecciones entre parejas de varios\r\n        c\u00edrculos y las entrega como [raicesx,raicesy]\r\n        usa las funciones cruce2circulos()\r\n        y con raices2circulos() que se encuentran en el enlace:\r\n    <blockquote class=\"wp-embedded-content\" data-secret=\"xCbRzyjO8Q\"><a href=\"https:\/\/blog.espol.edu.ec\/analisisnumerico\/s3eva_it2018_t1-interseccion-de-dos-circulos\/\">s3Eva_IT2018_T1 Intersecci\u00f3n de dos c\u00edrculos<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; visibility: hidden;\" title=\"\u00abs3Eva_IT2018_T1 Intersecci\u00f3n de dos c\u00edrculos\u00bb \u2014 M\u00e9todos num\u00e9ricos\" src=\"https:\/\/blog.espol.edu.ec\/analisisnumerico\/s3eva_it2018_t1-interseccion-de-dos-circulos\/embed\/#?secret=Hl3dtCjXFi#?secret=xCbRzyjO8Q\" data-secret=\"xCbRzyjO8Q\" width=\"525\" height=\"296\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\r\n    '''<\/span>\r\n    vertices = <span style=\"color: #ff00ff\">list<\/span>(centro.keys())\r\n    n = <span style=\"color: #ff00ff\">len<\/span> (vertices)\r\n    \r\n    <span style=\"color: #ff0000\"># agrupa raices en todasx y todasy<\/span>\r\n    todasx  = [] ; todasy  = []\r\n    cruces = np.zeros(shape=(n,n),dtype=<span style=\"color: #ff00ff\">int<\/span>)\r\n    <span style=\"color: #d35400\">for<\/span> i <span style=\"color: #d35400\">in<\/span> <span style=\"color: #ff00ff\">range<\/span>(0,n-1,1):\r\n        <span style=\"color: #d35400\">for<\/span> j <span style=\"color: #d35400\">in<\/span> <span style=\"color: #ff00ff\">range<\/span>(i+1,n,1):\r\n            x1 = centro[vertices[i]][0]\r\n            y1 = centro[vertices[i]][1]\r\n            r1 = radio[vertices[i]]\r\n            x2 = centro[vertices[j]][0]\r\n            y2 = centro[vertices[j]][1]\r\n            r2 = radio[vertices[j]]\r\n\r\n            <span style=\"color: #ff0000\"># busca raices entre 2 circulos<\/span>\r\n            raices = raices2circulos(x1,y1,r1,x2,y2,r2,tolera)\r\n            raizx = raices[0]\r\n            raizy = raices[1]\r\n            cruces[i,j] = raices[2]\r\n            cruces[j,i] = raices[2]\r\n            m = <span style=\"color: #ff00ff\">len<\/span>(raizx)\r\n            <span style=\"color: #d35400\">if<\/span> m&gt;0:\r\n                <span style=\"color: #d35400\">for<\/span> k <span style=\"color: #d35400\">in<\/span> <span style=\"color: #ff00ff\">range<\/span>(0,m,1):\r\n                    todasx.append(raizx[k])\r\n                    todasy.append(raizy[k])\r\n                \r\n    raiztodas = [todasx,todasy,cruces]\r\n    <span style=\"color: #d35400\">return<\/span>(raiztodas)\r\n\r\n<span style=\"color: #d35400\">def<\/span> <span style=\"color: #0000e6\">trilatera<\/span>(radio,centro,tolera=1e-10):\r\n    <span style=\"color: #008000\">''' busca el baricentro entre las intersecciones\r\n        de varios c\u00edrculos punto central en el \u00e1rea de\r\n        intersecci\u00f3n entre varios circulos.\r\n        requiere el resultado de la funci\u00f3n:\r\n        raiztodas = intersectacirculos(centro,radio, tolera = 1e-10)\r\n    '''<\/span>\r\n    vertices = <span style=\"color: #ff00ff\">list<\/span>(centro.keys())\r\n    n = <span style=\"color: #ff00ff\">len<\/span> (vertices)\r\n    <span style=\"color: #ff0000\"># revisa raiz dentro de cada circulo<\/span>\r\n    raiztodas = intersectacirculos(radio,centro,tolera)\r\n    todasx = raiztodas[0]\r\n    todasy = raiztodas[1]\r\n    cruces = raiztodas[2]\r\n    m = <span style=\"color: #ff00ff\">len<\/span>(todasx)\r\n    raicesx = []\r\n    raicesy = []\r\n    fuera = []\r\n    <span style=\"color: #d35400\">for<\/span> k <span style=\"color: #d35400\">in<\/span> <span style=\"color: #ff00ff\">range<\/span>(0,m,1):\r\n        xk = todasx[k]\r\n        yk = todasy[k]\r\n        dentro = 0\r\n        <span style=\"color: #d35400\">for<\/span> i <span style=\"color: #d35400\">in<\/span> <span style=\"color: #ff00ff\">range<\/span>(0,n,1):\r\n            x1 = centro[vertices[i]][0]\r\n            y1 = centro[vertices[i]][1]\r\n            r1 = radio[vertices[i]]\r\n            dx = x1-xk\r\n            dy = y1-yk\r\n            d_centro = np.sqrt(dx**2+dy**2)\r\n            <span style=\"color: #d35400\">if<\/span> d_centro&lt;=(r1*(1+tolera)):\r\n                dentro = dentro + 1\r\n        <span style=\"color: #d35400\">if<\/span> dentro == n:\r\n            raicesx.append(xk)\r\n            raicesy.append(yk)\r\n            \r\n    <span style=\"color: #ff0000\"># busca baricentro<\/span>\r\n    baricentro = np.nan\r\n    barerror = np.nan\r\n    q = <span style=\"color: #ff00ff\">len<\/span>(raicesx)\r\n    <span style=\"color: #d35400\">if<\/span> q&gt;0:\r\n        xbar = np.mean(raicesx)\r\n        ybar = np.mean(raicesy)\r\n        baricentro = [xbar,ybar]\r\n        barerror = 0\r\n        <span style=\"color: #d35400\">for<\/span> i <span style=\"color: #d35400\">in<\/span> <span style=\"color: #ff00ff\">range<\/span>(0,q,1):\r\n            d = np.sqrt((xbar-raicesx[i])**2+(ybar-raicesy[i])**2)\r\n            <span style=\"color: #d35400\">if<\/span> d&gt;barerror:\r\n                barerror = d\r\n        poligono = [raicesx,raicesy]\r\n    <span style=\"color: #d35400\">else<\/span>:\r\n        poligono = [todasx,todasy]\r\n    resultado = {<span style=\"color: #008000\">'baricentro'<\/span>: baricentro,\r\n                 <span style=\"color: #008000\">'barerror'<\/span>  : barerror,\r\n                 <span style=\"color: #008000\">'poligono'<\/span>  : poligono,\r\n                 <span style=\"color: #008000\">'nocruzaen'<\/span> : <span style=\"color: #008000\">''<\/span>}\r\n\r\n    \r\n    <span style=\"color: #ff0000\"># revisa espacio entre circulos<\/span>\r\n    sumacruces = np.sum(cruces,axis = 0)\r\n    <span style=\"color: #d35400\">if<\/span> 0 <span style=\"color: #d35400\">in<\/span> <span style=\"color: #ff00ff\">list<\/span>(sumacruces):\r\n        raicesx = todasx.copy()\r\n        raicesy = todasy.copy()\r\n        <span style=\"color: #d35400\">for<\/span> i <span style=\"color: #d35400\">in<\/span> <span style=\"color: #ff00ff\">range<\/span>(0,n,1):\r\n            <span style=\"color: #d35400\">if<\/span> sumacruces[i]==0:\r\n                x1 = centro[vertices[i]][0]\r\n                y1 = centro[vertices[i]][1]\r\n                lejanamax = -1\r\n                lejana_en = -1\r\n                <span style=\"color: #d35400\">for<\/span> k <span style=\"color: #d35400\">in<\/span> <span style=\"color: #ff00ff\">range<\/span>(0,<span style=\"color: #ff00ff\">len<\/span>(raicesx),1):\r\n                    dx = x1 - raicesx[k]\r\n                    dy = y1 - raicesy[k]\r\n                    d_centro = np.sqrt(dx**2+dy**2)\r\n                    <span style=\"color: #d35400\">if<\/span> d_centro&gt;lejanamax:\r\n                        lejanamax = d_centro\r\n                        lejana_en = k\r\n                <span style=\"color: #d35400\">if<\/span> lejana_en&gt;=0:\r\n                    raicesx.pop(lejana_en)\r\n                    raicesy.pop(lejana_en)\r\n        <span style=\"color: #ff0000\"># busca baricentro<\/span>\r\n        baricentro = np.nan\r\n        barerror = np.nan\r\n        q = <span style=\"color: #ff00ff\">len<\/span>(raicesx)\r\n        <span style=\"color: #d35400\">if<\/span> q&gt;0:\r\n            xbar = np.mean(raicesx)\r\n            ybar = np.mean(raicesy)\r\n            baricentro = [xbar,ybar]\r\n            barerror = 0\r\n            <span style=\"color: #d35400\">for<\/span> i <span style=\"color: #d35400\">in<\/span> <span style=\"color: #ff00ff\">range<\/span>(0,q,1):\r\n                d = np.sqrt((xbar-raicesx[i])**2+(ybar-raicesy[i])**2)\r\n                <span style=\"color: #d35400\">if<\/span> d&gt;barerror:\r\n                    barerror = d\r\n            poligono = [raicesx,raicesy]\r\n        <span style=\"color: #d35400\">else<\/span>:\r\n            poligono = [todasx,todasy]\r\n        resultado = {<span style=\"color: #008000\">'baricentro'<\/span>: baricentro,\r\n                     <span style=\"color: #008000\">'barerror'<\/span>  : barerror,\r\n                     <span style=\"color: #008000\">'poligono'<\/span>  : poligono,\r\n                     <span style=\"color: #008000\">'nocruzaen'<\/span> : vertices[i] }\r\n\r\n\r\n    <span style=\"color: #d35400\">return<\/span>(resultado)\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>El archivo contiene un grupo de\u00a0 funciones usadas para procesar los datos de este prototipo, se separaron del bloque principal de instrucciones con\u00a0 el objetivo de simplificar el desarrollo del las actividades principales. Recuerde disponer de este archivo en la misma carpeta que el algoritmo que invoca a la librer\u00eda. archivo de libreria: girni_lora_libreria datos &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/blog.espol.edu.ec\/girni\/funciones-girni_lora_libreria\/\" class=\"more-link\">Continuar leyendo<span class=\"screen-reader-text\"> \"3.2 Funciones girni_lora_libreria\"<\/span><\/a><\/p>\n","protected":false},"author":8043,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1463489],"tags":[20777],"class_list":["post-2719","post","type-post","status-publish","format-standard","hentry","category-localizacion-rssi-lora","tag-python"],"_links":{"self":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/2719","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/users\/8043"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/comments?post=2719"}],"version-history":[{"count":24,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/2719\/revisions"}],"predecessor-version":[{"id":3897,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/2719\/revisions\/3897"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/media?parent=2719"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/categories?post=2719"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/tags?post=2719"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}