{"id":3042,"date":"2021-02-15T12:32:40","date_gmt":"2021-02-15T17:32:40","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/girni\/?p=3042"},"modified":"2021-03-11T18:24:19","modified_gmt":"2021-03-11T23:24:19","slug":"4-6-rssi-vs-distancia-linealiza-sectores-algoritmo-python","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/girni\/4-6-rssi-vs-distancia-linealiza-sectores-algoritmo-python\/","title":{"rendered":"4.6 Rssi vs Distancia. Linealiza Sectores - Algoritmo Python"},"content":{"rendered":"<p>El efecto \"sombra\" a\u00f1ade el par\u00e1metro sector a la ecuaci\u00f3n que se incorpora al resultado de la linealizaci\u00f3n en cada baliza.<\/p>\n<p>La ecuaci\u00f3n de una baliza\u00a0 se compone entonces de dos par\u00e1metros de selecci\u00f3n: <code>sector<\/code> e <code>intervalo<\/code>. <a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/02\/BalizasDispositivoSector03.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-3043 size-medium alignright\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/02\/BalizasDispositivoSector03-300x255.png\" alt=\"\" width=\"300\" height=\"255\" srcset=\"https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/02\/BalizasDispositivoSector03-300x255.png 300w, https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/02\/BalizasDispositivoSector03.png 490w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Como ilustraci\u00f3n se muestra la\u00a0 figura que tiene tres partes o ecuaciones:<\/p>\n<p>ecuacion['s0']['r1']<br \/>\necuacion['s0']['r2']<br \/>\necuacion['s1']['r0']<\/p>\n<p>El primer par\u00e1metro para seleccionar la ecuaci\u00f3n es el sector, 's0' y 's1', que en caso que sea un solo c\u00edrculo se identifica como 's0'.<\/p>\n<p>Dentro de cada sector, se mantiene el concepto de\u00a0 intervalos de distancia o radio. Se mantiene el concepto de la secci\u00f3n anterior, donde 'r0' corresponde a la linealizaci\u00f3n de <strong><em>todos<\/em><\/strong> los puntos en el sector.\u00a0 Cuando exiten sub-intervalos se usa 'r1', 'r2', etc para cada intervalo.<\/p>\n<p>El n\u00famero de ecuaciones corresponde al n\u00famero de balizas y sectores establecidos para el an\u00e1lisis.<\/p>\n<p>Se realizan cambios menores a la funci\u00f3n pares_usar() de la librer\u00eda girni para incorporar el par\u00e1metro sector, que al ser vac\u00edo <code>''<\/code> funciona como fu\u00e9 descrito en las secciones anteriores.<\/p>\n<p><em><strong>pares_usar<\/strong><\/em>(tabla,baliza, analiza,unabaliza, unsector ='', medida = 'rssi', modo = 'rx')<\/p>\n<p>Tambi\u00e9n se actualizaron los nombres de los archivos de entrada y salida para diferenciar de los resultados anteriores y disponer de los archivos para comparar con los resultados del m\u00e9todo que solo usa intervalos.<\/p>\n<h2>Algoritmo en Python<\/h2>\n<pre><span style=\"color: #ff0000\"># LoRa-Multipunto, Rssi vs distancia con m\u00ednimos cuadrados<\/span>\r\n<span style=\"color: #ff0000\"># linealizaci\u00f3n Rssi vs log10(distancia) <\/span>\r\n<span style=\"color: #ff0000\"># por Sectores e intervalos , Graficas '2D'<\/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\narch_medidaubica = <span style=\"color: #008000\">'rsmP06_'<\/span>+medida+<span style=\"color: #008000\">'Ubica01sector1.txt'<\/span>\r\n\r\n<span style=\"color: #ff0000\"># archivos de salida<\/span>\r\narch_ecuaciones  = <span style=\"color: #008000\">'rsmP07_ecuacionSector01.json'<\/span>\r\narch_medUbAtrib  = <span style=\"color: #008000\">'rsmP07_'<\/span>+medida+<span style=\"color: #008000\">'UbicaUsarSector01.txt'<\/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\">'sector_ref'<\/span> : [<span style=\"color: #008000\">'FIEC112'<\/span>,<span style=\"color: #008000\">'FCNM110'<\/span>], \r\n                      <span style=\"color: #008000\">'s0'<\/span>:{<span style=\"color: #008000\">'atipico_std'<\/span> : 1,\r\n                            <span style=\"color: #008000\">'frontera'<\/span>    :   [300],\r\n                            <span style=\"color: #008000\">'atipInterv_std'<\/span>: [2,2],\r\n                            <span style=\"color: #008000\">'p_amplia'<\/span>: 2, \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\">'s1'<\/span>:{<span style=\"color: #008000\">'atipico_std'<\/span> : 1,\r\n                            <span style=\"color: #008000\">'frontera'<\/span>    :   [],\r\n                            <span style=\"color: #008000\">'atipInterv_std'<\/span>: [2],\r\n                            <span style=\"color: #008000\">'p_amplia'<\/span>: 2,\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           <span style=\"color: #008000\">'gtwFIEC'<\/span>:{<span style=\"color: #008000\">'analizar'<\/span>   : 1,\r\n                      <span style=\"color: #008000\">'sector_ref'<\/span> : [],\r\n                      <span style=\"color: #008000\">'s0'<\/span>:{<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> : [0,1] }\r\n                      },\r\n           <span style=\"color: #008000\">'gtwFCNM'<\/span>:{<span style=\"color: #008000\">'analizar'<\/span>   : 1,\r\n                      <span style=\"color: #008000\">'sector_ref'<\/span> : [],\r\n                      <span style=\"color: #008000\">'s0'<\/span>:{<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\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','' sin grafica<\/span>\r\nescala     = <span style=\"color: #008000\">'log'<\/span> <span style=\"color: #ff0000\"># 'normal','log'<\/span>\r\nescalabase = 10    <span style=\"color: #ff0000\"># 10<\/span>\r\ncasicero   = 1e-4\r\nprecision  = 2\r\nintersectar = 1 <span style=\"color: #ff0000\"># 0:Falso, 1: Verdadero<\/span>\r\n\r\n<span style=\"color: #ff0000\"># PROCEDIMIENTO<\/span>\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\nbaliza_key = <span style=\"color: #ff00ff\">list<\/span>(baliza.keys())\r\nbaliza_val = <span style=\"color: #ff00ff\">list<\/span>(baliza.values())\r\n\r\n<span style=\"color: #ff0000\"># Resultados de an\u00e1lisis<\/span>\r\necuacion = {}\r\neq_graf  = {}\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    donde = baliza_val.index(unabaliza)\r\n    cualbaliza = baliza_key[donde]\r\n\r\n    <span style=\"color: #ff0000\"># Par\u00e1metros<\/span>\r\n    analizar = analiza[unabaliza][<span style=\"color: #008000\">'analizar'<\/span>]\r\n    <span style=\"color: #d35400\">if<\/span> analizar:\r\n        <span style=\"color: #ff0000\"># Crea ecuacion por baliza<\/span>\r\n        ecuacion[unabaliza] = {<span style=\"color: #008000\">'sector_rad'<\/span>:[]}\r\n        eq_graf[unabaliza]  = {}\r\n        \r\n        <span style=\"color: #ff0000\"># sectores<\/span>\r\n        sectores   = []\r\n        sector_ref = analiza[unabaliza][<span style=\"color: #008000\">'sector_ref'<\/span>]\r\n        tabla[<span style=\"color: #008000\">'sector_'<\/span>+cualbaliza] = 0  <span style=\"color: #ff0000\"># 'todos' predeterminado<\/span>\r\n        \r\n        <span style=\"color: #ff0000\"># coordenadas baliza para identificar \u00e1ngulo<\/span>\r\n        b_este  = tabla[<span style=\"color: #008000\">'c_este'<\/span>][unabaliza]\r\n        b_norte = tabla[<span style=\"color: #008000\">'c_norte'<\/span>][unabaliza]\r\n\r\n        <span style=\"color: #ff0000\"># sectores por puntos de referencia<\/span>\r\n        <span style=\"color: #d35400\">if<\/span> <span style=\"color: #ff00ff\">len<\/span>(sector_ref)&gt;0:\r\n            <span style=\"color: #d35400\">for<\/span> cadapunto <span style=\"color: #d35400\">in<\/span> sector_ref:\r\n                p_este  = tabla[<span style=\"color: #008000\">'c_este'<\/span>][cadapunto]\r\n                p_norte = tabla[<span style=\"color: #008000\">'c_norte'<\/span>][cadapunto]\r\n                dx = p_este  - b_este\r\n                dy = p_norte - b_norte\r\n                theta = np.arctan2(dy,dx)\r\n                <span style=\"color: #d35400\">if<\/span> theta&lt;0 <span style=\"color: #d35400\">and<\/span> dx&lt;0:\r\n                    theta = theta + 2*np.pi\r\n                sectores.append(theta)\r\n            sectores  = np.array(sectores)\r\n            ordenar   = np.argsort(sectores)\r\n            sectores  = <span style=\"color: #ff00ff\">list<\/span>(sectores[ordenar])\r\n            nsectores = <span style=\"color: #ff00ff\">len<\/span>(sectores)\r\n\r\n            <span style=\"color: #ff0000\"># clasifica puntos por sector particular<\/span>\r\n            <span style=\"color: #d35400\">for<\/span> cadapunto <span style=\"color: #d35400\">in<\/span> tabla.index:\r\n                dentrosector = 0\r\n                p_este  = tabla[<span style=\"color: #008000\">'c_este'<\/span>][cadapunto]\r\n                p_norte = tabla[<span style=\"color: #008000\">'c_norte'<\/span>][cadapunto]\r\n                dx = p_este-b_este\r\n                dy = p_norte-b_norte\r\n                theta = np.arctan2(dy,dx)\r\n                <span style=\"color: #d35400\">if<\/span> theta&lt;0 <span style=\"color: #d35400\">and<\/span> dx&lt;0:\r\n                    theta = theta + 2*np.pi\r\n                <span style=\"color: #d35400\">for<\/span> j <span style=\"color: #d35400\">in<\/span> <span style=\"color: #ff00ff\">range<\/span>(0,nsectores-1,1):\r\n                    <span style=\"color: #d35400\">if<\/span> theta&gt;sectores[j] <span style=\"color: #d35400\">and<\/span> theta&lt;sectores[j+1]:\r\n                        dentrosector = j+1\r\n                tabla.loc[cadapunto,<span style=\"color: #008000\">'sector_'<\/span>+cualbaliza] = dentrosector\r\n\r\n        <span style=\"color: #ff0000\"># ecuacion por baliza y sector<\/span>\r\n        ecuacion[unabaliza][<span style=\"color: #008000\">'sector_rad'<\/span>] = sectores\r\n        nsectores = <span style=\"color: #ff00ff\">len<\/span>(sectores)\r\n        <span style=\"color: #d35400\">if<\/span> nsectores == 0:\r\n            nsectores = 1\r\n        <span style=\"color: #d35400\">for<\/span> cadasector <span style=\"color: #d35400\">in<\/span> <span style=\"color: #ff00ff\">range<\/span>(0,nsectores,1):\r\n            unsector = <span style=\"color: #008000\">'s'<\/span>+<span style=\"color: #ff00ff\">str<\/span>(cadasector)\r\n            ecuacion[unabaliza][unsector] = {}\r\n            eq_graf[unabaliza][unsector]  = {}\r\n            \r\n            <span style=\"color: #ff0000\"># ecuaci\u00f3n con todos los puntos como referencia<\/span>\r\n            [pares,par_etiqueta] = girni.pares_usar(tabla,baliza,analiza,\r\n                                                    unabaliza,unsector,\r\n                                                    medida,modo)\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 de todos los puntos<\/span>\r\n            atipico_std = analiza[unabaliza][unsector][<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][unsector] = {unintervalo: ecuacion0 }\r\n            ecuacion[unabaliza][unsector][unintervalo][<span style=\"color: #008000\">'correlacion'<\/span>] = correlacion\r\n            \r\n            eq_graf[unabaliza][unsector]  = {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][unsector][<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][unsector][<span style=\"color: #008000\">'p_amplia'<\/span>]\r\n            atipIntv_std = analiza[unabaliza][unsector][<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)\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\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][unsector][i_eq] = ecuacion1\r\n                ecuacion[unabaliza][unsector][i_eq][<span style=\"color: #008000\">'correlacion'<\/span>] = correlacion1 \r\n\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                atipicos = np.zeros(<span style=\"color: #ff00ff\">len<\/span>(xi_a),dtype=<span style=\"color: #ff00ff\">bool<\/span>)\r\n                atipico_std = analiza[unabaliza][unsector][<span style=\"color: #008000\">'atipInterv_std'<\/span>][i]\r\n                dyi1 = yi_a - yi1\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                <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][unsector][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                <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                    \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][unsector][i_eq] = ecuacion2\r\n                    ecuacion[unabaliza][unsector][i_eq][<span style=\"color: #008000\">'correlacion'<\/span>] = correlacion2\r\n\r\n            <span style=\"color: #ff0000\"># Revisar frontera entre subintervalos,<\/span>\r\n            <span style=\"color: #ff0000\"># calcula 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][unsector][ai][<span style=\"color: #008000\">'alpha'<\/span>]\r\n                    ba = ecuacion[unabaliza][unsector][ai][<span style=\"color: #008000\">'beta'<\/span>]\r\n                    mb = ecuacion[unabaliza][unsector][bi][<span style=\"color: #008000\">'alpha'<\/span>]\r\n                    bb = ecuacion[unabaliza][unsector][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_graf):\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_graf):\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][unsector][i_eq][<span style=\"color: #008000\">'alpha'<\/span>]\r\n                beta  = ecuacion[unabaliza][unsector][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][unsector][i_eq][<span style=\"color: #008000\">'xi_graf'<\/span>] = xi_graf\r\n                eq_graf[unabaliza][unsector][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][unsector][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][unsector][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: #d35400\">for<\/span> unsector <span style=\"color: #d35400\">in<\/span> ecuacion[unabaliza]:\r\n        <span style=\"color: #d35400\">if<\/span> unsector == <span style=\"color: #008000\">'sector_rad'<\/span>:\r\n            <span style=\"color: #ff00ff\">print<\/span>(<span style=\"color: #008000\">'baliza: '<\/span>,unabaliza)\r\n            <span style=\"color: #ff00ff\">print<\/span>(<span style=\"color: #008000\">' sectores radianes: '<\/span>,ecuacion[unabaliza][<span style=\"color: #008000\">'sector_rad'<\/span>])\r\n        <span style=\"color: #d35400\">if<\/span> unsector != <span style=\"color: #008000\">'sector_rad'<\/span>:\r\n            <span style=\"color: #d35400\">for<\/span> i_eq <span style=\"color: #d35400\">in<\/span> ecuacion[unabaliza][unsector]:\r\n                unintervalo  = ecuacion[unabaliza][unsector][i_eq][<span style=\"color: #008000\">'intervalox'<\/span>]\r\n                unintervaloy = ecuacion[unabaliza][unsector][i_eq][<span style=\"color: #008000\">'intervaloy'<\/span>]\r\n                error_medio  = ecuacion[unabaliza][unsector][i_eq][<span style=\"color: #008000\">'error_medio'<\/span>]\r\n                error_std    = ecuacion[unabaliza][unsector][i_eq][<span style=\"color: #008000\">'error_std'<\/span>]\r\n                eq_latex     = ecuacion[unabaliza][unsector][i_eq][<span style=\"color: #008000\">'eq_latex'<\/span>]\r\n                errorx_medio = ecuacion[unabaliza][unsector][i_eq][<span style=\"color: #008000\">'errorx_medio'<\/span>]\r\n                errorx_std   = ecuacion[unabaliza][unsector][i_eq][<span style=\"color: #008000\">'errorx_std'<\/span>]\r\n                correlacion  = ecuacion[unabaliza][unsector][i_eq][<span style=\"color: #008000\">'correlacion'<\/span>]\r\n                \r\n                <span style=\"color: #ff00ff\">print<\/span>(<span style=\"color: #008000\">'  [sector][intervalo]: '<\/span>,unsector,<span style=\"color: #008000\">','<\/span>,i_eq)\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\ntabla.to_csv(arch_medUbAtrib)\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\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        <span style=\"color: #d35400\">for<\/span> unsector <span style=\"color: #d35400\">in<\/span> ecuacion[unabaliza]:\r\n            <span style=\"color: #d35400\">if<\/span> <span style=\"color: #d35400\">not<\/span>(unsector==<span style=\"color: #008000\">'sector_rad'<\/span>):\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][unsector][unintervalo][<span style=\"color: #008000\">'xi_graf'<\/span>]\r\n                yi = eq_graf[unabaliza][unsector][unintervalo][<span style=\"color: #008000\">'yi_graf'<\/span>]\r\n                etiqueta = eq_graf[unabaliza][unsector][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],(xi[i],yi[i]))\r\n                \r\n                <span style=\"color: #ff0000\"># linealizado con todos los puntos<\/span>\r\n                fdtxt = ecuacion[unabaliza][unsector][unintervalo][<span style=\"color: #008000\">'eq_latex'<\/span>]\r\n                yi0 = eq_graf[unabaliza][unsector][unintervalo][<span style=\"color: #008000\">'linea'<\/span>]\r\n                a   = np.round(np.min([xi]),precision)\r\n                b   = np.round(np.max([xi]),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,yi0,label=eq_texto,linestyle=<span style=\"color: #008000\">'dotted'<\/span>)\r\n\r\n                <span style=\"color: #ff0000\"># linealizado por subintervalo<\/span>\r\n                eq_interv = <span style=\"color: #ff00ff\">list<\/span>(ecuacion[unabaliza][unsector].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][unsector][i_eq][<span style=\"color: #008000\">'eq_latex'<\/span>]\r\n                    grtxt   = ecuacion[unabaliza][unsector][i_eq][<span style=\"color: #008000\">'eqg_latex'<\/span>]\r\n                    xi_graf = eq_graf[unabaliza][unsector][i_eq][<span style=\"color: #008000\">'xi_graf'<\/span>]\r\n                    yi_graf = eq_graf[unabaliza][unsector][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, 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][unsector][i_eq][<span style=\"color: #008000\">'atipicos'<\/span>]\r\n                    etiq1_e = eq_graf[unabaliza][unsector][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>+unsector+<span style=\"color: #008000\">': '<\/span>\r\n                untitulo = untitulo+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 efecto \"sombra\" a\u00f1ade el par\u00e1metro sector a la ecuaci\u00f3n que se incorpora al resultado de la linealizaci\u00f3n en cada baliza. La ecuaci\u00f3n de una baliza\u00a0 se compone entonces de dos par\u00e1metros de selecci\u00f3n: sector e intervalo. Como ilustraci\u00f3n se muestra la\u00a0 figura que tiene tres partes o ecuaciones: ecuacion['s0']['r1'] ecuacion['s0']['r2'] ecuacion['s1']['r0'] El primer par\u00e1metro &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/blog.espol.edu.ec\/girni\/4-6-rssi-vs-distancia-linealiza-sectores-algoritmo-python\/\" class=\"more-link\">Continuar leyendo<span class=\"screen-reader-text\"> \"4.6 Rssi vs Distancia. Linealiza Sectores - 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-3042","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\/3042","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=3042"}],"version-history":[{"count":6,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/3042\/revisions"}],"predecessor-version":[{"id":3169,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/3042\/revisions\/3169"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/media?parent=3042"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/categories?post=3042"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/tags?post=3042"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}