{"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":"2026-08-04T10:54:21","modified_gmt":"2026-08-04T15:54:21","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":"\n<p>Para los diferentes entornos donde se propaga la se\u00f1al, se diferencian por segmentos (fronteras) delimitados en metros desde el gateway.<\/p>\n\n\n\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\n\n\n<pre class=\"wp-block-code\"><code>frontera = &#091;0,90,125,250] # metros \nfrontera_usar = &#091;1,0,1] # usar<\/code><\/pre>\n\n\n\n<p>Usando estos par\u00e1metros y reordenando el algoritmo anterior para ser usado en cada segmento, se obtiene el siguiente resultado<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/ecuacion_segmentos_c_Maiz.png\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"480\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/ecuacion_segmentos_c_Maiz.png\" alt=\"\" class=\"wp-image-3907\" 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><\/figure>\n\n\n\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\n\n\n<p>Los detalles de cada ecuaci\u00f3n por segmentos son:<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code> ---- segmento: 0\n                                            ecuacion_up                             ecuacion_down\nalpha                                          2.579875                                  2.366443\nbeta                                         -25.528314                                -27.974302\neq_latex          $ rssi = -10(2.58)log_{10}(d)-25.53 $     $ rssi = -10(2.37)log_{10}(d)-27.97 $\nintervalox                                 &#091;1.0, 86.05]                              &#091;1.0, 86.05]\nerror_medio                                     6.17513                                  6.495915\nerror_std                                      7.697343                                  7.230741\neqg_latex       $ d = 10^{(-25.53 - rssi)\/(10(2.58))} $   $ d = 10^{(-27.97 - rssi)\/(10(2.37))} $\nintervaloy    &#091;-90.48339483394834, -25.745454545454542]  &#091;-82.15682656826569, -26.98787878787879]\nerrorx_medio                                  43.575249                                 35.657177\nerrorx_std                                    89.139552                                 50.786448\n\n ---- segmento: 1\n                                           ecuacion_up                             ecuacion_down\nalpha                                         7.068273                                  6.777292\nbeta                                         61.310998                                 57.364631\neq_latex         $ rssi = -10(7.07)log_{10}(d)+61.31 $     $ rssi = -10(6.78)log_{10}(d)+57.36 $\nintervalox                             &#091;86.05, 124.08]                           &#091;86.05, 124.08]\nerror_medio                                        0.0                                       0.0\nerror_std                                          0.0                                       0.0\neqg_latex       $ d = 10^{(61.31 - rssi)\/(10(7.07))} $    $ d = 10^{(57.36 - rssi)\/(10(6.78))} $\nintervaloy    &#091;-86.67755403724453, -75.44247020329829]  &#091;-84.53164627778156, -73.75907940898257]\nerrorx_medio                                       0.0                                       0.0\nerrorx_std                                         0.0                                       0.0\n\n ---- segmento: 2\n                                            ecuacion_up                             ecuacion_down\nalpha                                          4.082007                                  4.159709\nbeta                                          -1.212499                                  2.560248\neq_latex           $ rssi = -10(4.08)log_{10}(d)-1.21 $      $ rssi = -10(4.16)log_{10}(d)+2.56 $\nintervalox                             &#091;124.08, 238.66]                          &#091;126.91, 235.77]\nerror_medio                                    3.623762                                  3.887403\nerror_std                                      4.452527                                  4.535259\neqg_latex        $ d = 10^{(-1.21 - rssi)\/(10(4.08))} $     $ d = 10^{(2.56 - rssi)\/(10(4.16))} $\nintervaloy    &#091;-105.64163822525596, -81.32270916334662]  &#091;-99.64505119453923, -80.30278884462152]\nerrorx_medio                                  39.417734                                 39.102089\nerrorx_std                                     52.33983                                 45.251062<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">Instrucciones en Python<\/h2>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# ecuaci\u00f3n por m\u00ednimos cuadrados de una ruta por segmentos\n# usando las medidas y distancia al gateway de cada punto\n# Revision 2022\/07\/23\n# http:\/\/blog.espol.edu.ec\/girni\/\n\nimport numpy as np\nimport pandas as pd\nimport os\nimport json\nimport matplotlib.pyplot as plt\nimport girni_lorawan_lib as girni\n\n# INGRESO\ncarpeta_rsm = &quot;resultado_c_Maiz_todo&quot;\nfrontera = &#x5B;0,90,125,250] # metros\nsegmento_usar =  &#x5B;1,0,1] # usar\n\narch_var_general = 'variables_generales.txt'\n\n# PROCEDIMIENTO\n# carga variables desde archivos\nwith open(arch_var_general) as linea:\n    texto = linea.read()\nvar_gen = json.loads(texto)\nglobals().update(var_gen)\n\npartes = carpeta_rsm.strip('\/').split('_')\narch_nombre = partes&#x5B;1]+'_'+partes&#x5B;2]\n\ndef linealiza_preparadatos(carpeta_rsm,arch_coord,var_gen):\n    ''' desarrolla la ecuaci\u00f3n para un gradiente\n    '''\n    var_gen&#x5B;'movAvg_cual'] = &#x5B;2,4] #cada cuantas muestras\n    partes = carpeta_rsm.strip('\/').split('_')\n    arch_nombre = partes&#x5B;1]+'_'+partes&#x5B;2]\n\n    carp_coord = var_gen&#x5B;'carp_coord']\n    medida = var_gen&#x5B;'medida']\n    precision = var_gen&#x5B;'precision']\n    \n    # lee coordenadas y su distancia al gateway\n    dist_Gtw = girni.coordenadas_leer(arch_coord,carp_coord)\n\n    # lista.txt de archivos a usar\n    arch_lista = medida+&quot;_&quot;+arch_nombre+&quot;_lista.txt&quot;\n    archivo_ruta  = carpeta_rsm + '\/' + arch_lista\n    archivoexiste = os.path.exists(archivo_ruta)\n    if not(archivoexiste):\n        puntoUsar_Colum = &#x5B;'punto', 'up', 'down'] \n        puntoUsar_Tipos = {'punto' : 'object',\n                           'up'   : 'int64',\n                           'down' : 'int64'}\n        puntoUsar = pd.DataFrame(columns = puntoUsar_Colum)\n        puntoUsar = puntoUsar.astype(dtype = puntoUsar_Tipos)\n        for unarchivo in os.listdir(carpeta_rsm):\n            verifica = unarchivo.startswith('describe_')\n            verifica = verifica and unarchivo.endswith('.csv')\n            if verifica:\n                partes  = unarchivo.strip('.csv').split('_')\n                unpunto = partes&#x5B;2]\n                puntodato = {'punto' : unpunto,\n                             'up' : 1,\n                             'down' : 1}\n                puntodato = pd.DataFrame(&#x5B;puntodato])\n                puntoUsar = pd.concat(&#x5B;puntoUsar,\n                                       puntodato],\n                                      ignore_index = True)\n        puntoUsar = puntoUsar.set_index('punto')\n        puntoUsar.to_csv(archivo_ruta)\n    # usa lista.txt de archivos seleccionados 1 \u00f3 0 para enlace up,down\n    if (archivoexiste):\n        puntoUsar = pd.read_csv(archivo_ruta)\n        puntoUsar = puntoUsar.set_index('punto')\n      \n    # Datos para gr\u00e1fica desde lista.txt\n    punto_columnas = &#x5B;'codigopunto','dist_Gtw',\n                      medida+'_up',medida+'_up'+'_std',\n                      'usar_up',medida+'_down',\n                      medida+'_down'+'_std',\n                      'usar_down','dispositivo']\n    punto_tipos = {'codigopunto': 'object',\n                   'dist_Gtw'   : 'float64',\n                   medida+'_up' : 'float64',\n                   medida+'_up'+'_std': 'float64',\n                   'usar_up' : 'int64',\n                   medida+'_down': 'float64',\n                   medida+'_down'+'_std' :'float64',\n                   'usar_down' : 'int64',\n                   'dispositivo': 'object'}\n    punto_graf = pd.DataFrame(columns=punto_columnas)\n    punto_graf = punto_graf.astype(dtype=punto_tipos)\n    puntoSinDist = &#x5B;]\n    for unarchivo in os.listdir(carpeta_rsm):\n        if unarchivo.startswith('describe_'):\n            codigopunto = unarchivo.strip('.csv').split('_')&#x5B;2]\n            \n            # lectura del archivo\n            unresumen  = carpeta_rsm+'\/'+unarchivo\n            descriptor = pd.read_csv(unresumen,index_col='Unnamed: 0')\n\n            if (codigopunto in dist_Gtw.index):\n                undato = {'codigopunto': codigopunto,\n                          'dist_Gtw'   : dist_Gtw&#x5B;codigopunto],\n                          medida+'_up' : descriptor&#x5B;'rssi_up']&#x5B;'mean'],\n                          medida+'_up'+'_std': descriptor&#x5B;'rssi_up']&#x5B;'std'],\n                          'usar_up' : puntoUsar&#x5B;'up']&#x5B;codigopunto],\n                          medida+'_down': descriptor&#x5B;'rssi_down']&#x5B;'mean'],\n                          medida+'_down'+'_std' :descriptor&#x5B;'rssi_down']&#x5B;'std'],\n                          'usar_down' : puntoUsar&#x5B;'down']&#x5B;codigopunto],\n                          'dispositivo': descriptor&#x5B;'dispositivo']&#x5B;0]\n                          }\n                undato = pd.DataFrame(&#x5B;undato])\n                punto_graf = pd.concat(&#x5B;punto_graf,undato],\n                                       ignore_index=True)\n            else:\n                puntoSinDist.append(codigopunto)\n            \n    punto_graf = punto_graf.set_index('codigopunto')\n    punto_graf = punto_graf.sort_values('dist_Gtw' )\n\n    return(punto_graf)\n\n\npunto_graf = linealiza_preparadatos(carpeta_rsm,arch_coord,var_gen)\n\n# Segmentos, intervalos de indices en tabla ----------\nextiende   = 15 # metros\nintervalos = &#x5B;]\nintervalos_ext = &#x5B;]\n\nn_sector = len(frontera)\nindices = np.arange(0,len(punto_graf&#x5B;'dist_Gtw']),1)\nfor i in range(0,n_sector-1,1):\n    desde = frontera&#x5B;i]\n    hasta = frontera&#x5B;i+1]\n    \n    # intervalos, indices &#x5B;a,b]\n    sector = (punto_graf&#x5B;'dist_Gtw']&gt;=desde)\n    sector = sector &amp; (punto_graf&#x5B;'dist_Gtw']&lt;hasta)\n    unintervalo = indices&#x5B;sector]\n    a = np.min(unintervalo)\n    if i&gt;0:\n        a = a - 1\n        sector&#x5B;a] = True\n    b = np.max(unintervalo)\n    intervalos.append(&#x5B;a,b])\n    punto_graf&#x5B;'sector_'+str(i)] = sector\n    \n    # intervalos extendidos\n    if (desde-extiende)&gt;0:\n        desde = desde - extiende\n    if (hasta + extiende) &lt; np.max(punto_graf&#x5B;'dist_Gtw']):\n        hasta = hasta + extiende\n    sector_ext = (punto_graf&#x5B;'dist_Gtw']&gt;=desde)\n    sector_ext = sector_ext &amp; (punto_graf&#x5B;'dist_Gtw']&lt;=hasta)\n    unintervalo = indices&#x5B;sector_ext]\n    a = np.min(unintervalo)\n    b = np.max(unintervalo)\n    intervalos_ext.append(&#x5B;a,b])\n    \n\ndef linealiza_segmento(punto_graf,var_gen,segmento=-1):\n    '''estima la ecuacion para cada segmento,\n       usada solo cuando segmento &gt;=0 &#x5B;0,1,2,... ]\n    '''\n    precision = var_gen&#x5B;'precision']\n    resultado  = {}\n    xi = np.array(punto_graf&#x5B;'dist_Gtw'])\n    # enlace up\/down\n    enlaces =&#x5B;'up','down']\n    for unenlace in enlaces:\n        usar = punto_graf&#x5B;'usar_'+unenlace]\n        if segmento&gt;=0:\n            sector = punto_graf&#x5B;'sector_'+str(segmento)]\n            usar   = usar*sector\n        yi = np.array(punto_graf&#x5B;medida+'_'+unenlace])\n        # ecuacion\n        eq = girni.linealiza_lstsq(xi&#x5B;usar==1],\n                                   yi&#x5B;usar==1],\n                                   digitos = precision)\n        alpha = eq&#x5B;'alpha']\n        beta  = eq&#x5B;'beta']\n        fd = lambda d: -10*alpha*(np.log10(d))+beta\n        # puntos de ecuacion en tabla\n        punto_graf&#x5B;'fi_'+unenlace] = fd(xi)\n        resultado&#x5B;'ecuacion_'+unenlace] = eq\n    resultado&#x5B;'tabla'] = punto_graf\n    return (resultado)\n\n# segmentos a usar primero y \u00faltimo  ----------\nprimero   = segmento_usar.index(1)\ninvertido = segmento_usar.copy()\ninvertido.reverse()\nultimo = len(segmento_usar) - invertido.index(1) - 1\n\n# ecuaciones para todos los segmentos\neq_intervalo = {}\ntabla = {}\nfor i in range(0,n_sector-1,1):\n    resultado = linealiza_segmento(punto_graf,var_gen,i)\n    ecuacion = resultado.copy()\n    ecuacion.pop('tabla')\n    ecuacion = pd.DataFrame(ecuacion)\n    eq_intervalo&#x5B;i] = ecuacion\n    tabla&#x5B;i] = resultado&#x5B;'tabla'].copy()\n        \n# intervalos de sombra corrige anteriores\nfor i in range(0,n_sector-1,1):\n    condicion = i&gt;primero and i&lt;ultimo\n    if not(segmento_usar&#x5B;i]) and i&gt;0 and condicion:\n        sector = punto_graf&#x5B;'sector_'+str(i)]\n        # extremos &#x5B;a,b]\n        a = intervalos&#x5B;i-1]&#x5B;1]\n        b = intervalos&#x5B;i]&#x5B;1]\n        # extremo izquierdo a\n        xa_up = tabla&#x5B;i]&#x5B;'dist_Gtw']&#x5B;a]\n        ya_up = tabla&#x5B;i-1]&#x5B;'fi_up']&#x5B;a]\n        ya_down = tabla&#x5B;i-1]&#x5B;'fi_down']&#x5B;a]\n        # extremo derecho b\n        xb_up = tabla&#x5B;i]&#x5B;'dist_Gtw']&#x5B;b]\n        yb_up = tabla&#x5B;i+1]&#x5B;'fi_up']&#x5B;b]\n        yb_down = tabla&#x5B;i+1]&#x5B;'fi_down']&#x5B;b]\n        eq_up = girni.linealiza_lstsq(&#x5B;xa_up,xb_up],\n                                      &#x5B;ya_up,yb_up],\n                                      digitos = precision)\n        eq_down = girni.linealiza_lstsq(&#x5B;xa_up,xb_up],\n                                        &#x5B;ya_down,yb_down],\n                                        digitos = precision)\n        ecuacion = {'ecuacion_up'   : eq_up,\n                    'ecuacion_down' : eq_down}\n        ecuacion = pd.DataFrame(ecuacion)\n        eq_intervalo&#x5B;i] = ecuacion\n        \n# SALIDA\nfor i in range(0,n_sector-1,1):\n    print('\\n ---- segmento:',i)\n    print(eq_intervalo&#x5B;i])\n\ndef graf_gradiente_segmento(arch_nombre,punto_graf,ecuacion,var_gen):\n    ''' grafica de gradiente\n    '''\n    medida = var_gen&#x5B;'medida']\n    precision = var_gen&#x5B;'precision']\n    escalabase = 10    # 10\n    escala = 'log'\n\n    dist = punto_graf&#x5B;'dist_Gtw']\n    # enlace up\/down\n    enlaces = &#x5B;'up','down']\n    colorenlace = &#x5B;'blue','orange']\n    i=0\n    for unenlace in enlaces:\n        # enlace_up\/down\n        media = punto_graf&#x5B;medida+'_'+unenlace]\n        std   = punto_graf&#x5B;medida+'_'+unenlace+'_std']\n        media_techo = media + std\n        media_piso  = media - std\n        yi = np.array(media)\n        fi = punto_graf&#x5B;'fi'+'_'+unenlace]\n\n        usar = punto_graf&#x5B;'usar_'+unenlace]\n        eq = ecuacion&#x5B;'ecuacion_'+unenlace]\n        dyi_std = eq&#x5B;'error_std']\n\n        for j in range(0,len(dist),1):\n            uncolor = colorenlace&#x5B;i]\n            etiqueta = dist.keys()&#x5B;j]\n            if not(usar&#x5B;j]):\n                uncolor = 'red'\n            # medida up\/down +\/- std\n            graf&#x5B;i].scatter(dist&#x5B;j],media&#x5B;j],\n                            color=uncolor,marker='o')\n            graf&#x5B;i].scatter(dist&#x5B;j],media_techo&#x5B;j],\n                            color=uncolor,marker='+')\n            graf&#x5B;i].scatter(dist&#x5B;j],media_piso&#x5B;j],\n                            color=uncolor,marker='+')\n            # etiquetas por punto\n            graf&#x5B;i].annotate(etiqueta,(dist&#x5B;j],yi&#x5B;j]),rotation=45)\n        \n        # linealizado up\/down\n        etiq_gradnt = eq&#x5B;'eq_latex']\n        etiq_gradnt = etiq_gradnt+' ; &#x5B;'+str(int(np.min(dist)))\n        etiq_gradnt = etiq_gradnt+','+str(int(np.max(dist)))+']'\n        graf&#x5B;i].plot(dist,fi,label = etiq_gradnt,color=colorenlace&#x5B;i])\n        graf&#x5B;i].plot(dist,fi+dyi_std,color=colorenlace&#x5B;i],linestyle='dotted')\n        graf&#x5B;i].plot(dist,fi-dyi_std,color=colorenlace&#x5B;i],linestyle='dotted')\n\n        # etiquetado de grafico\n        graf&#x5B;i].set_ylabel(medida+'_'+enlaces&#x5B;i]+' (dBm)',color=colorenlace&#x5B;i])\n        graf&#x5B;i].legend()\n        graf&#x5B;i].grid(True,linestyle='dotted',axis='x', which='both')\n        if i==0:\n            graf&#x5B;0].set_title(arch_nombre+' '+medida)\n        if i==1:\n            graf&#x5B;1].set_xlabel('distancia')\n        i = i + 1\n    return(fig_gradnt)\n\n# grafica gradientes por segmentos\n# para limites en eje y\ntecho_up = pd.DataFrame()\npiso_up  = pd.DataFrame()\ntecho_down = pd.DataFrame()\npiso_down  = pd.DataFrame()\n\ngraf=&#x5B;0,0]\nfig_gradnt,graf = plt.subplots(2,1)\nescalabase = 10    # 10\nescala = 'log'\nif escala == 'log':\n    graf&#x5B;0].set_xscale(escala,base=escalabase)\n    graf&#x5B;1].set_xscale(escala,base=escalabase)\n\n# grafica cada segmento\nfor i in range(0,n_sector-1,1):\n    sector = tabla&#x5B;i]&#x5B;'sector_'+str(i)]\n    punto_grupo = tabla&#x5B;i]&#x5B;sector]\n\n    #enlace_up\n    media_up = punto_grupo&#x5B;medida+'_up']\n    std_up   = eq_intervalo&#x5B;i]&#x5B;'ecuacion_up']&#x5B;'error_std']\n    media_up_techo = media_up + std_up\n    media_up_piso  = media_up - std_up\n    # enlace_down\n    media_down = punto_grupo&#x5B;medida+'_down']\n    std_down   = eq_intervalo&#x5B;i]&#x5B;'ecuacion_up']&#x5B;'error_std']\n    media_down_techo = media_down + std_down\n    media_down_piso  = media_down - std_down\n    \n    techo_up = pd.concat(&#x5B;techo_up,media_up_techo])\n    piso_up  = pd.concat(&#x5B;piso_up,media_up_piso])\n    techo_down = pd.concat(&#x5B;techo_down,media_down_techo])\n    piso_down  = pd.concat(&#x5B;piso_down,media_down_piso])\n\n    if segmento_usar&#x5B;i]:\n        ecuacion = eq_intervalo&#x5B;i]\n        graf_gradiente_segmento(arch_nombre,punto_grupo,ecuacion,var_gen)\n        \n    condicion = i&gt;primero and i&lt;ultimo\n    if not(segmento_usar&#x5B;i]) and i&gt;0 and condicion:\n        a = tabla&#x5B;i]&#x5B;'dist_Gtw']&#x5B;intervalos&#x5B;i]&#x5B;0]]\n        b = tabla&#x5B;i]&#x5B;'dist_Gtw']&#x5B;intervalos&#x5B;i]&#x5B;1]]\n        \n        graf&#x5B;0].axvspan(a,b,alpha=0.5,color='gray')\n        graf&#x5B;1].axvspan(a,b,alpha=0.5,color='gray')\n        \n        # linea intermedia\n        xi = punto_grupo&#x5B;'dist_Gtw']\n        ecuacion = eq_intervalo&#x5B;i]\n        fi_up = punto_grupo&#x5B;'fi_up']\n        fi_down = punto_grupo&#x5B;'fi_down']\n\n        graf&#x5B;0].scatter(xi,media_up,color='blue',marker='o')\n        graf&#x5B;0].scatter(xi,media_up_techo,color='blue',marker='+')\n        graf&#x5B;0].scatter(xi,media_up_piso,color='blue',marker='+')\n        \n        graf&#x5B;1].scatter(xi,media_down,color='orange',marker='o')\n        graf&#x5B;1].scatter(xi,media_down_techo,color='orange',marker='+')\n        graf&#x5B;1].scatter(xi,media_down_piso,color='orange',marker='+')\n\n        alpha_up = eq_up&#x5B;'alpha']\n        beta_up  = eq_up&#x5B;'beta']\n        fd_up = lambda d: -10*alpha_up*(np.log10(d))+beta_up\n        fi_up = fd_up(xi)\n        \n        alpha_down = eq_down&#x5B;'alpha']\n        beta_down  = eq_down&#x5B;'beta']\n        fd_down = lambda d: -10*alpha_down*(np.log10(d))+beta_down\n        fi_down = fd_down(xi)\n        \n        etiq = eq_up&#x5B;'eq_latex']\n        etiq = etiq+' ; &#x5B;'+str(int(a))+','+str(int(b))+']'\n        graf&#x5B;0].plot(xi,fi_up, label = etiq,\n                     color='blue', linestyle='dashed')\n\n        etiq = eq_down&#x5B;'eq_latex']\n        etiq = etiq+' ; &#x5B;'+str(int(a))+','+str(int(b))+']'\n        graf&#x5B;1].plot(xi,fi_down, label = etiq,\n                     color='brown',linestyle='dashed')\n\n# ajuste de eje y\ny_min = np.min(&#x5B;piso_up.min(),piso_down.min()])\ny_max = np.max(&#x5B;techo_up.max(),techo_down.max()])\nif y_min&lt;-135:\n    y_min = -135\n#graf&#x5B;0].set_ylim(y_min,y_max)\n#graf&#x5B;1].set_ylim(y_min,y_max)\nplt.tight_layout()\n\nunarchivo = carpeta_rsm+'\/ecuacion_segmentos_'+arch_nombre+'.png'\nfig_gradnt.savefig(unarchivo)\n\nplt.show()\n<\/pre><\/div>","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","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-propagacion"],"_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":10,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/3901\/revisions"}],"predecessor-version":[{"id":4788,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/3901\/revisions\/4788"}],"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}]}}