{"id":2979,"date":"2021-01-08T14:35:08","date_gmt":"2021-01-08T19:35:08","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/girni\/?p=2979"},"modified":"2021-03-11T17:51:17","modified_gmt":"2021-03-11T22:51:17","slug":"linealizacion-por-intervalos-algoritmo-python","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/girni\/linealizacion-por-intervalos-algoritmo-python\/","title":{"rendered":"4.4 Rssi vs Distancia. Linealiza POR intervalos - Algoritmo Python"},"content":{"rendered":"<p>El algoritmo para realizar dos o m\u00e1s intervalos considera usar un estimado de frontera a lo largo de las mediciones.<\/p>\n<p><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/01\/gtwFIEC_DivideDosIntervalos01.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-3158 size-full\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/01\/gtwFIEC_DivideDosIntervalos01.png\" alt=\"\" width=\"790\" height=\"434\" srcset=\"https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/01\/gtwFIEC_DivideDosIntervalos01.png 790w, https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/01\/gtwFIEC_DivideDosIntervalos01-300x165.png 300w, https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/01\/gtwFIEC_DivideDosIntervalos01-768x422.png 768w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><\/p>\n<p>Se implementa a\u00f1adiendo al bloque de ingreso dos par\u00e1metros en el bloque 'analiza':<\/p>\n<p>1. frontera es un vector donde se indican las distancia de los puntos de corte de los subintervalos sin considerar los extremos, corresponden a la frontera estimada en el mapa. El algoritmo actualiza la frontera con la intersecci\u00f3n\u00a0 de la linealizaci\u00f3n de dos subintervalos consecutivos. Si frontera es un vector vac\u00edo <code>[]<\/code> se asume que se trabaja con todo el intervalo.<\/p>\n<p>2. 'atipInterv_std' es un vector para la discriminaci\u00f3n de los valores atipicos aplicada en cada subintervalo.<\/p>\n<p>Como referencia para comparar, el resultado del an\u00e1lisis de <em><strong>todo el intervalo<\/strong><\/em> se denomina 'r0'. Los <em><strong>subintervalos<\/strong> <\/em>se identifican por 'r1','r2', etc, en orden al alejarse de la baliza.<\/p>\n<p>En el resultado como valor complementario de revisi\u00f3n se a\u00f1ade el coeficiente de correlaci\u00f3n de los puntos usados en el an\u00e1lisis.<\/p>\n<h2>Algoritmo en Python<\/h2>\n<pre><span style=\"color: #ff0000\"># LoRa-Multipunto, Rssi vs distancia<\/span>\r\n<span style=\"color: #ff0000\"># linealizaci\u00f3n Rssi vs log10(distancia)<\/span>\r\n<span style=\"color: #ff0000\"># por m\u00ednimos cuadrados<\/span>\r\n<span style=\"color: #ff0000\"># Graficas 2D y 3D<\/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> json\r\n<span style=\"color: #d35400\">import<\/span> matplotlib.pyplot <span style=\"color: #d35400\">as<\/span> plt\r\n<span style=\"color: #d35400\">import<\/span> girni_lora_libreria <span style=\"color: #d35400\">as<\/span> girni\r\n\r\n<span style=\"color: #ff0000\"># INGRESO<\/span>\r\n<span style=\"color: #ff0000\"># archivos de entrada<\/span>\r\nmodo       = <span style=\"color: #008000\">'rx'<\/span>\r\nmedida     = <span style=\"color: #008000\">'rssi'<\/span>\r\ndescriptor = <span style=\"color: #008000\">'mean'<\/span>\r\narch_medidaubica = <span style=\"color: #008000\">'rsmP06_'<\/span>+medida+<span style=\"color: #008000\">'Ubica01Intervalo.txt'<\/span>\r\n\r\n<span style=\"color: #ff0000\"># archivos de salida<\/span>\r\narch_ecuaciones  = <span style=\"color: #008000\">'rsmP07_ecuacion01Intervalos.json'<\/span>\r\n\r\n<span style=\"color: #ff0000\"># Analizar por segmentos<\/span>\r\nanaliza = {<span style=\"color: #008000\">'gtwRECT'<\/span>:{<span style=\"color: #008000\">'analizar'<\/span>  : 1,\r\n                      <span style=\"color: #008000\">'atipico_std'<\/span> : 1,\r\n                      <span style=\"color: #008000\">'frontera'<\/span>    : [320],\r\n                      <span style=\"color: #008000\">'atipInterv_std'<\/span>: [1,1],\r\n                      <span style=\"color: #008000\">'p_amplia'<\/span>: 4,\r\n                      <span style=\"color: #008000\">'grp'<\/span> : [<span style=\"color: #008000\">'RECT'<\/span>,<span style=\"color: #008000\">'FIEC'<\/span>],\r\n                      <span style=\"color: #008000\">'tip'<\/span> : [<span style=\"color: #008000\">'punto'<\/span>],\r\n                      <span style=\"color: #008000\">'LOS'<\/span> : [1]},\r\n           <span style=\"color: #008000\">'gtwFIEC'<\/span>:{<span style=\"color: #008000\">'analizar'<\/span>  : 1,\r\n                      <span style=\"color: #008000\">'atipico_std'<\/span> : 1,\r\n                      <span style=\"color: #008000\">'frontera'<\/span>    : [190], \r\n                      <span style=\"color: #008000\">'atipInterv_std'<\/span>: [1,1],\r\n                      <span style=\"color: #008000\">'p_amplia'<\/span>: 4,\r\n                      <span style=\"color: #008000\">'grp'<\/span> : [<span style=\"color: #008000\">'FIEC'<\/span>,<span style=\"color: #008000\">'FCNM'<\/span>],\r\n                      <span style=\"color: #008000\">'tip'<\/span> : [<span style=\"color: #008000\">'punto'<\/span>],\r\n                      <span style=\"color: #008000\">'LOS'<\/span> : [1,0]},\r\n           <span style=\"color: #008000\">'gtwFCNM'<\/span>:{<span style=\"color: #008000\">'analizar'<\/span>   : 1,\r\n                      <span style=\"color: #008000\">'atipico_std'<\/span> : 1,\r\n                      <span style=\"color: #008000\">'frontera'<\/span>   : [235.0],\r\n                      <span style=\"color: #008000\">'atipInterv_std'<\/span>: [2,2],\r\n                      <span style=\"color: #008000\">'p_amplia'<\/span>: 4,\r\n                      <span style=\"color: #008000\">'grp'<\/span> : [<span style=\"color: #008000\">'FIEC'<\/span>,<span style=\"color: #008000\">'FCNM'<\/span>],\r\n                      <span style=\"color: #008000\">'tip'<\/span> : [<span style=\"color: #008000\">'punto'<\/span>],\r\n                      <span style=\"color: #008000\">'LOS'<\/span> : [1,0]}\r\n           }\r\n\r\nbaliza = {<span style=\"color: #008000\">'d1'<\/span>:<span style=\"color: #008000\">'gtwRECT'<\/span>,\r\n          <span style=\"color: #008000\">'d2'<\/span>:<span style=\"color: #008000\">'gtwFIEC'<\/span>,\r\n          <span style=\"color: #008000\">'d3'<\/span>:<span style=\"color: #008000\">'gtwFCNM'<\/span>}\r\n\r\n<span style=\"color: #ff0000\"># Par\u00e1metros de grafica<\/span>\r\ntipograf      = <span style=\"color: #008000\">'2D'<\/span>  <span style=\"color: #ff0000\"># '2D','3D'<\/span>\r\nescala        = <span style=\"color: #008000\">'log'<\/span> <span style=\"color: #ff0000\"># 'normal','log'<\/span>\r\nescalabase    = 10    <span style=\"color: #ff0000\"># 10, np.exp()<\/span>\r\ncasicero   = 1e-4\r\nprecision  = 3\r\nintersectar = 1 <span style=\"color: #ff0000\"># 0:Falso, 1: Verdadero<\/span>\r\n\r\n<span style=\"color: #ff0000\"># Referencias de gr\u00e1fica<\/span>\r\ngrupo   = [<span style=\"color: #008000\">'FIEC'<\/span> ,<span style=\"color: #008000\">'FCNM'<\/span>  ,<span style=\"color: #008000\">'RECT'<\/span>,<span style=\"color: #008000\">'CIRC'<\/span>]\r\ncolores = [<span style=\"color: #008000\">'green'<\/span>,<span style=\"color: #008000\">'orange'<\/span>,<span style=\"color: #008000\">'grey'<\/span>,<span style=\"color: #008000\">'magenta'<\/span>]\r\ntipo    = [<span style=\"color: #008000\">'punto'<\/span>,<span style=\"color: #008000\">'1m'<\/span> ,<span style=\"color: #008000\">'gtw'<\/span>,<span style=\"color: #008000\">'dispositivo'<\/span>]\r\nmarcas  = [    <span style=\"color: #008000\">'o'<\/span>,<span style=\"color: #008000\">'D'<\/span>  ,<span style=\"color: #008000\">'D'<\/span>  ,<span style=\"color: #008000\">'*'<\/span> ]\r\n\r\nmostrargrpeti = [<span style=\"color: #008000\">'FIEC'<\/span>,<span style=\"color: #008000\">'FCNM'<\/span>,<span style=\"color: #008000\">'RECT'<\/span>]\r\nmostrartipeti = [<span style=\"color: #008000\">'1m'<\/span>,<span style=\"color: #008000\">'gtw'<\/span>]\r\n\r\n<span style=\"color: #ff0000\"># PROCEDIMIENTO<\/span>\r\n<span style=\"color: #ff0000\"># Resultados de an\u00e1lisis<\/span>\r\necuacion = {}\r\neq_graf  = {}\r\n\r\n<span style=\"color: #ff0000\"># leer datos<\/span>\r\ntabla = pd.read_csv(arch_medidaubica, index_col=<span style=\"color: #008000\">'etiqueta'<\/span>)\r\ntabla = pd.DataFrame(tabla)\r\n\r\n<span style=\"color: #ff0000\"># analiza datos hacia una baliza<\/span>\r\n<span style=\"color: #d35400\">for<\/span> unabaliza <span style=\"color: #d35400\">in<\/span> analiza:\r\n\r\n    <span style=\"color: #ff0000\"># Par\u00e1metros<\/span>\r\n    analizar = analiza[unabaliza][<span style=\"color: #008000\">'analizar'<\/span>]\r\n\r\n    <span style=\"color: #d35400\">if<\/span> analizar:\r\n        ecuacion[unabaliza] = {}\r\n        eq_graf[unabaliza]  = {}\r\n        \r\n        <span style=\"color: #ff0000\"># pares a usar de baliza<\/span>\r\n        [pares,par_etiqueta] = girni.pares_usar(tabla,baliza,\r\n                                            analiza,unabaliza,\r\n                                            medida = medida ,\r\n                                            modo = modo)\r\n        <span style=\"color: #ff0000\"># todos los puntos<\/span>\r\n        <span style=\"color: #ff0000\"># analiza puntos para m\u00ednimos cuadrados<\/span>\r\n        xi = pares[:,0]\r\n        yi = pares[:,1]\r\n        n_xi = <span style=\"color: #ff00ff\">len<\/span>(xi)\r\n        <span style=\"color: #ff0000\"># coeficiente de correlaci\u00f3n<\/span>\r\n        correlacion = np.corrcoef(xi,yi)[0,1]\r\n        \r\n        <span style=\"color: #ff0000\"># minimos cuadrados<\/span>\r\n        ecuacion0 = girni.linealiza_lstsq(xi,yi)\r\n\r\n        <span style=\"color: #ff0000\"># selecciona atipicos<\/span>\r\n        atipico_std = analiza[unabaliza][<span style=\"color: #008000\">'atipico_std'<\/span>]\r\n        alpha    = ecuacion0[<span style=\"color: #008000\">'alpha'<\/span>]\r\n        beta     = ecuacion0[<span style=\"color: #008000\">'beta'<\/span>]\r\n        fdist0   = <span style=\"color: #d35400\">lambda<\/span> d: -10*alpha*(np.log10(d))+beta\r\n        yi0      = fdist0(xi)\r\n        dyi0std  = ecuacion0[<span style=\"color: #008000\">'error_std'<\/span>]\r\n        dyi0     = yi - yi0\r\n        atipicos = np.abs(dyi0) &gt;= dyi0std*atipico_std\r\n        xi0_e   = xi[atipicos]\r\n        yi0_e   = yi[atipicos]\r\n        etiq0_e = par_etiqueta[atipicos]\r\n\r\n        unintervalo = <span style=\"color: #008000\">'r0'<\/span> <span style=\"color: #ff0000\"># todos<\/span>\r\n        <span style=\"color: #ff0000\"># para exportar hacia archivo o gr\u00e1fica<\/span>\r\n        ecuacion[unabaliza] = {unintervalo: ecuacion0}\r\n        ecuacion[unabaliza][unintervalo][<span style=\"color: #008000\">'correlacion'<\/span>] = correlacion\r\n        \r\n        eq_graf[unabaliza]  = {unintervalo: {<span style=\"color: #008000\">'xi_graf'<\/span>:xi,\r\n                                         <span style=\"color: #008000\">'yi_graf'<\/span>:yi,\r\n                                         <span style=\"color: #008000\">'etiqueta'<\/span>: par_etiqueta,\r\n                                         <span style=\"color: #008000\">'linea'<\/span> : yi0,\r\n                                         <span style=\"color: #008000\">'atipicos'<\/span>:[xi0_e,yi0_e],\r\n                                         <span style=\"color: #008000\">'atip_etiq'<\/span>: etiq0_e}\r\n                               }\r\n        \r\n        <span style=\"color: #ff0000\"># Intervalos radiales en sector<\/span>\r\n        intervalo = [np.min(xi),np.max(xi)]\r\n        frontera = analiza[unabaliza][<span style=\"color: #008000\">'frontera'<\/span>]\r\n        <span style=\"color: #d35400\">if<\/span> <span style=\"color: #ff00ff\">len<\/span>(frontera)&gt;0:\r\n            <span style=\"color: #ff0000\"># revisar si frontera esta dentro intervalo<\/span>\r\n            frontera = np.array(frontera, dtype=<span style=\"color: #ff00ff\">float<\/span>)\r\n            revisar  = (frontera&gt;=np.min(xi)) &amp; (frontera&lt;=np.max(xi))\r\n            enintervalo = <span style=\"color: #ff00ff\">list<\/span>(frontera[revisar])\r\n            intervalo.extend(enintervalo)\r\n            intervalo = np.array(intervalo)\r\n            ordenar   = np.argsort(intervalo)\r\n            intervalo = intervalo[ordenar]\r\n        n_intervalo = <span style=\"color: #ff00ff\">len<\/span>(intervalo)\r\n        \r\n        <span style=\"color: #ff0000\"># analizar cada subintervalo<\/span>\r\n        p_inicio = 0\r\n        p_desde  = 0\r\n        p_amplia = analiza[unabaliza][<span style=\"color: #008000\">'p_amplia'<\/span>]\r\n        atipIntv_std = analiza[unabaliza][<span style=\"color: #008000\">'atipInterv_std'<\/span>]\r\n        <span style=\"color: #d35400\">for<\/span> i <span style=\"color: #d35400\">in<\/span> <span style=\"color: #ff00ff\">range<\/span>(0,n_intervalo-1,1):\r\n            i_eq = <span style=\"color: #008000\">'r'<\/span>+<span style=\"color: #ff00ff\">str<\/span>(i+1)  <span style=\"color: #ff0000\"># indice en texto<\/span>\r\n\r\n            <span style=\"color: #ff0000\"># puntos en subintervalo [a,b]<\/span>\r\n            a = intervalo[i]\r\n            b = intervalo[i+1]\r\n            subintervalo = (xi &gt;= a) &amp; (xi &lt;= b)  \r\n            xi_sub = xi[subintervalo]\r\n            yi_sub = yi[subintervalo]\r\n            n_sub  = <span style=\"color: #ff00ff\">len<\/span>(xi_sub)\r\n            etiq_sub = par_etiqueta[p_inicio:p_inicio + n_sub]\r\n\r\n            <span style=\"color: #ff0000\"># amplia sub-intervalo, mejora intersecta rectas<\/span>\r\n            detras    = p_inicio\r\n            retrocede = detras\r\n            <span style=\"color: #d35400\">if<\/span> detras &gt; p_amplia:\r\n                retrocede = p_amplia\r\n            delante = n_xi - (p_inicio+n_sub)<span style=\"color: #ff0000\"># -1)<\/span>\r\n            avanza  = delante\r\n            <span style=\"color: #d35400\">if<\/span> delante &gt;= p_amplia:\r\n                avanza = p_amplia\r\n            p_desde  = p_inicio - retrocede\r\n            p_hasta  = p_inicio + (n_sub) + avanza\r\n            p_inicio = p_inicio + (n_sub-1)\r\n            \r\n            <span style=\"color: #ff0000\"># subintervalo, amplia puntos<\/span>\r\n            xi_a = xi[p_desde:p_hasta]\r\n            yi_a = yi[p_desde:p_hasta]\r\n            etiq_a = par_etiqueta[p_desde:p_hasta]\r\n            <span style=\"color: #ff0000\"># coeficiente de correlaci\u00f3n<\/span>\r\n            correlacion1 = np.corrcoef(xi_a,yi_a)[0,1]\r\n\r\n            <span style=\"color: #ff0000\"># analiza subintervalo<\/span>\r\n            ecuacion1 = girni.linealiza_lstsq(xi_a,yi_a)\r\n            ecuacion[unabaliza][i_eq] = ecuacion1\r\n            ecuacion[unabaliza][i_eq][<span style=\"color: #008000\">'correlacion'<\/span>] = correlacion1  \r\n            <span style=\"color: #ff0000\"># atipicos del subintervalo extendido<\/span>\r\n            alpha  = ecuacion1[<span style=\"color: #008000\">'alpha'<\/span>]\r\n            beta   = ecuacion1[<span style=\"color: #008000\">'beta'<\/span>]\r\n            fdist1 = <span style=\"color: #d35400\">lambda<\/span> d: -10*alpha*(np.log10(d))+beta\r\n            yi1  = fdist1(xi_a)\r\n            dyi1std = ecuacion1[<span style=\"color: #008000\">'error_std'<\/span>]\r\n            atipico_std = analiza[unabaliza][<span style=\"color: #008000\">'atipInterv_std'<\/span>][i]\r\n            dyi1 = yi_a - yi1\r\n            atipicos = np.zeros(<span style=\"color: #ff00ff\">len<\/span>(xi_a),dtype=<span style=\"color: #ff00ff\">bool<\/span>)\r\n            <span style=\"color: #d35400\">if<\/span> np.abs(dyi1std) &gt; casicero:\r\n                atipicos = np.abs(dyi1) &gt;= dyi1std*atipico_std\r\n            xi1_e = xi_a[atipicos]\r\n            yi1_e = yi_a[atipicos]\r\n            etiq1_e = etiq_a[atipicos]\r\n\r\n            <span style=\"color: #ff0000\"># para gr\u00e1fica, atipicos sin extender puntos <\/span>\r\n            atipicos_sub = (xi1_e &gt;= a) &amp; (xi1_e&lt;=b)\r\n            xi_sub1_e = xi1_e[atipicos_sub]\r\n            yi_sub1_e = yi1_e[atipicos_sub]\r\n            etiq_sub1e = etiq1_e[atipicos_sub]\r\n            eq_graf[unabaliza][i_eq] = {<span style=\"color: #008000\">'atipicos'<\/span>: [xi_sub1_e,yi_sub1_e],\r\n                                        <span style=\"color: #008000\">'atip_etiq'<\/span>:etiq_sub1e}\r\n            \r\n\r\n            <span style=\"color: #ff0000\"># subintervalo sin atipicos<\/span>\r\n            <span style=\"color: #d35400\">if<\/span> <span style=\"color: #ff00ff\">len<\/span>(xi1_e)&gt;0:\r\n                atipicoNo = np.abs(dyi1) &lt;= dyi1std*atipico_std\r\n                xi2 = xi_a[atipicoNo]\r\n                yi2 = yi_a[atipicoNo]\r\n                etiq2 = etiq_a[atipicoNo]\r\n                <span style=\"color: #ff0000\"># coeficiente de correlaci\u00f3n<\/span>\r\n                correlacion2 = np.corrcoef(xi2,yi2)[0,1]\r\n                ecuacion2 = girni.linealiza_lstsq(xi2,yi2)\r\n\r\n                <span style=\"color: #ff0000\"># actualiza ecuaci\u00f3n sin atipicos intervaloy<\/span>\r\n                intervalox = ecuacion1[<span style=\"color: #008000\">'intervalox'<\/span>]\r\n                ecuacion2[<span style=\"color: #008000\">'intervalox'<\/span>] = intervalox.copy()\r\n                alpha = ecuacion2[<span style=\"color: #008000\">'alpha'<\/span>]\r\n                beta  = ecuacion2[<span style=\"color: #008000\">'beta'<\/span>]\r\n                fdist = <span style=\"color: #d35400\">lambda<\/span> d: -10*alpha*(np.log10(d))+beta\r\n                intervaloy = fdist(intervalox)\r\n                ordenar   = np.argsort(intervaloy)\r\n                intervaloy = <span style=\"color: #ff00ff\">list<\/span>(intervaloy[ordenar])\r\n                ecuacion2[<span style=\"color: #008000\">'intervaloy'<\/span>] = intervaloy\r\n                ecuacion[unabaliza][i_eq] = ecuacion2\r\n                <span style=\"color: #ff0000\">#ecuacion[unabaliza][i_eq]['correlacion1'] = correlacion1<\/span>\r\n                ecuacion[unabaliza][i_eq][<span style=\"color: #008000\">'correlacion'<\/span>] = correlacion2\r\n            \r\n        <span style=\"color: #ff0000\"># Revisa frontera entre subintervalos,<\/span>\r\n        <span style=\"color: #ff0000\"># usa intersecci\u00f3n de rectas como nueva frontera<\/span>\r\n        interv_calc = np.copy(intervalo)\r\n        <span style=\"color: #d35400\">if<\/span> <span style=\"color: #ff00ff\">len<\/span>(intervalo) &gt;2 <span style=\"color: #d35400\">and<\/span> intersectar==1 : \r\n            <span style=\"color: #d35400\">for<\/span> i <span style=\"color: #d35400\">in<\/span> <span style=\"color: #ff00ff\">range<\/span>(0,n_intervalo-2,1):\r\n                ai = <span style=\"color: #008000\">'r'<\/span>+<span style=\"color: #ff00ff\">str<\/span>(i+1)\r\n                bi = <span style=\"color: #008000\">'r'<\/span>+<span style=\"color: #ff00ff\">str<\/span>(i+2)\r\n                ma = ecuacion[unabaliza][ai][<span style=\"color: #008000\">'alpha'<\/span>]\r\n                ba = ecuacion[unabaliza][ai][<span style=\"color: #008000\">'beta'<\/span>]\r\n                mb = ecuacion[unabaliza][bi][<span style=\"color: #008000\">'alpha'<\/span>]\r\n                bb = ecuacion[unabaliza][bi][<span style=\"color: #008000\">'beta'<\/span>]\r\n\r\n                <span style=\"color: #ff0000\"># punto de intersecci\u00f3n o cruce<\/span>\r\n                cruzanx = 10**((bb-ba)\/(10*(mb-ma)))\r\n                dfrontera = frontera-cruzanx\r\n                <span style=\"color: #ff0000\"># cruce dentro de intervalo de ecuacion<\/span>\r\n                <span style=\"color: #d35400\">if<\/span> cruzanx &gt; intervalo[-1]:\r\n                    cruzanx = intervalo[-1]\r\n                <span style=\"color: #d35400\">if<\/span> cruzanx &lt; intervalo[0]:\r\n                    cruzanx = intervalo[0]\r\n                interv_calc[i+1] = cruzanx\r\n            \r\n        <span style=\"color: #ff0000\"># para grafica evalua cada subintervalo sin atipicos<\/span>\r\n        n_interv_calc = <span style=\"color: #ff00ff\">len<\/span>(interv_calc)\r\n        <span style=\"color: #d35400\">for<\/span> i <span style=\"color: #d35400\">in<\/span> <span style=\"color: #ff00ff\">range<\/span>(0,n_interv_calc-1,1):\r\n            i_eq = <span style=\"color: #008000\">'r'<\/span>+<span style=\"color: #ff00ff\">str<\/span>(i+1)\r\n            a = interv_calc[i]\r\n            b = interv_calc[i+1]\r\n            subintervalo = (xi &gt;= a) &amp; (xi &lt;= b)\r\n            xi_sub = xi[subintervalo]\r\n            yi_sub = yi[subintervalo]\r\n            xi_graf = np.copy(xi[subintervalo])\r\n            <span style=\"color: #d35400\">if<\/span> <span style=\"color: #d35400\">not<\/span>(a <span style=\"color: #d35400\">in<\/span> xi_sub):\r\n                xi_graf = np.concatenate(([a],xi_graf),axis=0)\r\n            <span style=\"color: #d35400\">if<\/span> <span style=\"color: #d35400\">not<\/span>(b <span style=\"color: #d35400\">in<\/span> xi_sub):\r\n                xi_graf = np.concatenate((xi_graf,[b]),axis=0)\r\n            \r\n            <span style=\"color: #ff0000\"># Evalua subintervalo con la ecuacion sin atipicos<\/span>\r\n            alpha = ecuacion[unabaliza][i_eq][<span style=\"color: #008000\">'alpha'<\/span>]\r\n            beta  = ecuacion[unabaliza][i_eq][<span style=\"color: #008000\">'beta'<\/span>]\r\n            fdist = <span style=\"color: #d35400\">lambda<\/span> d: -10*alpha*(np.log10(d))+beta\r\n            yi1_sub = fdist(xi_sub)\r\n            yi_graf = fdist(xi_graf)\r\n            eq_graf[unabaliza][i_eq][<span style=\"color: #008000\">'xi_graf'<\/span>] = xi_graf\r\n            eq_graf[unabaliza][i_eq][<span style=\"color: #008000\">'yi_graf'<\/span>] = yi_graf\r\n            a = np.round(np.min([xi_graf]),precision)\r\n            b = np.round(np.max([xi_graf]),precision)\r\n            ecuacion[unabaliza][i_eq][<span style=\"color: #008000\">'intervalox'<\/span>] = [a,b]\r\n            ay = np.round(np.min([yi_graf]),precision)\r\n            by = np.round(np.max([yi_graf]),precision)\r\n            ecuacion[unabaliza][i_eq][<span style=\"color: #008000\">'intervaloy'<\/span>] = [ay,by]            \r\n             \r\n<span style=\"color: #ff0000\"># SALIDA<\/span>\r\n<span style=\"color: #d35400\">for<\/span> unabaliza <span style=\"color: #d35400\">in<\/span> ecuacion:\r\n    <span style=\"color: #ff00ff\">print<\/span>(<span style=\"color: #008000\">'baliza: '<\/span>,unabaliza)\r\n    <span style=\"color: #d35400\">for<\/span> unaecuacion <span style=\"color: #d35400\">in<\/span> ecuacion[unabaliza]:\r\n        unintervalo  = ecuacion[unabaliza][unaecuacion][<span style=\"color: #008000\">'intervalox'<\/span>]\r\n        unintervaloy = ecuacion[unabaliza][unaecuacion][<span style=\"color: #008000\">'intervaloy'<\/span>]\r\n        error_medio  = ecuacion[unabaliza][unaecuacion][<span style=\"color: #008000\">'error_medio'<\/span>]\r\n        error_std    = ecuacion[unabaliza][unaecuacion][<span style=\"color: #008000\">'error_std'<\/span>]\r\n        eq_latex     = ecuacion[unabaliza][unaecuacion][<span style=\"color: #008000\">'eq_latex'<\/span>]\r\n        errorx_medio = ecuacion[unabaliza][unaecuacion][<span style=\"color: #008000\">'errorx_medio'<\/span>]\r\n        errorx_std   = ecuacion[unabaliza][unaecuacion][<span style=\"color: #008000\">'errorx_std'<\/span>]\r\n        correlacion  = ecuacion[unabaliza][unaecuacion][<span style=\"color: #008000\">'correlacion'<\/span>]\r\n\r\n        <span style=\"color: #ff00ff\">print<\/span>(<span style=\"color: #008000\">'  intervalo: '<\/span>,unaecuacion)\r\n        <span style=\"color: #ff00ff\">print<\/span>(<span style=\"color: #008000\">'    '<\/span> + eq_latex)\r\n        <span style=\"color: #ff00ff\">print<\/span>(<span style=\"color: #008000\">'   '<\/span>,<span style=\"color: #008000\">'intervalox: '<\/span>,np.round(unintervalo,precision))\r\n        <span style=\"color: #ff00ff\">print<\/span>(<span style=\"color: #008000\">'   '<\/span>,<span style=\"color: #008000\">'intervaloy: '<\/span>,np.round(unintervaloy,precision))\r\n        <span style=\"color: #ff00ff\">print<\/span>(<span style=\"color: #008000\">'    correlaci\u00f3n: '<\/span>,np.round(correlacion,precision))\r\n        <span style=\"color: #ff00ff\">print<\/span>(<span style=\"color: #008000\">'    |error_rssi| promedio: '<\/span>,np.round(error_medio,precision),\r\n              <span style=\"color: #008000\">' , std:'<\/span>,np.round(error_std,precision))\r\n        <span style=\"color: #ff00ff\">print<\/span>(<span style=\"color: #008000\">'    |error_dist| promedio: '<\/span>,np.round(errorx_medio,precision),\r\n              <span style=\"color: #008000\">' , std:'<\/span>,np.round(errorx_std,precision))\r\n    <span style=\"color: #ff00ff\">print<\/span>()\r\n\r\n<span style=\"color: #ff0000\"># salida hacia archivo<\/span>\r\n<span style=\"color: #d35400\">with<\/span> <span style=\"color: #ff00ff\">open<\/span>(arch_ecuaciones, <span style=\"color: #008000\">'w'<\/span>) <span style=\"color: #d35400\">as<\/span> outfile:\r\n    json.dump(ecuacion, outfile) \r\n\r\n<span style=\"color: #ff0000\"># GRAFICA<\/span>\r\n<span style=\"color: #ff0000\"># Referencias para gr\u00e1fica<\/span>\r\ngrupo   = [<span style=\"color: #008000\">'FIEC'<\/span> ,<span style=\"color: #008000\">'FCNM'<\/span>  ,<span style=\"color: #008000\">'RECT'<\/span>,<span style=\"color: #008000\">'CIRC'<\/span>]\r\ncolores = [<span style=\"color: #008000\">'green'<\/span>,<span style=\"color: #008000\">'orange'<\/span>,<span style=\"color: #008000\">'grey'<\/span>,<span style=\"color: #008000\">'magenta'<\/span>]\r\ntipo    = [<span style=\"color: #008000\">'punto'<\/span>,<span style=\"color: #008000\">'1m'<\/span> ,<span style=\"color: #008000\">'gtw'<\/span>,<span style=\"color: #008000\">'dispositivo'<\/span>]\r\nmarcas  = [    <span style=\"color: #008000\">'o'<\/span>,<span style=\"color: #008000\">'D'<\/span>  ,<span style=\"color: #008000\">'D'<\/span>  ,<span style=\"color: #008000\">'*'<\/span> ]\r\n\r\nmostrargrpeti = [<span style=\"color: #008000\">'FIEC'<\/span>,<span style=\"color: #008000\">'FCNM'<\/span>,<span style=\"color: #008000\">'RECT'<\/span>]\r\nmostrartipeti = [<span style=\"color: #008000\">'1m'<\/span>,<span style=\"color: #008000\">'gtw'<\/span>]\r\n\r\n<span style=\"color: #d35400\">if<\/span> tipograf==<span style=\"color: #008000\">'2D'<\/span>:\r\n    <span style=\"color: #d35400\">for<\/span> unabaliza <span style=\"color: #d35400\">in<\/span> ecuacion:\r\n        figura,grafica = plt.subplots()\r\n        <span style=\"color: #d35400\">if<\/span> escala == <span style=\"color: #008000\">'log'<\/span>:\r\n            grafica.set_xscale(escala,base=escalabase)\r\n\r\n        <span style=\"color: #ff0000\"># todos los puntos<\/span>\r\n        unintervalo = <span style=\"color: #008000\">'r0'<\/span>\r\n        xi = eq_graf[unabaliza][unintervalo][<span style=\"color: #008000\">'xi_graf'<\/span>]\r\n        yi = eq_graf[unabaliza][unintervalo][<span style=\"color: #008000\">'yi_graf'<\/span>]\r\n        etiqueta = eq_graf[unabaliza][unintervalo][<span style=\"color: #008000\">'etiqueta'<\/span>]\r\n        grafica.scatter(xi,yi,marker=<span style=\"color: #008000\">'.'<\/span>)\r\n        m = <span style=\"color: #ff00ff\">len<\/span>(xi)\r\n        <span style=\"color: #d35400\">for<\/span> i <span style=\"color: #d35400\">in<\/span> <span style=\"color: #ff00ff\">range<\/span>(0,m,1):\r\n            grafica.annotate(etiqueta[i],\r\n                            (xi[i],yi[i]))\r\n            \r\n        <span style=\"color: #ff0000\"># linea con todos los puntos<\/span>\r\n        fdtxt = ecuacion[unabaliza][unintervalo][<span style=\"color: #008000\">'eq_latex'<\/span>]\r\n        yi0 = eq_graf[unabaliza][unintervalo][<span style=\"color: #008000\">'linea'<\/span>]\r\n        a = np.round(np.min([xi]),2)\r\n        b = np.round(np.max([xi]),2)\r\n        eq_texto = fdtxt+<span style=\"color: #008000\">' ; ['<\/span>+<span style=\"color: #ff00ff\">str<\/span>(a)+<span style=\"color: #008000\">','<\/span>+<span style=\"color: #ff00ff\">str<\/span>(b)+<span style=\"color: #008000\">']'<\/span>\r\n        grafica.plot(xi,yi0,\r\n                     label = eq_texto,\r\n                     linestyle=<span style=\"color: #008000\">'dotted'<\/span>)\r\n\r\n        <span style=\"color: #ff0000\"># lineas por cada subintervalo<\/span>\r\n        eq_interv = <span style=\"color: #ff00ff\">list<\/span>(ecuacion[unabaliza].keys())\r\n        eq_interv.pop(0)\r\n        n_intervalo = <span style=\"color: #ff00ff\">len<\/span>(eq_interv)\r\n\r\n        <span style=\"color: #d35400\">for<\/span> i_eq <span style=\"color: #d35400\">in<\/span> eq_interv:\r\n            fdtxt   = ecuacion[unabaliza][i_eq][<span style=\"color: #008000\">'eq_latex'<\/span>]\r\n            xi_graf = eq_graf[unabaliza][i_eq][<span style=\"color: #008000\">'xi_graf'<\/span>]\r\n            yi_graf = eq_graf[unabaliza][i_eq][<span style=\"color: #008000\">'yi_graf'<\/span>]\r\n            a = np.round(np.min([xi_graf]),precision)\r\n            b = np.round(np.max([xi_graf]),precision)\r\n            eq_texto = fdtxt+<span style=\"color: #008000\">' ; ['<\/span>+<span style=\"color: #ff00ff\">str<\/span>(a)+<span style=\"color: #008000\">','<\/span>+<span style=\"color: #ff00ff\">str<\/span>(b)+<span style=\"color: #008000\">']'<\/span>\r\n            grafica.plot(xi_graf,yi_graf,\r\n                         label = eq_texto)\r\n\r\n            <span style=\"color: #ff0000\"># atipicos marcados en subintervalo<\/span>\r\n            [xi1_e,yi1_e] = eq_graf[unabaliza][i_eq][<span style=\"color: #008000\">'atipicos'<\/span>]\r\n            etiq1_e = eq_graf[unabaliza][i_eq][<span style=\"color: #008000\">'atip_etiq'<\/span>]\r\n            grafica.scatter(xi1_e,yi1_e, color=<span style=\"color: #008000\">'red'<\/span>)\r\n            m = <span style=\"color: #ff00ff\">len<\/span>(etiq1_e)\r\n            <span style=\"color: #d35400\">for<\/span> i <span style=\"color: #d35400\">in<\/span> <span style=\"color: #ff00ff\">range<\/span>(0,m,1):\r\n                grafica.annotate(etiq1_e[i],\r\n                                (xi1_e[i],yi1_e[i]),\r\n                                 color=<span style=\"color: #008000\">'red'<\/span>)\r\n        \r\n            <span style=\"color: #ff0000\"># lineas de frontera<\/span>\r\n            grafica.axvline(a, color=<span style=\"color: #008000\">'lightblue'<\/span>)\r\n            valor_frontera = <span style=\"color: #ff00ff\">str<\/span>(np.round(a,precision))\r\n            grafica.annotate(valor_frontera,\r\n                             (a,np.max([yi,yi0])),\r\n                             color=<span style=\"color: #008000\">'lightblue'<\/span>)\r\n            grafica.axvline(b, color=<span style=\"color: #008000\">'lightblue'<\/span>)\r\n            valor_frontera = <span style=\"color: #ff00ff\">str<\/span>(np.round(b,precision))\r\n            grafica.annotate(valor_frontera,\r\n                             (b,np.max([yi,yi0])),\r\n                             color=<span style=\"color: #008000\">'lightblue'<\/span>) \r\n        \r\n        <span style=\"color: #ff0000\"># etiquetas y t\u00edtulos<\/span>\r\n        grafica.legend()\r\n        grafica.set_ylabel(medida+<span style=\"color: #008000\">'_'<\/span>+modo)\r\n        grafica.set_xlabel(<span style=\"color: #008000\">'distancia'<\/span>)\r\n        grafica.grid(<span style=\"color: #d35400\">True<\/span>,linestyle=<span style=\"color: #008000\">'dotted'<\/span>,\r\n                     axis=<span style=\"color: #008000\">'x'<\/span>, which=<span style=\"color: #008000\">'both'<\/span>)\r\n        \r\n        untitulo = unabaliza+<span style=\"color: #008000\">': '<\/span>+medida+<span style=\"color: #008000\">'_'<\/span>+modo + <span style=\"color: #008000\">' vs distancia'<\/span>\r\n        grafica.set_title(untitulo)\r\n        \r\n        plt.show()\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>El algoritmo para realizar dos o m\u00e1s intervalos considera usar un estimado de frontera a lo largo de las mediciones. Se implementa a\u00f1adiendo al bloque de ingreso dos par\u00e1metros en el bloque 'analiza': 1. frontera es un vector donde se indican las distancia de los puntos de corte de los subintervalos sin considerar los extremos, &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/blog.espol.edu.ec\/girni\/linealizacion-por-intervalos-algoritmo-python\/\" class=\"more-link\">Continuar leyendo<span class=\"screen-reader-text\"> \"4.4 Rssi vs Distancia. Linealiza POR intervalos - Algoritmo Python\"<\/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":[],"class_list":["post-2979","post","type-post","status-publish","format-standard","hentry","category-localizacion-rssi-lora"],"_links":{"self":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/2979","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=2979"}],"version-history":[{"count":11,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/2979\/revisions"}],"predecessor-version":[{"id":3167,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/2979\/revisions\/3167"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/media?parent=2979"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/categories?post=2979"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/tags?post=2979"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}