{"id":3901,"date":"2021-12-23T19:28:23","date_gmt":"2021-12-24T00:28:23","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/girni\/?p=3901"},"modified":"2022-07-26T09:09:41","modified_gmt":"2022-07-26T14:09:41","slug":"lorawan-linealiza-segmentos","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/girni\/lorawan-linealiza-segmentos\/","title":{"rendered":"6. LoRaWan - Linealiza por segmentos"},"content":{"rendered":"<p>Para los diferentes entornos donde se propaga la se\u00f1al, se diferencian por segmentos (fronteras) delimitados en metros desde el gateway.<\/p>\n<p>El desnivel del terreno que existe aproximandamente a 90 mts desde el gateway tiene una secci\u00f3n de \"sombra\" en donde no se usar\u00e1n los valores para generar el modelo. por lo que el segundo segmento no se usar\u00e1 para el c\u00e1lculo, se indica en la variable como [1,0,1]<\/p>\n<pre>frontera = [0,90,125,250] # metros \r\nfrontera_usar = [1,0,1] # usar<\/pre>\n<p>Usando estos par\u00e1metros y reordenando el algoritmo anterior para ser usado en cada segmento, se obtiene el siguiente resultado<\/p>\n<p><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/ecuacion_segmentos_c_Maiz.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-3907 size-full\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/ecuacion_segmentos_c_Maiz.png\" alt=\"\" width=\"640\" height=\"480\" srcset=\"https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/ecuacion_segmentos_c_Maiz.png 640w, https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/ecuacion_segmentos_c_Maiz-300x225.png 300w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/a><\/p>\n<p>Para la secci\u00f3n de sombra, para mantener la continuidad en la gr\u00e1fica, se une el punto final del segmento anterior, y el primer punto del segmento posterior.<\/p>\n<p>Los detalles de cada ecuaci\u00f3n por segmentos son:<\/p>\n<pre> ---- segmento: 0\r\n                                            ecuacion_up                             ecuacion_down\r\nalpha                                          2.579875                                  2.366443\r\nbeta                                         -25.528314                                -27.974302\r\neq_latex          $ rssi = -10(2.58)log_{10}(d)-25.53 $     $ rssi = -10(2.37)log_{10}(d)-27.97 $\r\nintervalox                                 [1.0, 86.05]                              [1.0, 86.05]\r\nerror_medio                                     6.17513                                  6.495915\r\nerror_std                                      7.697343                                  7.230741\r\neqg_latex       $ d = 10^{(-25.53 - rssi)\/(10(2.58))} $   $ d = 10^{(-27.97 - rssi)\/(10(2.37))} $\r\nintervaloy    [-90.48339483394834, -25.745454545454542]  [-82.15682656826569, -26.98787878787879]\r\nerrorx_medio                                  43.575249                                 35.657177\r\nerrorx_std                                    89.139552                                 50.786448\r\n\r\n ---- segmento: 1\r\n                                           ecuacion_up                             ecuacion_down\r\nalpha                                         7.068273                                  6.777292\r\nbeta                                         61.310998                                 57.364631\r\neq_latex         $ rssi = -10(7.07)log_{10}(d)+61.31 $     $ rssi = -10(6.78)log_{10}(d)+57.36 $\r\nintervalox                             [86.05, 124.08]                           [86.05, 124.08]\r\nerror_medio                                        0.0                                       0.0\r\nerror_std                                          0.0                                       0.0\r\neqg_latex       $ d = 10^{(61.31 - rssi)\/(10(7.07))} $    $ d = 10^{(57.36 - rssi)\/(10(6.78))} $\r\nintervaloy    [-86.67755403724453, -75.44247020329829]  [-84.53164627778156, -73.75907940898257]\r\nerrorx_medio                                       0.0                                       0.0\r\nerrorx_std                                         0.0                                       0.0\r\n\r\n ---- segmento: 2\r\n                                            ecuacion_up                             ecuacion_down\r\nalpha                                          4.082007                                  4.159709\r\nbeta                                          -1.212499                                  2.560248\r\neq_latex           $ rssi = -10(4.08)log_{10}(d)-1.21 $      $ rssi = -10(4.16)log_{10}(d)+2.56 $\r\nintervalox                             [124.08, 238.66]                          [126.91, 235.77]\r\nerror_medio                                    3.623762                                  3.887403\r\nerror_std                                      4.452527                                  4.535259\r\neqg_latex        $ d = 10^{(-1.21 - rssi)\/(10(4.08))} $     $ d = 10^{(2.56 - rssi)\/(10(4.16))} $\r\nintervaloy    [-105.64163822525596, -81.32270916334662]  [-99.64505119453923, -80.30278884462152]\r\nerrorx_medio                                  39.417734                                 39.102089\r\nerrorx_std                                     52.33983                                 45.251062\r\n<\/pre>\n<hr \/>\n<h2>Instrucciones en Python<\/h2>\n<pre><span style=\"color: #ff0000\"># ecuaci\u00f3n por m\u00ednimos cuadrados de una ruta por segmentos<\/span>\r\n<span style=\"color: #ff0000\"># usando las medidas y distancia al gateway de cada punto<\/span>\r\n<span style=\"color: #ff0000\"># Revision 2022\/07\/23<\/span>\r\n<span style=\"color: #ff0000\"># http:\/\/blog.espol.edu.ec\/girni\/<\/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> os\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_lorawan_lib <span style=\"color: #d35400\">as<\/span> girni\r\n\r\n<span style=\"color: #ff0000\"># INGRESO<\/span>\r\ncarpeta_rsm = <span style=\"color: #008000\">\"resultado_c_Maiz_todo\"<\/span>\r\nfrontera = [0,90,125,250] <span style=\"color: #ff0000\"># metros<\/span>\r\nsegmento_usar =  [1,0,1] <span style=\"color: #ff0000\"># usar<\/span>\r\n\r\narch_var_general = <span style=\"color: #008000\">'variables_generales.txt'<\/span>\r\n\r\n<span style=\"color: #ff0000\"># PROCEDIMIENTO<\/span>\r\n<span style=\"color: #ff0000\"># carga variables desde archivos<\/span>\r\n<span style=\"color: #d35400\">with<\/span> <span style=\"color: #FF00FF\">open<\/span>(arch_var_general) <span style=\"color: #d35400\">as<\/span> linea:\r\n    texto = linea.read()\r\nvar_gen = json.loads(texto)\r\n<span style=\"color: #FF00FF\">globals<\/span>().update(var_gen)\r\n\r\npartes = carpeta_rsm.strip(<span style=\"color: #008000\">'\/'<\/span>).split(<span style=\"color: #008000\">'_'<\/span>)\r\narch_nombre = partes[1]+<span style=\"color: #008000\">'_'<\/span>+partes[2]\r\n\r\n<span style=\"color: #d35400\">def<\/span> <span style=\"color: #0000e6\">linealiza_preparadatos<\/span>(carpeta_rsm,arch_coord,var_gen):\r\n    <span style=\"color: #008000\">''' desarrolla la ecuaci\u00f3n para un gradiente\r\n    '''<\/span>\r\n    var_gen[<span style=\"color: #008000\">'movAvg_cual'<\/span>] = [2,4] <span style=\"color: #ff0000\">#cada cuantas muestras<\/span>\r\n    partes = carpeta_rsm.strip(<span style=\"color: #008000\">'\/'<\/span>).split(<span style=\"color: #008000\">'_'<\/span>)\r\n    arch_nombre = partes[1]+<span style=\"color: #008000\">'_'<\/span>+partes[2]\r\n\r\n    carp_coord = var_gen[<span style=\"color: #008000\">'carp_coord'<\/span>]\r\n    medida = var_gen[<span style=\"color: #008000\">'medida'<\/span>]\r\n    precision = var_gen[<span style=\"color: #008000\">'precision'<\/span>]\r\n    \r\n    <span style=\"color: #ff0000\"># lee coordenadas y su distancia al gateway<\/span>\r\n    dist_Gtw = girni.coordenadas_leer(arch_coord,carp_coord)\r\n\r\n    <span style=\"color: #ff0000\"># lista.txt de archivos a usar<\/span>\r\n    arch_lista = medida+<span style=\"color: #008000\">\"_\"<\/span>+arch_nombre+<span style=\"color: #008000\">\"_lista.txt\"<\/span>\r\n    archivo_ruta  = carpeta_rsm + <span style=\"color: #008000\">'\/'<\/span> + arch_lista\r\n    archivoexiste = os.path.exists(archivo_ruta)\r\n    <span style=\"color: #d35400\">if<\/span> <span style=\"color: #d35400\">not<\/span>(archivoexiste):\r\n        puntoUsar_Colum = [<span style=\"color: #008000\">'punto'<\/span>, <span style=\"color: #008000\">'up'<\/span>, <span style=\"color: #008000\">'down'<\/span>] \r\n        puntoUsar_Tipos = {<span style=\"color: #008000\">'punto'<\/span> : <span style=\"color: #008000\">'object'<\/span>,\r\n                           <span style=\"color: #008000\">'up'<\/span>   : <span style=\"color: #008000\">'int64'<\/span>,\r\n                           <span style=\"color: #008000\">'down'<\/span> : <span style=\"color: #008000\">'int64'<\/span>}\r\n        puntoUsar = pd.DataFrame(columns = puntoUsar_Colum)\r\n        puntoUsar = puntoUsar.astype(dtype = puntoUsar_Tipos)\r\n        <span style=\"color: #d35400\">for<\/span> unarchivo <span style=\"color: #d35400\">in<\/span> os.listdir(carpeta_rsm):\r\n            verifica = unarchivo.startswith(<span style=\"color: #008000\">'describe_'<\/span>)\r\n            verifica = verifica <span style=\"color: #d35400\">and<\/span> unarchivo.endswith(<span style=\"color: #008000\">'.csv'<\/span>)\r\n            <span style=\"color: #d35400\">if<\/span> verifica:\r\n                partes  = unarchivo.strip(<span style=\"color: #008000\">'.csv'<\/span>).split(<span style=\"color: #008000\">'_'<\/span>)\r\n                unpunto = partes[2]\r\n                puntodato = {<span style=\"color: #008000\">'punto'<\/span> : unpunto,\r\n                             <span style=\"color: #008000\">'up'<\/span> : 1,\r\n                             <span style=\"color: #008000\">'down'<\/span> : 1}\r\n                puntodato = pd.DataFrame([puntodato])\r\n                puntoUsar = pd.concat([puntoUsar,\r\n                                       puntodato],\r\n                                      ignore_index = <span style=\"color: #d35400\">True<\/span>)\r\n        puntoUsar = puntoUsar.set_index(<span style=\"color: #008000\">'punto'<\/span>)\r\n        puntoUsar.to_csv(archivo_ruta)\r\n    <span style=\"color: #ff0000\"># usa lista.txt de archivos seleccionados 1 \u00f3 0 para enlace up,down<\/span>\r\n    <span style=\"color: #d35400\">if<\/span> (archivoexiste):\r\n        puntoUsar = pd.read_csv(archivo_ruta)\r\n        puntoUsar = puntoUsar.set_index(<span style=\"color: #008000\">'punto'<\/span>)\r\n      \r\n    <span style=\"color: #ff0000\"># Datos para gr\u00e1fica desde lista.txt<\/span>\r\n    punto_columnas = [<span style=\"color: #008000\">'codigopunto'<\/span>,<span style=\"color: #008000\">'dist_Gtw'<\/span>,\r\n                      medida+<span style=\"color: #008000\">'_up'<\/span>,medida+<span style=\"color: #008000\">'_up'<\/span>+<span style=\"color: #008000\">'_std'<\/span>,\r\n                      <span style=\"color: #008000\">'usar_up'<\/span>,medida+<span style=\"color: #008000\">'_down'<\/span>,\r\n                      medida+<span style=\"color: #008000\">'_down'<\/span>+<span style=\"color: #008000\">'_std'<\/span>,\r\n                      <span style=\"color: #008000\">'usar_down'<\/span>,<span style=\"color: #008000\">'dispositivo'<\/span>]\r\n    punto_tipos = {<span style=\"color: #008000\">'codigopunto'<\/span>: <span style=\"color: #008000\">'object'<\/span>,\r\n                   <span style=\"color: #008000\">'dist_Gtw'<\/span>   : <span style=\"color: #008000\">'float64'<\/span>,\r\n                   medida+<span style=\"color: #008000\">'_up'<\/span> : <span style=\"color: #008000\">'float64'<\/span>,\r\n                   medida+<span style=\"color: #008000\">'_up'<\/span>+<span style=\"color: #008000\">'_std'<\/span>: <span style=\"color: #008000\">'float64'<\/span>,\r\n                   <span style=\"color: #008000\">'usar_up'<\/span> : <span style=\"color: #008000\">'int64'<\/span>,\r\n                   medida+<span style=\"color: #008000\">'_down'<\/span>: <span style=\"color: #008000\">'float64'<\/span>,\r\n                   medida+<span style=\"color: #008000\">'_down'<\/span>+<span style=\"color: #008000\">'_std'<\/span> :<span style=\"color: #008000\">'float64'<\/span>,\r\n                   <span style=\"color: #008000\">'usar_down'<\/span> : <span style=\"color: #008000\">'int64'<\/span>,\r\n                   <span style=\"color: #008000\">'dispositivo'<\/span>: <span style=\"color: #008000\">'object'<\/span>}\r\n    punto_graf = pd.DataFrame(columns=punto_columnas)\r\n    punto_graf = punto_graf.astype(dtype=punto_tipos)\r\n    puntoSinDist = []\r\n    <span style=\"color: #d35400\">for<\/span> unarchivo <span style=\"color: #d35400\">in<\/span> os.listdir(carpeta_rsm):\r\n        <span style=\"color: #d35400\">if<\/span> unarchivo.startswith(<span style=\"color: #008000\">'describe_'<\/span>):\r\n            codigopunto = unarchivo.strip(<span style=\"color: #008000\">'.csv'<\/span>).split(<span style=\"color: #008000\">'_'<\/span>)[2]\r\n            \r\n            <span style=\"color: #ff0000\"># lectura del archivo<\/span>\r\n            unresumen  = carpeta_rsm+<span style=\"color: #008000\">'\/'<\/span>+unarchivo\r\n            descriptor = pd.read_csv(unresumen,index_col=<span style=\"color: #008000\">'Unnamed: 0'<\/span>)\r\n\r\n            <span style=\"color: #d35400\">if<\/span> (codigopunto <span style=\"color: #d35400\">in<\/span> dist_Gtw.index):\r\n                undato = {<span style=\"color: #008000\">'codigopunto'<\/span>: codigopunto,\r\n                          <span style=\"color: #008000\">'dist_Gtw'<\/span>   : dist_Gtw[codigopunto],\r\n                          medida+<span style=\"color: #008000\">'_up'<\/span> : descriptor[<span style=\"color: #008000\">'rssi_up'<\/span>][<span style=\"color: #008000\">'mean'<\/span>],\r\n                          medida+<span style=\"color: #008000\">'_up'<\/span>+<span style=\"color: #008000\">'_std'<\/span>: descriptor[<span style=\"color: #008000\">'rssi_up'<\/span>][<span style=\"color: #008000\">'std'<\/span>],\r\n                          <span style=\"color: #008000\">'usar_up'<\/span> : puntoUsar[<span style=\"color: #008000\">'up'<\/span>][codigopunto],\r\n                          medida+<span style=\"color: #008000\">'_down'<\/span>: descriptor[<span style=\"color: #008000\">'rssi_down'<\/span>][<span style=\"color: #008000\">'mean'<\/span>],\r\n                          medida+<span style=\"color: #008000\">'_down'<\/span>+<span style=\"color: #008000\">'_std'<\/span> :descriptor[<span style=\"color: #008000\">'rssi_down'<\/span>][<span style=\"color: #008000\">'std'<\/span>],\r\n                          <span style=\"color: #008000\">'usar_down'<\/span> : puntoUsar[<span style=\"color: #008000\">'down'<\/span>][codigopunto],\r\n                          <span style=\"color: #008000\">'dispositivo'<\/span>: descriptor[<span style=\"color: #008000\">'dispositivo'<\/span>][0]\r\n                          }\r\n                undato = pd.DataFrame([undato])\r\n                punto_graf = pd.concat([punto_graf,undato],\r\n                                       ignore_index=<span style=\"color: #d35400\">True<\/span>)\r\n            <span style=\"color: #d35400\">else<\/span>:\r\n                puntoSinDist.append(codigopunto)\r\n            \r\n    punto_graf = punto_graf.set_index(<span style=\"color: #008000\">'codigopunto'<\/span>)\r\n    punto_graf = punto_graf.sort_values(<span style=\"color: #008000\">'dist_Gtw'<\/span> )\r\n\r\n    <span style=\"color: #d35400\">return<\/span>(punto_graf)\r\n\r\n\r\npunto_graf = linealiza_preparadatos(carpeta_rsm,arch_coord,var_gen)\r\n\r\n<span style=\"color: #ff0000\"># Segmentos, intervalos de indices en tabla ----------<\/span>\r\nextiende   = 15 <span style=\"color: #ff0000\"># metros<\/span>\r\nintervalos = []\r\nintervalos_ext = []\r\n\r\nn_sector = <span style=\"color: #FF00FF\">len<\/span>(frontera)\r\nindices = np.arange(0,<span style=\"color: #FF00FF\">len<\/span>(punto_graf[<span style=\"color: #008000\">'dist_Gtw'<\/span>]),1)\r\n<span style=\"color: #d35400\">for<\/span> i <span style=\"color: #d35400\">in<\/span> <span style=\"color: #FF00FF\">range<\/span>(0,n_sector-1,1):\r\n    desde = frontera[i]\r\n    hasta = frontera[i+1]\r\n    \r\n    <span style=\"color: #ff0000\"># intervalos, indices [a,b]<\/span>\r\n    sector = (punto_graf[<span style=\"color: #008000\">'dist_Gtw'<\/span>]&gt;=desde)\r\n    sector = sector &amp; (punto_graf[<span style=\"color: #008000\">'dist_Gtw'<\/span>]&lt;hasta)\r\n    unintervalo = indices[sector]\r\n    a = np.min(unintervalo)\r\n    <span style=\"color: #d35400\">if<\/span> i&gt;0:\r\n        a = a - 1\r\n        sector[a] = <span style=\"color: #d35400\">True<\/span>\r\n    b = np.max(unintervalo)\r\n    intervalos.append([a,b])\r\n    punto_graf[<span style=\"color: #008000\">'sector_'<\/span>+<span style=\"color: #FF00FF\">str<\/span>(i)] = sector\r\n    \r\n    <span style=\"color: #ff0000\"># intervalos extendidos<\/span>\r\n    <span style=\"color: #d35400\">if<\/span> (desde-extiende)&gt;0:\r\n        desde = desde - extiende\r\n    <span style=\"color: #d35400\">if<\/span> (hasta + extiende) &lt; np.max(punto_graf[<span style=\"color: #008000\">'dist_Gtw'<\/span>]):\r\n        hasta = hasta + extiende\r\n    sector_ext = (punto_graf[<span style=\"color: #008000\">'dist_Gtw'<\/span>]&gt;=desde)\r\n    sector_ext = sector_ext &amp; (punto_graf[<span style=\"color: #008000\">'dist_Gtw'<\/span>]&lt;=hasta)\r\n    unintervalo = indices[sector_ext]\r\n    a = np.min(unintervalo)\r\n    b = np.max(unintervalo)\r\n    intervalos_ext.append([a,b])\r\n    \r\n\r\n<span style=\"color: #d35400\">def<\/span> <span style=\"color: #0000e6\">linealiza_segmento<\/span>(punto_graf,var_gen,segmento=-1):\r\n    <span style=\"color: #008000\">'''estima la ecuacion para cada segmento,\r\n       usada solo cuando segmento &gt;=0 [0,1,2,... ]\r\n    '''<\/span>\r\n    precision = var_gen[<span style=\"color: #008000\">'precision'<\/span>]\r\n    resultado  = {}\r\n    xi = np.array(punto_graf[<span style=\"color: #008000\">'dist_Gtw'<\/span>])\r\n    <span style=\"color: #ff0000\"># enlace up\/down<\/span>\r\n    enlaces =[<span style=\"color: #008000\">'up'<\/span>,<span style=\"color: #008000\">'down'<\/span>]\r\n    <span style=\"color: #d35400\">for<\/span> unenlace <span style=\"color: #d35400\">in<\/span> enlaces:\r\n        usar = punto_graf[<span style=\"color: #008000\">'usar_'<\/span>+unenlace]\r\n        <span style=\"color: #d35400\">if<\/span> segmento&gt;=0:\r\n            sector = punto_graf[<span style=\"color: #008000\">'sector_'<\/span>+<span style=\"color: #FF00FF\">str<\/span>(segmento)]\r\n            usar   = usar*sector\r\n        yi = np.array(punto_graf[medida+<span style=\"color: #008000\">'_'<\/span>+unenlace])\r\n        <span style=\"color: #ff0000\"># ecuacion<\/span>\r\n        eq = girni.linealiza_lstsq(xi[usar==1],\r\n                                   yi[usar==1],\r\n                                   digitos = precision)\r\n        alpha = eq[<span style=\"color: #008000\">'alpha'<\/span>]\r\n        beta  = eq[<span style=\"color: #008000\">'beta'<\/span>]\r\n        fd = <span style=\"color: #d35400\">lambda<\/span> d: -10*alpha*(np.log10(d))+beta\r\n        <span style=\"color: #ff0000\"># puntos de ecuacion en tabla<\/span>\r\n        punto_graf[<span style=\"color: #008000\">'fi_'<\/span>+unenlace] = fd(xi)\r\n        resultado[<span style=\"color: #008000\">'ecuacion_'<\/span>+unenlace] = eq\r\n    resultado[<span style=\"color: #008000\">'tabla'<\/span>] = punto_graf\r\n    <span style=\"color: #d35400\">return<\/span> (resultado)\r\n\r\n<span style=\"color: #ff0000\"># segmentos a usar primero y \u00faltimo  ----------<\/span>\r\nprimero   = segmento_usar.index(1)\r\ninvertido = segmento_usar.copy()\r\ninvertido.reverse()\r\nultimo = <span style=\"color: #FF00FF\">len<\/span>(segmento_usar) - invertido.index(1) - 1\r\n\r\n<span style=\"color: #ff0000\"># ecuaciones para todos los segmentos<\/span>\r\neq_intervalo = {}\r\ntabla = {}\r\n<span style=\"color: #d35400\">for<\/span> i <span style=\"color: #d35400\">in<\/span> <span style=\"color: #FF00FF\">range<\/span>(0,n_sector-1,1):\r\n    resultado = linealiza_segmento(punto_graf,var_gen,i)\r\n    ecuacion = resultado.copy()\r\n    ecuacion.pop(<span style=\"color: #008000\">'tabla'<\/span>)\r\n    ecuacion = pd.DataFrame(ecuacion)\r\n    eq_intervalo[i] = ecuacion\r\n    tabla[i] = resultado[<span style=\"color: #008000\">'tabla'<\/span>].copy()\r\n        \r\n<span style=\"color: #ff0000\"># intervalos de sombra corrige anteriores<\/span>\r\n<span style=\"color: #d35400\">for<\/span> i <span style=\"color: #d35400\">in<\/span> <span style=\"color: #FF00FF\">range<\/span>(0,n_sector-1,1):\r\n    condicion = i&gt;primero <span style=\"color: #d35400\">and<\/span> i&lt;ultimo\r\n    <span style=\"color: #d35400\">if<\/span> <span style=\"color: #d35400\">not<\/span>(segmento_usar[i]) <span style=\"color: #d35400\">and<\/span> i&gt;0 <span style=\"color: #d35400\">and<\/span> condicion:\r\n        sector = punto_graf[<span style=\"color: #008000\">'sector_'<\/span>+<span style=\"color: #FF00FF\">str<\/span>(i)]\r\n        <span style=\"color: #ff0000\"># extremos [a,b]<\/span>\r\n        a = intervalos[i-1][1]\r\n        b = intervalos[i][1]\r\n        <span style=\"color: #ff0000\"># extremo izquierdo a<\/span>\r\n        xa_up = tabla[i][<span style=\"color: #008000\">'dist_Gtw'<\/span>][a]\r\n        ya_up = tabla[i-1][<span style=\"color: #008000\">'fi_up'<\/span>][a]\r\n        ya_down = tabla[i-1][<span style=\"color: #008000\">'fi_down'<\/span>][a]\r\n        <span style=\"color: #ff0000\"># extremo derecho b<\/span>\r\n        xb_up = tabla[i][<span style=\"color: #008000\">'dist_Gtw'<\/span>][b]\r\n        yb_up = tabla[i+1][<span style=\"color: #008000\">'fi_up'<\/span>][b]\r\n        yb_down = tabla[i+1][<span style=\"color: #008000\">'fi_down'<\/span>][b]\r\n        eq_up = girni.linealiza_lstsq([xa_up,xb_up],\r\n                                      [ya_up,yb_up],\r\n                                      digitos = precision)\r\n        eq_down = girni.linealiza_lstsq([xa_up,xb_up],\r\n                                        [ya_down,yb_down],\r\n                                        digitos = precision)\r\n        ecuacion = {<span style=\"color: #008000\">'ecuacion_up'<\/span>   : eq_up,\r\n                    <span style=\"color: #008000\">'ecuacion_down'<\/span> : eq_down}\r\n        ecuacion = pd.DataFrame(ecuacion)\r\n        eq_intervalo[i] = ecuacion\r\n        \r\n<span style=\"color: #ff0000\"># SALIDA<\/span>\r\n<span style=\"color: #d35400\">for<\/span> i <span style=\"color: #d35400\">in<\/span> <span style=\"color: #FF00FF\">range<\/span>(0,n_sector-1,1):\r\n    <span style=\"color: #FF00FF\">print<\/span>(<span style=\"color: #008000\">'\\n ---- segmento:'<\/span>,i)\r\n    <span style=\"color: #FF00FF\">print<\/span>(eq_intervalo[i])\r\n\r\n<span style=\"color: #d35400\">def<\/span> <span style=\"color: #0000e6\">graf_gradiente_segmento<\/span>(arch_nombre,punto_graf,ecuacion,var_gen):\r\n    <span style=\"color: #008000\">''' grafica de gradiente\r\n    '''<\/span>\r\n    medida = var_gen[<span style=\"color: #008000\">'medida'<\/span>]\r\n    precision = var_gen[<span style=\"color: #008000\">'precision'<\/span>]\r\n    escalabase = 10    <span style=\"color: #ff0000\"># 10<\/span>\r\n    escala = <span style=\"color: #008000\">'log'<\/span>\r\n\r\n    dist = punto_graf[<span style=\"color: #008000\">'dist_Gtw'<\/span>]\r\n    <span style=\"color: #ff0000\"># enlace up\/down<\/span>\r\n    enlaces = [<span style=\"color: #008000\">'up'<\/span>,<span style=\"color: #008000\">'down'<\/span>]\r\n    colorenlace = [<span style=\"color: #008000\">'blue'<\/span>,<span style=\"color: #008000\">'orange'<\/span>]\r\n    i=0\r\n    <span style=\"color: #d35400\">for<\/span> unenlace <span style=\"color: #d35400\">in<\/span> enlaces:\r\n        <span style=\"color: #ff0000\"># enlace_up\/down<\/span>\r\n        media = punto_graf[medida+<span style=\"color: #008000\">'_'<\/span>+unenlace]\r\n        std   = punto_graf[medida+<span style=\"color: #008000\">'_'<\/span>+unenlace+<span style=\"color: #008000\">'_std'<\/span>]\r\n        media_techo = media + std\r\n        media_piso  = media - std\r\n        yi = np.array(media)\r\n        fi = punto_graf[<span style=\"color: #008000\">'fi'<\/span>+<span style=\"color: #008000\">'_'<\/span>+unenlace]\r\n\r\n        usar = punto_graf[<span style=\"color: #008000\">'usar_'<\/span>+unenlace]\r\n        eq = ecuacion[<span style=\"color: #008000\">'ecuacion_'<\/span>+unenlace]\r\n        dyi_std = eq[<span style=\"color: #008000\">'error_std'<\/span>]\r\n\r\n        <span style=\"color: #d35400\">for<\/span> j <span style=\"color: #d35400\">in<\/span> <span style=\"color: #FF00FF\">range<\/span>(0,<span style=\"color: #FF00FF\">len<\/span>(dist),1):\r\n            uncolor = colorenlace[i]\r\n            etiqueta = dist.keys()[j]\r\n            <span style=\"color: #d35400\">if<\/span> <span style=\"color: #d35400\">not<\/span>(usar[j]):\r\n                uncolor = <span style=\"color: #008000\">'red'<\/span>\r\n            <span style=\"color: #ff0000\"># medida up\/down +\/- std<\/span>\r\n            graf[i].scatter(dist[j],media[j],\r\n                            color=uncolor,marker=<span style=\"color: #008000\">'o'<\/span>)\r\n            graf[i].scatter(dist[j],media_techo[j],\r\n                            color=uncolor,marker=<span style=\"color: #008000\">'+'<\/span>)\r\n            graf[i].scatter(dist[j],media_piso[j],\r\n                            color=uncolor,marker=<span style=\"color: #008000\">'+'<\/span>)\r\n            <span style=\"color: #ff0000\"># etiquetas por punto<\/span>\r\n            graf[i].annotate(etiqueta,(dist[j],yi[j]),rotation=45)\r\n        \r\n        <span style=\"color: #ff0000\"># linealizado up\/down<\/span>\r\n        etiq_gradnt = eq[<span style=\"color: #008000\">'eq_latex'<\/span>]\r\n        etiq_gradnt = etiq_gradnt+<span style=\"color: #008000\">' ; ['<\/span>+<span style=\"color: #FF00FF\">str<\/span>(<span style=\"color: #FF00FF\">int<\/span>(np.min(dist)))\r\n        etiq_gradnt = etiq_gradnt+<span style=\"color: #008000\">','<\/span>+<span style=\"color: #FF00FF\">str<\/span>(<span style=\"color: #FF00FF\">int<\/span>(np.max(dist)))+<span style=\"color: #008000\">']'<\/span>\r\n        graf[i].plot(dist,fi,label = etiq_gradnt,color=colorenlace[i])\r\n        graf[i].plot(dist,fi+dyi_std,color=colorenlace[i],linestyle=<span style=\"color: #008000\">'dotted'<\/span>)\r\n        graf[i].plot(dist,fi-dyi_std,color=colorenlace[i],linestyle=<span style=\"color: #008000\">'dotted'<\/span>)\r\n\r\n        <span style=\"color: #ff0000\"># etiquetado de grafico<\/span>\r\n        graf[i].set_ylabel(medida+<span style=\"color: #008000\">'_'<\/span>+enlaces[i]+<span style=\"color: #008000\">' (dBm)'<\/span>,color=colorenlace[i])\r\n        graf[i].legend()\r\n        graf[i].grid(<span style=\"color: #d35400\">True<\/span>,linestyle=<span style=\"color: #008000\">'dotted'<\/span>,axis=<span style=\"color: #008000\">'x'<\/span>, which=<span style=\"color: #008000\">'both'<\/span>)\r\n        <span style=\"color: #d35400\">if<\/span> i==0:\r\n            graf[0].set_title(arch_nombre+<span style=\"color: #008000\">' '<\/span>+medida)\r\n        <span style=\"color: #d35400\">if<\/span> i==1:\r\n            graf[1].set_xlabel(<span style=\"color: #008000\">'distancia'<\/span>)\r\n        i = i + 1\r\n    <span style=\"color: #d35400\">return<\/span>(fig_gradnt)\r\n\r\n<span style=\"color: #ff0000\"># grafica gradientes por segmentos<\/span>\r\n<span style=\"color: #ff0000\"># para limites en eje y<\/span>\r\ntecho_up = pd.DataFrame()\r\npiso_up  = pd.DataFrame()\r\ntecho_down = pd.DataFrame()\r\npiso_down  = pd.DataFrame()\r\n\r\ngraf=[0,0]\r\nfig_gradnt,graf = plt.subplots(2,1)\r\nescalabase = 10    <span style=\"color: #ff0000\"># 10<\/span>\r\nescala = <span style=\"color: #008000\">'log'<\/span>\r\n<span style=\"color: #d35400\">if<\/span> escala == <span style=\"color: #008000\">'log'<\/span>:\r\n    graf[0].set_xscale(escala,base=escalabase)\r\n    graf[1].set_xscale(escala,base=escalabase)\r\n\r\n<span style=\"color: #ff0000\"># grafica cada segmento<\/span>\r\n<span style=\"color: #d35400\">for<\/span> i <span style=\"color: #d35400\">in<\/span> <span style=\"color: #FF00FF\">range<\/span>(0,n_sector-1,1):\r\n    sector = tabla[i][<span style=\"color: #008000\">'sector_'<\/span>+<span style=\"color: #FF00FF\">str<\/span>(i)]\r\n    punto_grupo = tabla[i][sector]\r\n\r\n    <span style=\"color: #ff0000\">#enlace_up<\/span>\r\n    media_up = punto_grupo[medida+<span style=\"color: #008000\">'_up'<\/span>]\r\n    std_up   = eq_intervalo[i][<span style=\"color: #008000\">'ecuacion_up'<\/span>][<span style=\"color: #008000\">'error_std'<\/span>]\r\n    media_up_techo = media_up + std_up\r\n    media_up_piso  = media_up - std_up\r\n    <span style=\"color: #ff0000\"># enlace_down<\/span>\r\n    media_down = punto_grupo[medida+<span style=\"color: #008000\">'_down'<\/span>]\r\n    std_down   = eq_intervalo[i][<span style=\"color: #008000\">'ecuacion_up'<\/span>][<span style=\"color: #008000\">'error_std'<\/span>]\r\n    media_down_techo = media_down + std_down\r\n    media_down_piso  = media_down - std_down\r\n    \r\n    techo_up = pd.concat([techo_up,media_up_techo])\r\n    piso_up  = pd.concat([piso_up,media_up_piso])\r\n    techo_down = pd.concat([techo_down,media_down_techo])\r\n    piso_down  = pd.concat([piso_down,media_down_piso])\r\n\r\n    <span style=\"color: #d35400\">if<\/span> segmento_usar[i]:\r\n        ecuacion = eq_intervalo[i]\r\n        graf_gradiente_segmento(arch_nombre,punto_grupo,ecuacion,var_gen)\r\n        \r\n    condicion = i&gt;primero <span style=\"color: #d35400\">and<\/span> i&lt;ultimo\r\n    <span style=\"color: #d35400\">if<\/span> <span style=\"color: #d35400\">not<\/span>(segmento_usar[i]) <span style=\"color: #d35400\">and<\/span> i&gt;0 <span style=\"color: #d35400\">and<\/span> condicion:\r\n        a = tabla[i][<span style=\"color: #008000\">'dist_Gtw'<\/span>][intervalos[i][0]]\r\n        b = tabla[i][<span style=\"color: #008000\">'dist_Gtw'<\/span>][intervalos[i][1]]\r\n        \r\n        graf[0].axvspan(a,b,alpha=0.5,color=<span style=\"color: #008000\">'gray'<\/span>)\r\n        graf[1].axvspan(a,b,alpha=0.5,color=<span style=\"color: #008000\">'gray'<\/span>)\r\n        \r\n        <span style=\"color: #ff0000\"># linea intermedia<\/span>\r\n        xi = punto_grupo[<span style=\"color: #008000\">'dist_Gtw'<\/span>]\r\n        ecuacion = eq_intervalo[i]\r\n        fi_up = punto_grupo[<span style=\"color: #008000\">'fi_up'<\/span>]\r\n        fi_down = punto_grupo[<span style=\"color: #008000\">'fi_down'<\/span>]\r\n\r\n        graf[0].scatter(xi,media_up,color=<span style=\"color: #008000\">'blue'<\/span>,marker=<span style=\"color: #008000\">'o'<\/span>)\r\n        graf[0].scatter(xi,media_up_techo,color=<span style=\"color: #008000\">'blue'<\/span>,marker=<span style=\"color: #008000\">'+'<\/span>)\r\n        graf[0].scatter(xi,media_up_piso,color=<span style=\"color: #008000\">'blue'<\/span>,marker=<span style=\"color: #008000\">'+'<\/span>)\r\n        \r\n        graf[1].scatter(xi,media_down,color=<span style=\"color: #008000\">'orange'<\/span>,marker=<span style=\"color: #008000\">'o'<\/span>)\r\n        graf[1].scatter(xi,media_down_techo,color=<span style=\"color: #008000\">'orange'<\/span>,marker=<span style=\"color: #008000\">'+'<\/span>)\r\n        graf[1].scatter(xi,media_down_piso,color=<span style=\"color: #008000\">'orange'<\/span>,marker=<span style=\"color: #008000\">'+'<\/span>)\r\n\r\n        alpha_up = eq_up[<span style=\"color: #008000\">'alpha'<\/span>]\r\n        beta_up  = eq_up[<span style=\"color: #008000\">'beta'<\/span>]\r\n        fd_up = <span style=\"color: #d35400\">lambda<\/span> d: -10*alpha_up*(np.log10(d))+beta_up\r\n        fi_up = fd_up(xi)\r\n        \r\n        alpha_down = eq_down[<span style=\"color: #008000\">'alpha'<\/span>]\r\n        beta_down  = eq_down[<span style=\"color: #008000\">'beta'<\/span>]\r\n        fd_down = <span style=\"color: #d35400\">lambda<\/span> d: -10*alpha_down*(np.log10(d))+beta_down\r\n        fi_down = fd_down(xi)\r\n        \r\n        etiq = eq_up[<span style=\"color: #008000\">'eq_latex'<\/span>]\r\n        etiq = etiq+<span style=\"color: #008000\">' ; ['<\/span>+<span style=\"color: #FF00FF\">str<\/span>(<span style=\"color: #FF00FF\">int<\/span>(a))+<span style=\"color: #008000\">','<\/span>+<span style=\"color: #FF00FF\">str<\/span>(<span style=\"color: #FF00FF\">int<\/span>(b))+<span style=\"color: #008000\">']'<\/span>\r\n        graf[0].plot(xi,fi_up, label = etiq,\r\n                     color=<span style=\"color: #008000\">'blue'<\/span>, linestyle=<span style=\"color: #008000\">'dashed'<\/span>)\r\n\r\n        etiq = eq_down[<span style=\"color: #008000\">'eq_latex'<\/span>]\r\n        etiq = etiq+<span style=\"color: #008000\">' ; ['<\/span>+<span style=\"color: #FF00FF\">str<\/span>(<span style=\"color: #FF00FF\">int<\/span>(a))+<span style=\"color: #008000\">','<\/span>+<span style=\"color: #FF00FF\">str<\/span>(<span style=\"color: #FF00FF\">int<\/span>(b))+<span style=\"color: #008000\">']'<\/span>\r\n        graf[1].plot(xi,fi_down, label = etiq,\r\n                     color=<span style=\"color: #008000\">'brown'<\/span>,linestyle=<span style=\"color: #008000\">'dashed'<\/span>)\r\n\r\n<span style=\"color: #ff0000\"># ajuste de eje y<\/span>\r\ny_min = np.min([piso_up.min(),piso_down.min()])\r\ny_max = np.max([techo_up.max(),techo_down.max()])\r\n<span style=\"color: #d35400\">if<\/span> y_min&lt;-135:\r\n    y_min = -135\r\n<span style=\"color: #ff0000\">#graf[0].set_ylim(y_min,y_max)<\/span>\r\n<span style=\"color: #ff0000\">#graf[1].set_ylim(y_min,y_max)<\/span>\r\nplt.tight_layout()\r\n\r\nunarchivo = carpeta_rsm+<span style=\"color: #008000\">'\/ecuacion_segmentos_'<\/span>+arch_nombre+<span style=\"color: #008000\">'.png'<\/span>\r\nfig_gradnt.savefig(unarchivo)\r\n\r\nplt.show()\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Para los diferentes entornos donde se propaga la se\u00f1al, se diferencian por segmentos (fronteras) delimitados en metros desde el gateway. El desnivel del terreno que existe aproximandamente a 90 mts desde el gateway tiene una secci\u00f3n de \"sombra\" en donde no se usar\u00e1n los valores para generar el modelo. por lo que el segundo segmento &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/blog.espol.edu.ec\/girni\/lorawan-linealiza-segmentos\/\" class=\"more-link\">Continuar leyendo<span class=\"screen-reader-text\"> \"6. LoRaWan - Linealiza por segmentos\"<\/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":[1466681],"tags":[],"class_list":["post-3901","post","type-post","status-publish","format-standard","hentry","category-lorawan-registro-de-estados"],"_links":{"self":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/3901","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=3901"}],"version-history":[{"count":7,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/3901\/revisions"}],"predecessor-version":[{"id":4009,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/3901\/revisions\/4009"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/media?parent=3901"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/categories?post=3901"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/tags?post=3901"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}