{"id":2797,"date":"2020-11-28T17:38:33","date_gmt":"2020-11-28T22:38:33","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/girni\/?p=2797"},"modified":"2026-08-04T21:39:38","modified_gmt":"2026-08-05T02:39:38","slug":"rssi-vs-distancia-linealiza-intervalos","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/girni\/rssi-vs-distancia-linealiza-intervalos\/","title":{"rendered":"4.3 Rssi vs Distancia - Linealiza por intervalos"},"content":{"rendered":"\n<p>En \u00e1reas extensas de medici\u00f3n donde existen diferentes ambientes o entornos como vegetaci\u00f3n en una parte y edificios en otros, el resultado de b\u00e1sico de un solo intervalo puede mejorarse al utilizar subintervalos para cada entorno.<\/p>\n\n\n\n<p>El cambio de entorno forma una frontera, observando la distancia al gateway (baliza) se la toma el valor como punto de partida para estimar la linealizaci\u00f3n de cada sub-intervalo. Se determinan las ecuaciones para cada intervalo, para calcular los puntos de intersecci\u00f3n de cada linea teniendo como resultado una frontera entre diferentes ambientes calculada a partir de las mediciones realizadas.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">baliza: 'gtwFIEC'<\/h2>\n\n\n\n<p>Por ejemplo, para 'gtwFIEC' y su entorno mostrado en la imagen, en los puntos cercanos existe un ambiente con principalmente vegetaci\u00f3n, que luego en puntos m\u00e1s alejados hay ambientes urbanos con edificios de aulas y administrativos.<\/p>\n\n\n\n<p>Partiendo del 'gtwFIEC' se estima una frontera inicial a 176 metros para usar dos subintervalos y realizar la linealizaci\u00f3n.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/01\/gtwFIEC_DivideDosIntervalos01.png\"><img loading=\"lazy\" decoding=\"async\" width=\"790\" height=\"434\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/01\/gtwFIEC_DivideDosIntervalos01.png\" alt=\"\" class=\"wp-image-3158\" srcset=\"https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/01\/gtwFIEC_DivideDosIntervalos01.png 790w, https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/01\/gtwFIEC_DivideDosIntervalos01-300x165.png 300w, https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/01\/gtwFIEC_DivideDosIntervalos01-768x422.png 768w\" sizes=\"auto, (max-width: 790px) 100vw, 790px\" \/><\/a><\/figure>\n\n\n\n<p>\u00a0Los resultados que se obtienen son:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2020\/11\/gtwFIEC_DosIntervalos02.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1121\" height=\"618\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2020\/11\/gtwFIEC_DosIntervalos02.png\" alt=\"\" class=\"wp-image-3129\" srcset=\"https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/11\/gtwFIEC_DosIntervalos02.png 1121w, https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/11\/gtwFIEC_DosIntervalos02-300x165.png 300w, https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/11\/gtwFIEC_DosIntervalos02-768x423.png 768w, https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/11\/gtwFIEC_DosIntervalos02-1024x565.png 1024w\" sizes=\"auto, (max-width: 1121px) 100vw, 1121px\" \/><\/a><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Un intervalo<\/h3>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> Rssi(d) = -10(4.908)log_{10}(d)+1.406 <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> 52.54 \\le d \\le 397.15<\/span>\n\n\n\n<p>|error_rssi| promedio: 4.84 ,&nbsp; std: 5.56<\/p>\n\n\n\n<p>|error_dist| promedio: 41.43 ,&nbsp; std: 54.09<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Dos intervalos<\/h3>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\">Rssi_0(d) = -10(4.263)log_{10}(d)+(-11.269) <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> 52.54 \\le d \\le 166.14 <\/span>\n\n\n\n<p>|error_rssi| promedio: 2.92 , std: 3.33<\/p>\n\n\n\n<p>|error_dist| promedio: 20.19 ,&nbsp; std: 24.67<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\">Rssi_1(d) = -10(6.09)log_{10}(d)+(29.295) <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> 166.14 \\le d \\le 397.15<\/span>\n\n\n\n<p>|error_rssi| promedio: 2.71 , std: 3.17<\/p>\n\n\n\n<p>|error_dist| promedio: 25.03 ,&nbsp; std: 29.93<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">baliza: 'gtwFCNM'<\/h2>\n\n\n\n<p>Para el caso 'gtwFCNM' el \u00e1rea de inter\u00e9s con vegetaci\u00f3n se encuentra a partir de los 230 metros, tomado como valor inicial de frontera.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2020\/11\/gtwFCNM_DosIntervalos01.png\"><img loading=\"lazy\" decoding=\"async\" width=\"708\" height=\"618\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2020\/11\/gtwFCNM_DosIntervalos01.png\" alt=\"\" class=\"wp-image-3131\" srcset=\"https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/11\/gtwFCNM_DosIntervalos01.png 708w, https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/11\/gtwFCNM_DosIntervalos01-300x262.png 300w\" sizes=\"auto, (max-width: 708px) 100vw, 708px\" \/><\/a><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><figure><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2020\/11\/gtwFCNM_DosIntervalos02.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-3132 size-full\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2020\/11\/gtwFCNM_DosIntervalos02.png\" alt=\"\" width=\"1111\" height=\"620\" srcset=\"https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/11\/gtwFCNM_DosIntervalos02.png 1111w, https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/11\/gtwFCNM_DosIntervalos02-300x167.png 300w, https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/11\/gtwFCNM_DosIntervalos02-768x429.png 768w, https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/11\/gtwFCNM_DosIntervalos02-1024x571.png 1024w\" sizes=\"auto, (max-width: 1111px) 100vw, 1111px\" \/><\/a><\/figure><br>Un intervalo<\/h3>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> Rssi(d) = -10(5.403)log_{10}(d)+(8.423) <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> 27.74 \\le d \\le 364.71 <\/span>\n\n\n\n<p>|error_rssi| promedio: 4.59 , std: 5.48<\/p>\n\n\n\n<p>|error_dist| promedio: 41.33 ,&nbsp; std: 48.24<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Dos intervalos<\/h3>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> Rssi_0(d) = -10(4.795)log_{10}(d)+(-3.65) <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> 27.74 \\le d \\le 238.81 <\/span>\n\n\n\n<p>|error_rssi| promedio: 5.96 std: 6.51<\/p>\n\n\n\n<p>|error_dist| promedio: 52.15 ,&nbsp; std: 64.38<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> Rssi_1(d) = -10(9.027)log_{10}(d)+(96.989) <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\">238.81 \\le d \\le 364.71 <\/span>\n\n\n\n<p>|error_rssi| promedio: 2.81 , std: 3.43<\/p>\n\n\n\n<p>|error_dist| promedio: 20.26 ,&nbsp; std: 25.06<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">baliza: 'gtwRECT'<\/h2>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2020\/11\/gtwRECT_DosIntervalos01.png\"><img loading=\"lazy\" decoding=\"async\" width=\"976\" height=\"483\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2020\/11\/gtwRECT_DosIntervalos01.png\" alt=\"\" class=\"wp-image-3134\" srcset=\"https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/11\/gtwRECT_DosIntervalos01.png 976w, https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/11\/gtwRECT_DosIntervalos01-300x148.png 300w, https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/11\/gtwRECT_DosIntervalos01-768x380.png 768w\" sizes=\"auto, (max-width: 976px) 100vw, 976px\" \/><\/a><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2020\/11\/gtwRECT_DosIntervalos02.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1127\" height=\"617\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2020\/11\/gtwRECT_DosIntervalos02.png\" alt=\"\" class=\"wp-image-3135\" srcset=\"https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/11\/gtwRECT_DosIntervalos02.png 1127w, https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/11\/gtwRECT_DosIntervalos02-300x164.png 300w, https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/11\/gtwRECT_DosIntervalos02-768x420.png 768w, https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/11\/gtwRECT_DosIntervalos02-1024x561.png 1024w\" sizes=\"auto, (max-width: 1127px) 100vw, 1127px\" \/><\/a><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Un intervalo<\/h3>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> Rssi(d) = -10(5.054)log_{10}(d)+(11.823)<\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\">138.15 \\le d \\le 451.42 <\/span>\n\n\n\n<p>|error_rssi| promedio: 3.11 , std: 3.97<\/p>\n\n\n\n<p>|error_dist| promedio: 42.93 ,&nbsp; std: 51.69<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Dos intervalos<\/h3>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> Rssi_0(d) = -10(4.4443)log_{10}(d)+(-3.906) <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> 138.15 \\le d \\le 358.99 <\/span>\n\n\n\n<p>|error_rssi| promedio: 1.38 , std: 1.77<\/p>\n\n\n\n<p>|error_dist| promedio: 18.99 ,&nbsp; std: 23.13<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> Rssi_1(d) = -10(5.905)log_{10}(d)+(33.414) <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> 358.99 \\le d \\le 451.42 <\/span>\n\n\n\n<p>|error_rssi| promedio: 1.35 , std: 1.53<\/p>\n\n\n\n<p>|error_dist| promedio: 21.17 ,&nbsp; std: 24.68<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">Par\u00e1metros<\/h2>\n\n\n\n<p>Los par\u00e1metros para el algoritmo se establecen en el diccionario 'analiza'. frontera es el vector donde se indica los puntos de corte del intervalo bajo estudio. Si frontera es vacio <code>[]<\/code>, se asume que se analiza todo el intervalo.<\/p>\n\n\n\n<p>Los par\u00e1metros usados en el algoritmo para obtener los resultados presentados corresponden a:<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code><span style=\"color: #ff0000\"># Analizar por segmentos<\/span>\nanaliza = {<span style=\"color: #008000\">'gtwRECT'<\/span>:{<span style=\"color: #008000\">'analizar'<\/span>  : 1,\n                      <span style=\"color: #008000\">'atipico_std'<\/span> : 1,\n                      <span style=\"color: #008000\">'frontera'<\/span>    : &#091;320],\n                      <span style=\"color: #008000\">'atipInterv_std'<\/span>: &#091;1,1],\n                      <span style=\"color: #008000\">'p_amplia'<\/span>: 4,\n                      <span style=\"color: #008000\">'grp'<\/span> : &#091;<span style=\"color: #008000\">'RECT'<\/span>,<span style=\"color: #008000\">'FIEC'<\/span>],\n                      <span style=\"color: #008000\">'tip'<\/span> : &#091;<span style=\"color: #008000\">'punto'<\/span>],\n                      <span style=\"color: #008000\">'LOS'<\/span> : &#091;1]},\n           <span style=\"color: #008000\">'gtwFIEC'<\/span>:{<span style=\"color: #008000\">'analizar'<\/span>  : 1,\n                      <span style=\"color: #008000\">'atipico_std'<\/span> : 1,\n                      <span style=\"color: #008000\">'frontera'<\/span>    : &#091;190], \n                      <span style=\"color: #008000\">'atipInterv_std'<\/span>: &#091;1,1],\n                      <span style=\"color: #008000\">'p_amplia'<\/span>: 4,\n                      <span style=\"color: #008000\">'grp'<\/span> : &#091;<span style=\"color: #008000\">'FIEC'<\/span>,<span style=\"color: #008000\">'FCNM'<\/span>],\n                      <span style=\"color: #008000\">'tip'<\/span> : &#091;<span style=\"color: #008000\">'punto'<\/span>],\n                      <span style=\"color: #008000\">'LOS'<\/span> : &#091;1,0]},\n           <span style=\"color: #008000\">'gtwFCNM'<\/span>:{<span style=\"color: #008000\">'analizar'<\/span>   : 1,\n                      <span style=\"color: #008000\">'atipico_std'<\/span> : 1,\n                      <span style=\"color: #008000\">'frontera'<\/span>   : &#091;235.0],\n                      <span style=\"color: #008000\">'atipInterv_std'<\/span>: &#091;2,2],\n                      <span style=\"color: #008000\">'p_amplia'<\/span>: 4,\n                      <span style=\"color: #008000\">'grp'<\/span> : &#091;<span style=\"color: #008000\">'FIEC'<\/span>,<span style=\"color: #008000\">'FCNM'<\/span>],\n                      <span style=\"color: #008000\">'tip'<\/span> : &#091;<span style=\"color: #008000\">'punto'<\/span>],\n                      <span style=\"color: #008000\">'LOS'<\/span> : &#091;1,0]}\n           }<\/code><\/pre>\n\n\n\n<p>En la siguiente secci\u00f3n se detalla el algoritmo usado para generar las ecuaciones en cada segmento, las ecuaciones son usadas para estimar la ubicaci\u00f3n relativa a cada baliza.<\/p>\n\n\n\n<p>Rssi vs Distancia. Linealiza por intervalos con Python<\/p>\n\n\n\n<p>El algoritmo para realizar dos o m\u00e1s intervalos considera usar un estimado de frontera a lo largo de las mediciones.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/01\/gtwFIEC_DivideDosIntervalos01.png\"><img loading=\"lazy\" decoding=\"async\" width=\"790\" height=\"434\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/01\/gtwFIEC_DivideDosIntervalos01.png\" alt=\"\" class=\"wp-image-3158\" srcset=\"https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/01\/gtwFIEC_DivideDosIntervalos01.png 790w, https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/01\/gtwFIEC_DivideDosIntervalos01-300x165.png 300w, https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/01\/gtwFIEC_DivideDosIntervalos01-768x422.png 768w\" sizes=\"auto, (max-width: 790px) 100vw, 790px\" \/><\/a><\/figure>\n\n\n\n<p>Se implementa a\u00f1adiendo al bloque de ingreso dos par\u00e1metros en el bloque 'analiza':<\/p>\n\n\n\n<p>1. frontera es un vector donde se indican las distancia de los puntos de corte de los subintervalos sin considerar los extremos, corresponden a la frontera estimada en el mapa. El algoritmo actualiza la frontera con la intersecci\u00f3n&nbsp; de la linealizaci\u00f3n de dos subintervalos consecutivos. Si frontera es un vector vac\u00edo <code>[]<\/code> se asume que se trabaja con todo el intervalo.<\/p>\n\n\n\n<p>2. 'atipInterv_std' es un vector para la discriminaci\u00f3n de los valores atipicos aplicada en cada subintervalo.<\/p>\n\n\n\n<p>Como referencia para comparar, el resultado del an\u00e1lisis de <em><strong>todo el intervalo<\/strong><\/em> se denomina 'r0'. Los <em><strong>subintervalos<\/strong> <\/em>se identifican por 'r1','r2', etc, en orden al alejarse de la baliza.<\/p>\n\n\n\n<p>En el resultado como valor complementario de revisi\u00f3n se a\u00f1ade el coeficiente de correlaci\u00f3n de los puntos usados en el an\u00e1lisis.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Algoritmo en Python<\/h2>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# LoRa-Multipunto, Rssi vs distancia\n# linealizaci\u00f3n Rssi vs log10(distancia)\n# por m\u00ednimos cuadrados\n# Graficas 2D y 3D\n# Girni 2020-10-07 propuesta: edelros@espol.edu.ec\n\nimport numpy as np\nimport pandas as pd\nimport json\nimport matplotlib.pyplot as plt\nimport girni_lora_libreria as girni\n\n# INGRESO\n# archivos de entrada\nmodo = 'rx'\nmedida = 'rssi'\ndescriptor = 'mean'\narch_medidaubica = 'rsmP06_'+medida+'Ubica01Intervalo.txt'\n\n# archivos de salida\narch_ecuaciones = 'rsmP07_ecuacion01Intervalos.json'\n\n# Analizar por segmentos\nanaliza = {'gtwRECT':{'analizar' : 1,\n 'atipico_std' : 1,\n 'frontera' : &#x5B;320],\n 'atipInterv_std': &#x5B;1,1],\n 'p_amplia': 4,\n 'grp' : &#x5B;'RECT','FIEC'],\n 'tip' : &#x5B;'punto'],\n 'LOS' : &#x5B;1]},\n 'gtwFIEC':{'analizar' : 1,\n 'atipico_std' : 1,\n 'frontera' : &#x5B;190], \n 'atipInterv_std': &#x5B;1,1],\n 'p_amplia': 4,\n 'grp' : &#x5B;'FIEC','FCNM'],\n 'tip' : &#x5B;'punto'],\n 'LOS' : &#x5B;1,0]},\n 'gtwFCNM':{'analizar' : 1,\n 'atipico_std' : 1,\n 'frontera' : &#x5B;235.0],\n 'atipInterv_std': &#x5B;2,2],\n 'p_amplia': 4,\n 'grp' : &#x5B;'FIEC','FCNM'],\n 'tip' : &#x5B;'punto'],\n 'LOS' : &#x5B;1,0]}\n }\n\nbaliza = {'d1':'gtwRECT',\n 'd2':'gtwFIEC',\n 'd3':'gtwFCNM'}\n\n# Par\u00e1metros de grafica\ntipograf = '2D' # '2D','3D'\nescala = 'log' # 'normal','log'\nescalabase = 10 # 10, np.exp()\ncasicero = 1e-4\nprecision = 3\nintersectar = 1 # 0:Falso, 1: Verdadero\n\n# Referencias de gr\u00e1fica\ngrupo = &#x5B;'FIEC' ,'FCNM' ,'RECT','CIRC']\ncolores = &#x5B;'green','orange','grey','magenta']\ntipo = &#x5B;'punto','1m' ,'gtw','dispositivo']\nmarcas = &#x5B; 'o','D' ,'D' ,'*' ]\n\nmostrargrpeti = &#x5B;'FIEC','FCNM','RECT']\nmostrartipeti = &#x5B;'1m','gtw']\n\n# PROCEDIMIENTO\n# Resultados de an\u00e1lisis\necuacion = {}\neq_graf = {}\n\n# leer datos\ntabla = pd.read_csv(arch_medidaubica, index_col='etiqueta')\ntabla = pd.DataFrame(tabla)\n\n# analiza datos hacia una baliza\nfor unabaliza in analiza:\n\n # Par\u00e1metros\n analizar = analiza&#x5B;unabaliza]&#x5B;'analizar']\n\n if analizar:\n ecuacion&#x5B;unabaliza] = {}\n eq_graf&#x5B;unabaliza] = {}\n \n # pares a usar de baliza\n &#x5B;pares,par_etiqueta] = girni.pares_usar(tabla,baliza,\n analiza,unabaliza,\n medida = medida ,\n modo = modo)\n # todos los puntos\n # analiza puntos para m\u00ednimos cuadrados\n xi = pares&#x5B;:,0]\n yi = pares&#x5B;:,1]\n n_xi = len(xi)\n # coeficiente de correlaci\u00f3n\n correlacion = np.corrcoef(xi,yi)&#x5B;0,1]\n \n # minimos cuadrados\n ecuacion0 = girni.linealiza_lstsq(xi,yi)\n\n # selecciona atipicos\n atipico_std = analiza&#x5B;unabaliza]&#x5B;'atipico_std']\n alpha = ecuacion0&#x5B;'alpha']\n beta = ecuacion0&#x5B;'beta']\n fdist0 = lambda d: -10*alpha*(np.log10(d))+beta\n yi0 = fdist0(xi)\n dyi0std = ecuacion0&#x5B;'error_std']\n dyi0 = yi - yi0\n atipicos = np.abs(dyi0) &gt;= dyi0std*atipico_std\n xi0_e = xi&#x5B;atipicos]\n yi0_e = yi&#x5B;atipicos]\n etiq0_e = par_etiqueta&#x5B;atipicos]\n\n unintervalo = 'r0' # todos\n # para exportar hacia archivo o gr\u00e1fica\n ecuacion&#x5B;unabaliza] = {unintervalo: ecuacion0}\n ecuacion&#x5B;unabaliza]&#x5B;unintervalo]&#x5B;'correlacion'] = correlacion\n \n eq_graf&#x5B;unabaliza] = {unintervalo: {'xi_graf':xi,\n 'yi_graf':yi,\n 'etiqueta': par_etiqueta,\n 'linea' : yi0,\n 'atipicos':&#x5B;xi0_e,yi0_e],\n 'atip_etiq': etiq0_e}\n }\n \n # Intervalos radiales en sector\n intervalo = &#x5B;np.min(xi),np.max(xi)]\n frontera = analiza&#x5B;unabaliza]&#x5B;'frontera']\n if len(frontera)&gt;0:\n # revisar si frontera esta dentro intervalo\n frontera = np.array(frontera, dtype=float)\n revisar = (frontera&gt;=np.min(xi)) &amp; (frontera&lt;=np.max(xi))\n enintervalo = list(frontera&#x5B;revisar])\n intervalo.extend(enintervalo)\n intervalo = np.array(intervalo)\n ordenar = np.argsort(intervalo)\n intervalo = intervalo&#x5B;ordenar]\n n_intervalo = len(intervalo)\n \n # analizar cada subintervalo\n p_inicio = 0\n p_desde = 0\n p_amplia = analiza&#x5B;unabaliza]&#x5B;'p_amplia']\n atipIntv_std = analiza&#x5B;unabaliza]&#x5B;'atipInterv_std']\n for i in range(0,n_intervalo-1,1):\n i_eq = 'r'+str(i+1) # indice en texto\n\n # puntos en subintervalo &#x5B;a,b]\n a = intervalo&#x5B;i]\n b = intervalo&#x5B;i+1]\n subintervalo = (xi &gt;= a) &amp; (xi &lt;= b) \n xi_sub = xi&#x5B;subintervalo]\n yi_sub = yi&#x5B;subintervalo]\n n_sub = len(xi_sub)\n etiq_sub = par_etiqueta&#x5B;p_inicio:p_inicio + n_sub]\n\n # amplia sub-intervalo, mejora intersecta rectas\n detras = p_inicio\n retrocede = detras\n if detras &gt; p_amplia:\n retrocede = p_amplia\n delante = n_xi - (p_inicio+n_sub)# -1)\n avanza = delante\n if delante &gt;= p_amplia:\n avanza = p_amplia\n p_desde = p_inicio - retrocede\n p_hasta = p_inicio + (n_sub) + avanza\n p_inicio = p_inicio + (n_sub-1)\n \n # subintervalo, amplia puntos\n xi_a = xi&#x5B;p_desde:p_hasta]\n yi_a = yi&#x5B;p_desde:p_hasta]\n etiq_a = par_etiqueta&#x5B;p_desde:p_hasta]\n # coeficiente de correlaci\u00f3n\n correlacion1 = np.corrcoef(xi_a,yi_a)&#x5B;0,1]\n\n # analiza subintervalo\n ecuacion1 = girni.linealiza_lstsq(xi_a,yi_a)\n ecuacion&#x5B;unabaliza]&#x5B;i_eq] = ecuacion1\n ecuacion&#x5B;unabaliza]&#x5B;i_eq]&#x5B;'correlacion'] = correlacion1 \n # atipicos del subintervalo extendido\n alpha = ecuacion1&#x5B;'alpha']\n beta = ecuacion1&#x5B;'beta']\n fdist1 = lambda d: -10*alpha*(np.log10(d))+beta\n yi1 = fdist1(xi_a)\n dyi1std = ecuacion1&#x5B;'error_std']\n atipico_std = analiza&#x5B;unabaliza]&#x5B;'atipInterv_std']&#x5B;i]\n dyi1 = yi_a - yi1\n atipicos = np.zeros(len(xi_a),dtype=bool)\n if np.abs(dyi1std) &gt; casicero:\n atipicos = np.abs(dyi1) &gt;= dyi1std*atipico_std\n xi1_e = xi_a&#x5B;atipicos]\n yi1_e = yi_a&#x5B;atipicos]\n etiq1_e = etiq_a&#x5B;atipicos]\n\n # para gr\u00e1fica, atipicos sin extender puntos \n atipicos_sub = (xi1_e &gt;= a) &amp; (xi1_e&lt;=b)\n xi_sub1_e = xi1_e&#x5B;atipicos_sub]\n yi_sub1_e = yi1_e&#x5B;atipicos_sub]\n etiq_sub1e = etiq1_e&#x5B;atipicos_sub]\n eq_graf&#x5B;unabaliza]&#x5B;i_eq] = {'atipicos': &#x5B;xi_sub1_e,yi_sub1_e],\n 'atip_etiq':etiq_sub1e}\n \n\n # subintervalo sin atipicos\n if len(xi1_e)&gt;0:\n atipicoNo = np.abs(dyi1) &lt;= dyi1std*atipico_std\n xi2 = xi_a&#x5B;atipicoNo]\n yi2 = yi_a&#x5B;atipicoNo]\n etiq2 = etiq_a&#x5B;atipicoNo]\n # coeficiente de correlaci\u00f3n\n correlacion2 = np.corrcoef(xi2,yi2)&#x5B;0,1]\n ecuacion2 = girni.linealiza_lstsq(xi2,yi2)\n\n # actualiza ecuaci\u00f3n sin atipicos intervaloy\n intervalox = ecuacion1&#x5B;'intervalox']\n ecuacion2&#x5B;'intervalox'] = intervalox.copy()\n alpha = ecuacion2&#x5B;'alpha']\n beta = ecuacion2&#x5B;'beta']\n fdist = lambda d: -10*alpha*(np.log10(d))+beta\n intervaloy = fdist(intervalox)\n ordenar = np.argsort(intervaloy)\n intervaloy = list(intervaloy&#x5B;ordenar])\n ecuacion2&#x5B;'intervaloy'] = intervaloy\n ecuacion&#x5B;unabaliza]&#x5B;i_eq] = ecuacion2\n #ecuacion&#x5B;unabaliza]&#x5B;i_eq]&#x5B;'correlacion1'] = correlacion1\n ecuacion&#x5B;unabaliza]&#x5B;i_eq]&#x5B;'correlacion'] = correlacion2\n \n # Revisa frontera entre subintervalos,\n # usa intersecci\u00f3n de rectas como nueva frontera\n interv_calc = np.copy(intervalo)\n if len(intervalo) &gt;2 and intersectar==1 : \n for i in range(0,n_intervalo-2,1):\n ai = 'r'+str(i+1)\n bi = 'r'+str(i+2)\n ma = ecuacion&#x5B;unabaliza]&#x5B;ai]&#x5B;'alpha']\n ba = ecuacion&#x5B;unabaliza]&#x5B;ai]&#x5B;'beta']\n mb = ecuacion&#x5B;unabaliza]&#x5B;bi]&#x5B;'alpha']\n bb = ecuacion&#x5B;unabaliza]&#x5B;bi]&#x5B;'beta']\n\n # punto de intersecci\u00f3n o cruce\n cruzanx = 10**((bb-ba)\/(10*(mb-ma)))\n dfrontera = frontera-cruzanx\n # cruce dentro de intervalo de ecuacion\n if cruzanx &gt; intervalo&#x5B;-1]:\n cruzanx = intervalo&#x5B;-1]\n if cruzanx &lt; intervalo&#x5B;0]:\n cruzanx = intervalo&#x5B;0]\n interv_calc&#x5B;i+1] = cruzanx\n \n # para grafica evalua cada subintervalo sin atipicos\n n_interv_calc = len(interv_calc)\n for i in range(0,n_interv_calc-1,1):\n i_eq = 'r'+str(i+1)\n a = interv_calc&#x5B;i]\n b = interv_calc&#x5B;i+1]\n subintervalo = (xi &gt;= a) &amp; (xi &lt;= b)\n xi_sub = xi&#x5B;subintervalo]\n yi_sub = yi&#x5B;subintervalo]\n xi_graf = np.copy(xi&#x5B;subintervalo])\n if not(a in xi_sub):\n xi_graf = np.concatenate((&#x5B;a],xi_graf),axis=0)\n if not(b in xi_sub):\n xi_graf = np.concatenate((xi_graf,&#x5B;b]),axis=0)\n \n # Evalua subintervalo con la ecuacion sin atipicos\n alpha = ecuacion&#x5B;unabaliza]&#x5B;i_eq]&#x5B;'alpha']\n beta = ecuacion&#x5B;unabaliza]&#x5B;i_eq]&#x5B;'beta']\n fdist = lambda d: -10*alpha*(np.log10(d))+beta\n yi1_sub = fdist(xi_sub)\n yi_graf = fdist(xi_graf)\n eq_graf&#x5B;unabaliza]&#x5B;i_eq]&#x5B;'xi_graf'] = xi_graf\n eq_graf&#x5B;unabaliza]&#x5B;i_eq]&#x5B;'yi_graf'] = yi_graf\n a = np.round(np.min(&#x5B;xi_graf]),precision)\n b = np.round(np.max(&#x5B;xi_graf]),precision)\n ecuacion&#x5B;unabaliza]&#x5B;i_eq]&#x5B;'intervalox'] = &#x5B;a,b]\n ay = np.round(np.min(&#x5B;yi_graf]),precision)\n by = np.round(np.max(&#x5B;yi_graf]),precision)\n ecuacion&#x5B;unabaliza]&#x5B;i_eq]&#x5B;'intervaloy'] = &#x5B;ay,by] \n \n# SALIDA\nfor unabaliza in ecuacion:\n print('baliza: ',unabaliza)\n for unaecuacion in ecuacion&#x5B;unabaliza]:\n unintervalo = ecuacion&#x5B;unabaliza]&#x5B;unaecuacion]&#x5B;'intervalox']\n unintervaloy = ecuacion&#x5B;unabaliza]&#x5B;unaecuacion]&#x5B;'intervaloy']\n error_medio = ecuacion&#x5B;unabaliza]&#x5B;unaecuacion]&#x5B;'error_medio']\n error_std = ecuacion&#x5B;unabaliza]&#x5B;unaecuacion]&#x5B;'error_std']\n eq_latex = ecuacion&#x5B;unabaliza]&#x5B;unaecuacion]&#x5B;'eq_latex']\n errorx_medio = ecuacion&#x5B;unabaliza]&#x5B;unaecuacion]&#x5B;'errorx_medio']\n errorx_std = ecuacion&#x5B;unabaliza]&#x5B;unaecuacion]&#x5B;'errorx_std']\n correlacion = ecuacion&#x5B;unabaliza]&#x5B;unaecuacion]&#x5B;'correlacion']\n\n print('  intervalo: ',unaecuacion)\n print('    ' + eq_latex)\n print('   ','intervalox: ',np.round(unintervalo,precision))\n print('   ','intervaloy: ',np.round(unintervaloy,precision))\n print('    correlaci\u00f3n: ',np.round(correlacion,precision))\n print('    |error_rssi| promedio: ',np.round(error_medio,precision),\n ' , std:',np.round(error_std,precision))\n print('    |error_dist| promedio: ',np.round(errorx_medio,precision),\n ' , std:',np.round(errorx_std,precision))\n print()\n\n# salida hacia archivo\nwith open(arch_ecuaciones, 'w') as outfile:\n json.dump(ecuacion, outfile) \n\n# GRAFICA\n# Referencias para gr\u00e1fica\ngrupo = &#x5B;'FIEC' ,'FCNM' ,'RECT','CIRC']\ncolores = &#x5B;'green','orange','grey','magenta']\ntipo = &#x5B;'punto','1m' ,'gtw','dispositivo']\nmarcas = &#x5B; 'o','D' ,'D' ,'*' ]\n\nmostrargrpeti = &#x5B;'FIEC','FCNM','RECT']\nmostrartipeti = &#x5B;'1m','gtw']\n\nif tipograf=='2D':\n for unabaliza in ecuacion:\n figura,grafica = plt.subplots()\n if escala == 'log':\n grafica.set_xscale(escala,base=escalabase)\n\n # todos los puntos\n unintervalo = 'r0'\n xi = eq_graf&#x5B;unabaliza]&#x5B;unintervalo]&#x5B;'xi_graf']\n yi = eq_graf&#x5B;unabaliza]&#x5B;unintervalo]&#x5B;'yi_graf']\n etiqueta = eq_graf&#x5B;unabaliza]&#x5B;unintervalo]&#x5B;'etiqueta']\n grafica.scatter(xi,yi,marker='.')\n m = len(xi)\n for i in range(0,m,1):\n grafica.annotate(etiqueta&#x5B;i],\n (xi&#x5B;i],yi&#x5B;i]))\n \n # linea con todos los puntos\n fdtxt = ecuacion&#x5B;unabaliza]&#x5B;unintervalo]&#x5B;'eq_latex']\n yi0 = eq_graf&#x5B;unabaliza]&#x5B;unintervalo]&#x5B;'linea']\n a = np.round(np.min(&#x5B;xi]),2)\n b = np.round(np.max(&#x5B;xi]),2)\n eq_texto = fdtxt+' ; &#x5B;'+str(a)+','+str(b)+']'\n grafica.plot(xi,yi0,\n label = eq_texto,\n linestyle='dotted')\n\n # lineas por cada subintervalo\n eq_interv = list(ecuacion&#x5B;unabaliza].keys())\n eq_interv.pop(0)\n n_intervalo = len(eq_interv)\n\n for i_eq in eq_interv:\n fdtxt = ecuacion&#x5B;unabaliza]&#x5B;i_eq]&#x5B;'eq_latex']\n xi_graf = eq_graf&#x5B;unabaliza]&#x5B;i_eq]&#x5B;'xi_graf']\n yi_graf = eq_graf&#x5B;unabaliza]&#x5B;i_eq]&#x5B;'yi_graf']\n a = np.round(np.min(&#x5B;xi_graf]),precision)\n b = np.round(np.max(&#x5B;xi_graf]),precision)\n eq_texto = fdtxt+' ; &#x5B;'+str(a)+','+str(b)+']'\n grafica.plot(xi_graf,yi_graf,\n label = eq_texto)\n\n # atipicos marcados en subintervalo\n &#x5B;xi1_e,yi1_e] = eq_graf&#x5B;unabaliza]&#x5B;i_eq]&#x5B;'atipicos']\n etiq1_e = eq_graf&#x5B;unabaliza]&#x5B;i_eq]&#x5B;'atip_etiq']\n grafica.scatter(xi1_e,yi1_e, color='red')\n m = len(etiq1_e)\n for i in range(0,m,1):\n grafica.annotate(etiq1_e&#x5B;i],\n (xi1_e&#x5B;i],yi1_e&#x5B;i]),\n color='red')\n \n # lineas de frontera\n grafica.axvline(a, color='lightblue')\n valor_frontera = str(np.round(a,precision))\n grafica.annotate(valor_frontera,\n (a,np.max(&#x5B;yi,yi0])),\n color='lightblue')\n grafica.axvline(b, color='lightblue')\n valor_frontera = str(np.round(b,precision))\n grafica.annotate(valor_frontera,\n (b,np.max(&#x5B;yi,yi0])),\n color='lightblue') \n \n # etiquetas y t\u00edtulos\n grafica.legend()\n grafica.set_ylabel(medida+'_'+modo)\n grafica.set_xlabel('distancia')\n grafica.grid(True,linestyle='dotted',\n axis='x', which='both')\n \n untitulo = unabaliza+': '+medida+'_'+modo + ' vs distancia'\n grafica.set_title(untitulo)\n \n plt.show()\u00a0\n<\/pre><\/div>","protected":false},"excerpt":{"rendered":"<p>En \u00e1reas extensas de medici\u00f3n donde existen diferentes ambientes o entornos como vegetaci\u00f3n en una parte y edificios en otros, el resultado de b\u00e1sico de un solo intervalo puede mejorarse al utilizar subintervalos para cada entorno. El cambio de entorno forma una frontera, observando la distancia al gateway (baliza) se la toma el valor como [&hellip;]<\/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-2797","post","type-post","status-publish","format-standard","hentry","category-lorawan-localizacion-rssi"],"_links":{"self":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/2797","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=2797"}],"version-history":[{"count":22,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/2797\/revisions"}],"predecessor-version":[{"id":4851,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/2797\/revisions\/4851"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/media?parent=2797"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/categories?post=2797"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/tags?post=2797"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}