{"id":3883,"date":"2021-12-03T10:51:43","date_gmt":"2021-12-03T15:51:43","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/girni\/?p=3883"},"modified":"2026-08-04T10:52:43","modified_gmt":"2026-08-04T15:52:43","slug":"lorawan-linealiza-un-intervalo","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/girni\/lorawan-linealiza-un-intervalo\/","title":{"rendered":"5. LoRaWan - Linealiza un intervalo"},"content":{"rendered":"\n<p><strong>Referencia<\/strong>: Chapra 17.1 p 466. Burden 8.1 p498, <a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/mn-u08\/minimos-cuadrados-con-python\/\">M\u00ednimos cuadrados en M\u00e9todos num\u00e9ricos<\/a><\/p>\n\n\n\n<p>Las descripciones estad\u00edsticas de Rssi obtenidas en cada punto sobre una l\u00ednea de propagaci\u00f3n se usan para estimar el modelo de propagaci\u00f3n para esa ruta.<\/p>\n\n\n\n<p>La ecuaci\u00f3n emp\u00edrica con la que se realiza la primera estimaci\u00f3n se modela como:<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> RSSI(d) = -10 \\alpha \\log_{10} (d) + P_{0} <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> 1&lt;d&lt;L <\/span>\n\n\n\n<p>La ruta de ejemplo sigue la direcci\u00f3n desde el gateway (Gw03) hacia una parcela de plantaci\u00f3n de ma\u00edz (MA##) en la parte superior izquierda de la imagen. se a\u00f1ade la primera secci\u00f3n (M0##)\u00a0 para cubrir todo el segmento de propagaci\u00f3n desde el gateway.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/LoRaWanUnGradiente01.png\"><img loading=\"lazy\" decoding=\"async\" width=\"576\" height=\"511\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/LoRaWanUnGradiente01.png\" alt=\"\" class=\"wp-image-3884\" srcset=\"https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/LoRaWanUnGradiente01.png 576w, https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/LoRaWanUnGradiente01-300x266.png 300w\" sizes=\"auto, (max-width: 576px) 100vw, 576px\" \/><\/a><\/figure>\n\n\n\n<p>La imagen presentada representa la ruta c_MA, la letra \"c\" identifica el modelo de dispositivo usado (c: c\u00e1psula, m: m\u00f3dulo)<\/p>\n\n\n\n<p>Los valores de Rssi_media en cada punto, tanto los enlaces de subida (up) y bajada (down), se linealizan por el m\u00e9todo de los m\u00ednimos cuadrados usando la distancia como variable independiente.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/LoRaWanUnGradienteRssi02.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1089\" height=\"624\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/LoRaWanUnGradienteRssi02.png\" alt=\"\" class=\"wp-image-3886\" srcset=\"https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/LoRaWanUnGradienteRssi02.png 1089w, https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/LoRaWanUnGradienteRssi02-300x172.png 300w, https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/LoRaWanUnGradienteRssi02-768x440.png 768w, https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/LoRaWanUnGradienteRssi02-1024x587.png 1024w\" sizes=\"auto, (max-width: 1089px) 100vw, 1089px\" \/><\/a><\/figure>\n\n\n\n<p>En cada punto Rssi se a\u00f1aden las marcas '+' que representan media+std y media-std.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Mejorando el modelo<\/h2>\n\n\n\n<p>Las perdidas de se\u00f1al desde el gateway aumentan con la distancia, siendo m\u00e1s grandes al final del segmento para el canal de bajada (down), mostrando una mayor desviaci\u00f3n est\u00e1ndar (std) que afectan al modelo. Para discriminar los puntos que no representan una buena cobertura, se utiliza una gr\u00e1fica de desviaciones est\u00e1ndar, donde los valores fuera de rango no se usan en el modelo.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/LoRaWanUnGradienteStd03.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1078\" height=\"630\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/LoRaWanUnGradienteStd03.png\" alt=\"\" class=\"wp-image-3888\" srcset=\"https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/LoRaWanUnGradienteStd03.png 1078w, https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/LoRaWanUnGradienteStd03-300x175.png 300w, https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/LoRaWanUnGradienteStd03-768x449.png 768w, https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/LoRaWanUnGradienteStd03-1024x598.png 1024w\" sizes=\"auto, (max-width: 1078px) 100vw, 1078px\" \/><\/a><\/figure>\n\n\n\n<p>La selecci\u00f3n de los puntos que incluyen en el modelo se realiza en el archivo \"rssi_c_MA_lista.txt\"<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>punto,up,down\nM001,1,1\nM002,1,1\nM003,1,1\nM004,1,1\nM005,1,1\nM006,1,1\nM007,1,1\nMA03,1,0\nMA04,1,1\nMA05,1,1\nMA06,1,1\nMA07,1,1\nMA08,1,0\nMA09,1,0\nMA10,1,0\nRef01,1,1<\/code><\/pre>\n\n\n\n<p>En el archivo se muestra que los puntos MA03, MA08, MA09, MA10 no se usan para el enlace de bajada (down).<\/p>\n\n\n\n<p>Se guarda el archivo de selecci\u00f3n con la configuraci\u00f3n, y se vuelve a ejecutar el algoritmo, y se obtiene el modelo mejorado de p\u00e9rdidas de propagaci\u00f3n:<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code> ecuaciones: \n                                        ecuacion_up                             ecuacion_down\nalpha                                         3.01                                      2.58\nbeta                                        -21.37                                    -25.98\ncoef_correlacion                             -0.94                                     -0.93\ncoef_determinacion                            0.88                                      0.86\neq_latex     $ rssi = -10(3.01)log_{10}(d)-21.37 $     $ rssi = -10(2.58)log_{10}(d)-25.98 $\nintervalox                           &#091;1.0, 233.86]                             &#091;1.0, 198.31]\nerror_medio                                   5.82                                      5.64\nerror_std                                     6.63                                      6.46\neqg_latex  $ d = 10^{(-21.37 - rssi)\/(10(3.01))} $   $ d = 10^{(-25.98 - rssi)\/(10(2.58))} $\nintervaloy                        &#091;-97.87, -25.75]                          &#091;-87.68, -26.99]\nerrorx_medio                                 43.32                                     37.68\nerrorx_std                                   56.01                                     47.11\n<\/code><\/pre>\n\n\n\n<p>Una forma complementaria para observar los puntos \"aberrantes\" o fuera de rango es observar en cada punto la diferencia entre las medias del enlace de subida y el de bajada, donde se destaca que los valores se encuentran muy separados.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/LoRaWanUnGradienteDif_Media04.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1304\" height=\"711\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/LoRaWanUnGradienteDif_Media04.png\" alt=\"\" class=\"wp-image-3889\" srcset=\"https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/LoRaWanUnGradienteDif_Media04.png 1304w, https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/LoRaWanUnGradienteDif_Media04-300x164.png 300w, https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/LoRaWanUnGradienteDif_Media04-768x419.png 768w, https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/12\/LoRaWanUnGradienteDif_Media04-1024x558.png 1024w\" sizes=\"auto, (max-width: 1304px) 100vw, 1304px\" \/><\/a><\/figure>\n\n\n\n<p>Las gr\u00e1ficas se realizan en bloques como funciones (def), a fin de activarlas o no durante el an\u00e1lisis detallado, adem\u00e1s de incorporarlas a la librer\u00eda girni_lorawan_lib.py<\/p>\n\n\n\n<p>Las rutas posibles para este ejercicio se dan por medio de \"carpeta_rsm\", que es el directorio donde se encuentran los archivos con los detalles de cada punto.<\/p>\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\n<p>Algunos par\u00e1metros se repiten entre algoritmos, por lo que se los ha separado en un archivo de texto 'variables_generales.txt'.<\/p>\n\n\n\n<p>El contenido de las 'variables_generales.txt' se muestra a continuaci\u00f3n:<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>{\"carpeta_DB\"  : \"BaseDatosJSON\",\n \"medida\"         : \"rssi\",\n \"medida_unidad\"  : \"dBm\",\n \"medida_normal\"  : &#091;-250,-1],\n \"medida_grafica\" : &#091;-100,-60],\n \"movAvg_cual\"    : &#091;8,16],\n \"movAvg_color\"   : &#091;\"lightgreen\",\"orange\"],\n \"precision\"  : 2,\n \"gatewayDB\"  : {\"uCfr\/\/5zvhk=\":\"Gw01\",\n                 \"uCfr\/\/4dylc=\":\"Gw03\"},\n \"arch_coord\" : \"coord_puntos.csv\",\n \"carp_coord\" : \"coordenadas\",\n \"zonaNum\"    : 17,\n \"zonaLetra\"  : \"M\",\n \"alturaGw\"   : 8,\n \"alturapunto\": 1,\n \"nFres\"      : 1,\n \"freq\"       : 915,\n \"muestras\"   : 41,\n \"guarda\"     : 1\n}<\/code><\/pre>\n\n\n\n<p>Con lo que las instrucciones en Python quedan como:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# Obtiene ecuaci\u00f3n por m\u00ednimos cuadrados de una ruta\n# usando las medidas y distancia al gateway de cada punto\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;\narch_coord  = &quot;coord_puntos.csv&quot;\narch_var_general = &quot;variables_generales.txt&quot;\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\nvar_gen&#x5B;'movAvg_cual'] = &#x5B;2,4] #cada cuantas muestras\n\npartes = carpeta_rsm.strip('\/').split('_')\narch_nombre = partes&#x5B;1]+'_'+partes&#x5B;2]\n\ndef coordenadas_leer(arch_coord,carp_coord):\n    ''' lista las coordenadas desde un archivo\n        ubicado en la carpeta\n    '''\n    if len(carp_coord)&gt;0:\n        carp_coord = carp_coord+'\/'\n    archivo_ruta = carp_coord+arch_coord\n    arch_coord_existe = os.path.exists(archivo_ruta)\n\n    if arch_coord_existe:\n        puntos = pd.read_csv(archivo_ruta,index_col='punto')\n        # busca gateway y ubicaci\u00f3n de punto observado\n        Gw_nombre = ''\n        for unpunto in puntos.index:\n            if unpunto.startswith('Gw'):\n                Gw_nombre = unpunto\n        dist_Gtw = puntos&#x5B;'dist_'+Gw_nombre]   \n    else:\n        print(' ERROR: NO se encuentra el archivo...')\n        print('        revise el ruta\/nombre de archivo. ')\n    return(dist_Gtw)\n\ndist_Gtw = coordenadas_leer(arch_coord,carp_coord)\n\n# crea lista archivos a usar si no existe\narch_lista = medida+&quot;_&quot;+arch_nombre+&quot;_lista.txt&quot;\narchivo_ruta  = carpeta_rsm + '\/' + arch_lista\narchivoexiste = os.path.exists(archivo_ruta)\nif 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\nif (archivoexiste):\n    puntoUsar = pd.read_csv(archivo_ruta)\n    puntoUsar = puntoUsar.set_index('punto')\n  \n# Analiza cada punto en lista\npunto_columnas = &#x5B;'codigopunto','dist_Gtw',\n                  medida+'_up',medida+'_up'+'_std',\n                  'usar_up',medida+'_down',\n                  medida+'_down'+'_std',\n                  'usar_down','dispositivo']\npunto_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'}\npunto_graf = pd.DataFrame(columns=punto_columnas)\npunto_graf = punto_graf.astype(dtype=punto_tipos)\npuntoSinDist =&#x5B;]\nfor 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        # Para Grafica\n        condicion = (codigopunto in dist_Gtw.index)\n        if condicion:\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)\npunto_graf = punto_graf.set_index('codigopunto')\npunto_graf = punto_graf.sort_values('dist_Gtw' )\n\n# selecciona datos\ndist = punto_graf&#x5B;'dist_Gtw']\nusar_up = punto_graf&#x5B;'usar_up']\nusar_down = punto_graf&#x5B;'usar_down']\n\n# Eje x en log10()\nxi = np.array(dist)\n\n# enlace_up\nmedia_up = punto_graf&#x5B;medida+'_up']\nstd_up   = punto_graf&#x5B;medida+'_up'+'_std']\nmedia_up_techo = media_up + std_up\nmedia_up_piso  = media_up - std_up\n\n# ecuacion Enlace up\nyi_up = np.array(media_up)\neq_up = girni.linealiza_lstsq(xi&#x5B;usar_up==1],\n                              yi_up&#x5B;usar_up==1],\n                              digitos = precision)\nalpha_up = eq_up&#x5B;'alpha']\nbeta_up  = eq_up&#x5B;'beta']\nfd_up = lambda d: -10*alpha_up*(np.log10(d))+beta_up\n\n# Errores up respecto a ecuacion\nfi_up = fd_up(xi)\ndyi0std  = eq_up&#x5B;'error_std']\npunto_graf&#x5B;'fi_up'] = fi_up\n\n# enlace_down\nmedia_down = punto_graf&#x5B;medida+'_down']\nstd_down   = punto_graf&#x5B;medida+'_down'+'_std']\nmedia_down_techo = media_down + std_down\nmedia_down_piso  = media_down - std_down\n\n# ecuaci\u00f3n Enlace down\nyi_down = np.array(media_down)\neq_down = girni.linealiza_lstsq(xi&#x5B;usar_down==1],\n                                yi_down&#x5B;usar_down==1],\n                                digitos = precision)\nalpha_down = eq_down&#x5B;'alpha']\nbeta_down  = eq_down&#x5B;'beta']\nfd_down = lambda d: -10*alpha_down*(np.log10(d))+beta_down\n\n# Errores down respecto a ecuacion\nfi_down = fd_down(xi)\ndyi1std = eq_down&#x5B;'error_std']\npunto_graf&#x5B;'fi_down'] = fi_down\n\nresultado = {'tabla'        : punto_graf,\n             'ecuacion_up'  : eq_up,\n             'ecuacion_down': eq_down}\n\necuacion = resultado.copy()\necuacion.pop('tabla')\necuacion = pd.DataFrame(ecuacion)\n\n# SALIDA\npd.options.display.float_format = '{:,.2f}'.format\nprint(resultado&#x5B;'tabla'])\nprint('\\n ecuaciones: ')\nprint(ecuacion)\nif len(puntoSinDist)&gt;0:\n    print('\\n Error: Puntos que no registran distancia en coordenadas:')\n    print(puntoSinDist)\n\n# graba la tabla resumen rssi\nunresumen = carpeta_rsm+'\/'+medida+'_'+arch_nombre+'.csv'\nresultado&#x5B;'tabla'].to_csv(unresumen)\n\ndef graf_gradiente(arch_nombre,punto_graf,ecuacion,var_gen):\n    ''' grafica de un gradiente\n    '''\n    escalabase = 10    # 10\n    escala = 'log'\n    medida = var_gen&#x5B;'medida']\n    precision = var_gen&#x5B;'precision']\n\n    # enlace_up\n    media_up = punto_graf&#x5B;medida+'_up']\n    std_up   = punto_graf&#x5B;medida+'_up'+'_std']\n    media_up_techo = media_up + std_up\n    media_up_piso  = media_up - std_up\n    yi_up = np.array(media_up)\n    fi_up = punto_graf&#x5B;'fi_up']\n\n    # enlace_down\n    media_down = punto_graf&#x5B;medida+'_down']\n    std_down   = punto_graf&#x5B;medida+'_down'+'_std']\n    media_down_techo = media_down + std_down\n    media_down_piso  = media_down - std_down\n    yi_down = np.array(media_down)\n    fi_down = punto_graf&#x5B;'fi_down']\n\n    dist = punto_graf&#x5B;'dist_Gtw']\n    usar_up = punto_graf&#x5B;'usar_up']\n    usar_down = punto_graf&#x5B;'usar_down']\n\n    eq_up = ecuacion&#x5B;'ecuacion_up']\n    eq_down = ecuacion&#x5B;'ecuacion_down']\n\n    dyi0std = eq_up&#x5B;'error_std']\n    dyi1std = eq_down&#x5B;'error_std']\n\n    fig_gradnt,(graf_up,graf_down) = plt.subplots(2,1)\n    if escala == 'log':\n        graf_up.set_xscale(escala,base=escalabase)\n        graf_down.set_xscale(escala,base=escalabase)\n\n    # medida up +\/- std\n    graf_up.scatter(dist,media_up,color='blue',marker='o')\n    graf_up.scatter(dist,media_up_techo,color='blue',marker='+')\n    graf_up.scatter(dist,media_up_piso,color='blue',marker='+')\n\n    # medida down +\/- std\n    graf_down.scatter(dist,media_down,color='orange',marker='o')\n    graf_down.scatter(dist,media_down_techo,color='orange',marker='+')\n    graf_down.scatter(dist,media_down_piso,color='orange',marker='+')\n\n    # linealizado up\n    graf_up.plot(dist,fi_up,label = '  up:'+eq_up&#x5B;'eq_latex'],\n                 color='blue')\n    graf_up.plot(dist,fi_up+dyi0std,\n                 color='blue',linestyle='dotted')\n    graf_up.plot(dist,fi_up-dyi0std,\n                 color='blue',linestyle='dotted')\n    # linealizado down\n    graf_down.plot(dist,fi_down,label = 'down:'+eq_down&#x5B;'eq_latex'],\n                   color='orange')\n    graf_down.plot(dist,fi_down+dyi1std,\n                   color='orange',linestyle='dotted')\n    graf_down.plot(dist,fi_down-dyi1std,\n                   color='orange',linestyle='dotted')\n\n    # ajuste de eje y\n    y_min = np.min(&#x5B;np.min(media_up_piso),np.min(media_down_piso)])\n    y_max = np.max(&#x5B;np.max(fi_up+dyi0std),np.max(fi_down+dyi1std)])\n    if y_min&lt;-135:\n        y_min = np.min(&#x5B;np.min(&#x5B;media_up]),np.min(&#x5B;media_down])])\n    graf_up.set_ylim(y_min,y_max)\n    graf_down.set_ylim(y_min,y_max)\n\n    # etiquetas up\n    for unpunto in punto_graf.index:\n        media_etiq = np.round(punto_graf&#x5B;medida+'_up']&#x5B;unpunto],precision)\n        usarpunto  = punto_graf&#x5B;'usar_up']&#x5B;unpunto]\n        \n        etiqueta = unpunto #+str(media_etiq)\n        xi = punto_graf&#x5B;'dist_Gtw']&#x5B;unpunto]\n        yi = punto_graf&#x5B;'rssi_up']&#x5B;unpunto]\n        if usarpunto:\n            graf_up.annotate(etiqueta,(xi,yi), rotation=45)\n        if not(usarpunto):\n            graf_up.annotate(etiqueta,(xi,yi), rotation=45,color='red')\n            graf_up.scatter(dist&#x5B;unpunto],media_up&#x5B;unpunto],color='red',marker='o')\n            graf_up.scatter(dist&#x5B;unpunto],media_up_techo&#x5B;unpunto],\n                            color='red',marker='+')\n\n    # etiquetas down\n    for unpunto in punto_graf.index:\n        media_etiq = np.round(punto_graf&#x5B;medida+'_down']&#x5B;unpunto],precision)\n        usarpunto = punto_graf&#x5B;'usar_down']&#x5B;unpunto]\n        etiqueta = unpunto #+str(media_etiq)\n        xi = punto_graf&#x5B;'dist_Gtw']&#x5B;unpunto]\n        yi = punto_graf&#x5B;'rssi_down']&#x5B;unpunto]\n        if usarpunto:\n            graf_down.annotate(etiqueta,(xi,yi), rotation=45)\n        if not(usarpunto):\n            graf_down.annotate(etiqueta,(xi,yi), rotation=45,color='red')\n            graf_down.scatter(dist&#x5B;unpunto],media_down&#x5B;unpunto],color='red',marker='o')\n            graf_down.scatter(dist&#x5B;unpunto],media_down_techo&#x5B;unpunto],\n                              color='red',marker='+')\n\n    graf_up.set_ylabel(medida+'_up (dBm)',color='blue')\n    graf_up.set_title(arch_nombre+' '+medida)\n    graf_up.legend()\n    graf_up.grid(True,linestyle='dotted',\n                 axis='x', which='both')\n\n    graf_down.set_xlabel('distancia')\n    graf_down.set_ylabel(medida+'_down (dBm)',color='brown')\n    graf_down.legend()\n    graf_down.grid(True,linestyle='dotted',\n                   axis='x', which='both')\n    return(fig_gradnt)\n\n\ndef graf_diferencia_updown(arch_nombre,punto_graf,var_gen):\n    '''Grafica de diferencias up-down\n    '''\n    medida = var_gen&#x5B;'medida']\n    medida_unidad = var_gen&#x5B;'medida_unidad']\n    movAvg_cual = var_gen&#x5B;'movAvg_cual']\n    movAvg_color = var_gen&#x5B;'movAvg_color']\n    precision = var_gen&#x5B;'precision']\n\n    # analiza diferencias de medias y std --------------\n    punto_graf&#x5B;'usar_dif'] = punto_graf&#x5B;'usar_up']*punto_graf&#x5B;'usar_down']\n    usar_dif = punto_graf&#x5B;'usar_dif']\n    punto_graf&#x5B;'dif_mean'] = punto_graf&#x5B;'rssi_up']-punto_graf&#x5B;'rssi_down']\n    punto_graf&#x5B;'dif_std']  = punto_graf&#x5B;medida+'_up_std']-punto_graf&#x5B;medida+'_down_std']\n    punto_graf&#x5B;'dif_top']  = punto_graf&#x5B;'dif_mean']+punto_graf&#x5B;'dif_std']\n    punto_graf&#x5B;'dif_bottom'] = punto_graf&#x5B;'dif_mean']-punto_graf&#x5B;'dif_std']\n\n    dist = punto_graf&#x5B;'dist_Gtw']\n    usar_dif = punto_graf&#x5B;'usar_dif']\n\n    # linealiza diferencia\n    xi_dif = np.array(punto_graf&#x5B;'dist_Gtw']&#x5B;usar_dif==1])\n    yi_dif = np.array(punto_graf&#x5B;'dif_mean']&#x5B;usar_dif==1])\n    eq_dif = girni.linealiza_lstsq(xi_dif,yi_dif,digitos = precision)\n    alpha_dif = eq_dif&#x5B;'alpha']\n    beta_dif  = eq_dif&#x5B;'beta']\n    fdistdif0 = lambda d: -10*alpha_dif*(np.log10(d))+beta_dif\n    yi_dif0   = fdistdif0(xi_dif)\n\n    ecua_dif = pd.DataFrame(eq_dif)\n\n    # medias moviles en movAvg_cual&#x5B;]\n    serie_media  = pd.Series(punto_graf&#x5B;'dif_mean']&#x5B;usar_dif==1])\n    movAvg_dmedia = &#x5B;]\n    m = len(movAvg_cual)\n    for j in range(0,m,1):\n        k = movAvg_cual&#x5B;j]\n        movAvg_dmedia.append(serie_media.rolling(k).mean())\n\n    # Grafica diferencia\n    escalabase = 10    # 10\n    escala = 'log'\n    \n    fig_dif_updown,graf_dmean = plt.subplots()\n    if escala == 'log':\n        graf_dmean.set_xscale(escala,base=escalabase)\n\n    # diferencia medida up - down\n    graf_dmean.scatter(dist,punto_graf&#x5B;'dif_mean'],color='purple',marker='o')\n    graf_dmean.plot(xi_dif,yi_dif0,label = '  dif:'+eq_dif&#x5B;'eq_latex'],color='blue')\n    graf_dmean.set_ylabel('media Up-Down (dBm)')\n\n    # medida_up, medias m\u00f3viles\n    for j in range(0,m,1):\n        k = str(movAvg_cual&#x5B;j])\n        graf_dmean.plot(dist&#x5B;usar_dif==1],movAvg_dmedia&#x5B;j],\n                      label='movAvg_dmedia_'+k,color=movAvg_color&#x5B;j])\n\n    # etiquetas\n    i=0\n    for unpunto in punto_graf.index:\n        media_etiq = np.round(punto_graf&#x5B;medida+'_up']&#x5B;unpunto],precision)\n        etiqueta = unpunto # + ' ' +str(media_etiq)\n        usar_dif = punto_graf&#x5B;'usar_dif']&#x5B;unpunto]\n        xi = punto_graf&#x5B;'dist_Gtw']&#x5B;unpunto]\n        yi = punto_graf.iloc&#x5B;i]&#x5B;'dif_mean']\n        i = i+1\n        if usar_dif:\n            graf_dmean.annotate(etiqueta,(xi,yi), rotation=30)\n        if not(usar_dif):\n            graf_dmean.annotate(etiqueta,(xi,yi),color='red',rotation=30)\n            graf_dmean.scatter(xi,yi,color='red',marker='o')\n\n    graf_dmean.axhline(0,color='grey')\n    graf_dmean.grid(True,linestyle='dotted',axis='x', which='both')\n\n    graf_dmean.legend()\n    graf_dmean.set_title(arch_nombre+': '+medida+' media Up-Down')\n    return(fig_dif_updown)\n\ndef graf_gradiente_std(arch_nombre,punto_graf,medida,precision):\n    ''' Grafica de std_up y std_down ------\n    '''\n    xi_std      = np.array(punto_graf&#x5B;'dist_Gtw'])\n    yi_std_up   = np.array(punto_graf&#x5B;medida+'_up_std'])\n    yi_std_down = np.array(punto_graf&#x5B;medida+'_down_std'])\n\n    # linealiza std\n    usar_up   = punto_graf&#x5B;'usar_up']\n    usar_down = punto_graf&#x5B;'usar_down']\n\n    eq_std_up = girni.linealiza_lstsq(xi_std&#x5B;usar_up==1],\n                                      yi_std_up&#x5B;usar_up==1],\n                                      digitos = precision)\n    alpha_std_up = eq_std_up&#x5B;'alpha']\n    beta_std_up  = eq_std_up&#x5B;'beta']\n    fdiststd_up0 = lambda d: -10*alpha_std_up*(np.log10(d))+beta_std_up\n    yi_std_up0   = fdiststd_up0(xi_std)\n\n    eq_std_down = girni.linealiza_lstsq(xi_std&#x5B;usar_down==1],\n                                        yi_std_down&#x5B;usar_down==1],\n                                        digitos = precision)\n    alpha_std_down = eq_std_down&#x5B;'alpha']\n    beta_std_down  = eq_std_down&#x5B;'beta']\n    fdiststd_down0 = lambda d: -10*alpha_std_down*(np.log10(d))+beta_std_down\n    yi_std_down0   = fdiststd_down0(xi_std)\n\n    # grafica std\n    escalabase = 10    # 10\n    escala = 'log'\n    \n    fig_grad_std,(graf_std_up,graf_std_down) = plt.subplots(2,1)\n    if escala == 'log':\n        graf_std_up.set_xscale(escala,base=escalabase)\n        graf_std_down.set_xscale(escala,base=escalabase)\n\n    graf_std_up.plot(xi_std,yi_std_up0,\n                     label = '  std_up:'+eq_std_up&#x5B;'eq_latex'],\n                     color='blue')\n        \n    # medida up +\/- std\n    graf_std_up.scatter(xi_std,yi_std_up,color='blue',marker='+')\n    graf_std_down.scatter(xi_std,yi_std_down,color='orange',marker='+')\n\n    # etiquetas\n    i=0\n    for unpunto in punto_graf.index:\n        media_etiq = np.round(punto_graf&#x5B;medida+'_up']&#x5B;unpunto],precision)\n        etiqueta   = unpunto # + ' ' +str(media_etiq)\n        usar_up    = punto_graf&#x5B;'usar_up']&#x5B;unpunto]\n        usar_down  = punto_graf&#x5B;'usar_down']&#x5B;unpunto]\n        xi  = punto_graf&#x5B;'dist_Gtw']&#x5B;unpunto]\n        yiu = punto_graf.iloc&#x5B;i]&#x5B;medida+'_up_std']\n        yid = punto_graf.iloc&#x5B;i]&#x5B;medida+'_down_std']\n        i = i+1\n        if usar_up:\n            graf_std_up.annotate(etiqueta,(xi,yiu), rotation=30)\n        if not(usar_up):\n            graf_std_up.annotate(etiqueta,(xi,yiu),color='red',rotation=30)\n            graf_std_up.scatter(xi,yiu,color='red',marker='o')\n        if usar_down:\n            graf_std_down.annotate(etiqueta,(xi,yid), rotation=30)\n        if not(usar_down):\n            graf_std_down.annotate(etiqueta,(xi,yid),color='red',rotation=30)\n            graf_std_down.scatter(xi,yid,color='red',marker='o')\n\n    graf_std_down.plot(xi_std,yi_std_down0,\n                    label = 'std_down:'+eq_std_down&#x5B;'eq_latex'],\n                    color='orange')\n\n    # otras etiquetas\n    graf_std_up.set_ylabel('std_up (dBm)', color='blue')\n    graf_std_up.set_xlabel('distancia')\n    graf_std_up.axhline(0,color='grey')\n    graf_std_up.grid(True,linestyle='dotted',\n                    axis='x', which='both')\n    graf_std_up.set_title(arch_nombre+': '+medida+' std')\n    graf_std_up.legend()\n\n    graf_std_down.set_ylabel('std_down (dBm)', color='brown')\n    graf_std_down.set_xlabel('distancia')\n    graf_std_down.axhline(0,color='grey')\n    graf_std_down.grid(True,linestyle='dotted',\n                    axis='x', which='both')\n    graf_std_down.legend()\n\n    return(fig_grad_std)\n\nfig_gradnt = graf_gradiente(arch_nombre,punto_graf,ecuacion,var_gen)\nunarchivo = carpeta_rsm+'\/ecuacion_'+arch_nombre+'.png'\nfig_gradnt.savefig(unarchivo)\n\nfig_dif_updown = graf_diferencia_updown(arch_nombre,punto_graf,var_gen)\nfig_grad_std = graf_gradiente_std(arch_nombre,punto_graf,medida,precision)\n\nplt.show() # pasa a programa principal\n<\/pre><\/div>","protected":false},"excerpt":{"rendered":"<p>Referencia: Chapra 17.1 p 466. Burden 8.1 p498, M\u00ednimos cuadrados en M\u00e9todos num\u00e9ricos Las descripciones estad\u00edsticas de Rssi obtenidas en cada punto sobre una l\u00ednea de propagaci\u00f3n se usan para estimar el modelo de propagaci\u00f3n para esa ruta. La ecuaci\u00f3n emp\u00edrica con la que se realiza la primera estimaci\u00f3n se modela como: La ruta de [&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-3883","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\/3883","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=3883"}],"version-history":[{"count":16,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/3883\/revisions"}],"predecessor-version":[{"id":4786,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/3883\/revisions\/4786"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/media?parent=3883"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/categories?post=3883"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/tags?post=3883"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}