{"id":2993,"date":"2021-01-21T10:33:26","date_gmt":"2021-01-21T15:33:26","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/girni\/?p=2993"},"modified":"2021-03-11T15:39:09","modified_gmt":"2021-03-11T20:39:09","slug":"rssi-vs-distancia-linealiza-funcion-python","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/girni\/rssi-vs-distancia-linealiza-funcion-python\/","title":{"rendered":"4.2 Rssi vs distancia. Linealiza - funci\u00f3n Python"},"content":{"rendered":"<p>Para el procesamiento de los datos se incorpora una funci\u00f3n a <a href=\"http:\/\/blog.espol.edu.ec\/girni\/funciones-girni_lora_libreria\/\"><strong><em>girni_lora_libreria<\/em><\/strong><\/a> para realizar la linealizaci\u00f3n por m\u00ednimos cuadrados.<\/p>\n<pre><span style=\"color: #0000e6\">linealiza_lstsq<\/span>(xi,yi,digitos = 3)<\/pre>\n<p>La funci\u00f3n se encarga de convertir el eje x en log<sub>10<\/sub>(x), asi como construir las ecuaciones en la forma num\u00e9rica lambda, latex y un diccionario con los par\u00e1metros de la ecuaci\u00f3n.<\/p>\n<h2>Datos de ingreso<\/h2>\n<p>Los datos de ingreso son <strong>xi<\/strong> y <strong>yi<\/strong> para cada eje, la variable <em><strong>d\u00edgitos<\/strong> <\/em>establece los decimales a usar en la expresi\u00f3n en formato latex.<\/p>\n<h2>Datos de Salida<\/h2>\n<p>El resultado es un diccionario con los intervalos de los valores obtenidos para cada eje, la pendiente de la recta, el |error| promedio, la desviaci\u00f3n est\u00e1ndar error_std, la ecuaci\u00f3n en formato latex.<\/p>\n<pre>unaecuacion = {<span style=\"color: #008000\">'alpha'<\/span>   : alpha,\r\n               <span style=\"color: #008000\">'beta'<\/span>    : beta,\r\n               <span style=\"color: #008000\">'eq_latex'<\/span>: fdtxt0,\r\n               <span style=\"color: #008000\">'intervalox'<\/span> : [np.min(xi),np.max(xi)],\r\n               <span style=\"color: #008000\">'error_medio'<\/span>: dyi0mean,\r\n               <span style=\"color: #008000\">'error_std'<\/span>  : dyi0std,\r\n               <span style=\"color: #008000\">'eqg_latex'<\/span>  : grtxt0,\r\n               <span style=\"color: #008000\">'intervaloy'<\/span>  : [np.min(yi),np.max(yi)],\r\n               <span style=\"color: #008000\">'errorx_medio'<\/span>: dxi0mean,\r\n               <span style=\"color: #008000\">'errorx_std'<\/span>  : dxi0std,\r\n               }\r\n<\/pre>\n<p>El resultado se puede escribir en un archivo en formato json. La ecuaci\u00f3n se recupera desde el archivo con lo que se puede volver a construir la funci\u00f3n en la lambda para evaluaci\u00f3n num\u00e9rica.<\/p>\n<h2>Procedimiento<\/h2>\n<p>Se desarrolla principalmente usando la funci\u00f3n <a href=\"https:\/\/numpy.org\/doc\/stable\/reference\/generated\/numpy.linalg.lstsq.html\">numpy.linalg.lstsq<\/a>.<\/p>\n<p>La relaci\u00f3n rssi vs distancia usa log10(xi), por lo que se incluye esta operaci\u00f3n antes de aplicar m\u00ednimos cuadrados.<\/p>\n<p>Obtenidos los par\u00e1metros, se da el formato de la expresi\u00f3n acorde al modelo b\u00e1sico de p\u00e9rdidas en espacio libre en latex para mostrar como etiqueta en las gr\u00e1ficas.<\/p>\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> RSSI(d) = -10 \\alpha \\log_{10} (d) + P_{0} <\/span>\n<p>La funci\u00f3n se usa para cada baliza, y en varios segmentos, para observar los posibles resultados, tambi\u00e9n se incorporan los valores de errores,<\/p>\n<hr \/>\n<h2>Algoritmo en Python<\/h2>\n<pre><span style=\"color: #d35400\">def<\/span> <span style=\"color: #0000e6\">linealiza_lstsq<\/span>(xi,yi,digitos = 3):\r\n    <span style=\"color: #008000\">''' usa minimos cuadrados para entregar la ecuacion\r\n        digitos: usados en expresion latex\r\n    '''<\/span>\r\n    unaecuacion = {}\r\n    <span style=\"color: #ff0000\"># Eje x en log10()<\/span>\r\n    xilog = np.log10(xi)\r\n    n = <span style=\"color: #ff00ff\">len<\/span>(xi)\r\n    \r\n    <span style=\"color: #ff0000\"># m\u00ednimos cuadrados (least square),<\/span>\r\n    <span style=\"color: #ff0000\"># distancia vs medida<\/span>\r\n    A = np.vstack([xilog, np.ones(n)]).T\r\n    [m0, b0] = np.linalg.lstsq(A, yi, rcond=<span style=\"color: #d35400\">None<\/span>)[0]\r\n    alpha = -m0\/10\r\n    beta  = b0\r\n\r\n    <span style=\"color: #ff0000\"># ecuaciones expresion rssi(d)<\/span>\r\n    fdist0 = <span style=\"color: #d35400\">lambda<\/span> d: -10*alpha*(np.log10(d))+beta\r\n    \r\n    fdtxt0 = <span style=\"color: #008000\">r'$ rssi = -10('<\/span> + <span style=\"color: #ff00ff\">str<\/span>(np.round(alpha,digitos))\r\n    fdtxt0 = fdtxt0 + <span style=\"color: #008000\">')log_{10}(d)+('<\/span>\r\n    fdtxt0 = fdtxt0 + <span style=\"color: #ff00ff\">str<\/span>(np.round(beta,digitos))+<span style=\"color: #008000\">') $'<\/span>\r\n\r\n    <span style=\"color: #ff0000\"># Errores respecto a rssi(d) <\/span>\r\n    yi0  = fdist0(xi)\r\n    dyi0 = yi - yi0\r\n    dyi0mean = np.mean(np.abs(dyi0))\r\n    dyi0std  = np.std(dyi0, dtype=np.float64)\r\n\r\n    <span style=\"color: #ff0000\"># ecuaciones expresion d(rssi)<\/span>\r\n    grssi0 = <span style=\"color: #d35400\">lambda<\/span> rssi: 10**((beta-rssi)\/(10*alpha))\r\n    grtxt0 = <span style=\"color: #008000\">r\"$ d = 10^{(\"<\/span> + <span style=\"color: #ff00ff\">str<\/span>(np.round(beta,digitos)) + <span style=\"color: #008000\">' - '<\/span>\r\n    grtxt0 = grtxt0 + <span style=\"color: #008000\">'rssi)\/'<\/span> + <span style=\"color: #008000\">'(10('<\/span>+<span style=\"color: #ff00ff\">str<\/span>(np.round(alpha,digitos))+<span style=\"color: #008000\">'))} $'<\/span>\r\n\r\n    <span style=\"color: #ff0000\"># Errores respecto a rssi(d) <\/span>\r\n    xi0  = grssi0(yi)\r\n    dxi0 = xi - xi0\r\n    dxi0mean = np.mean(np.abs(dxi0))\r\n    dxi0std  = np.std(dxi0, dtype=np.float64)\r\n    \r\n    unaecuacion = {<span style=\"color: #008000\">'alpha'<\/span>   : alpha,\r\n                   <span style=\"color: #008000\">'beta'<\/span>    : beta,\r\n                   <span style=\"color: #008000\">'eq_latex'<\/span>: fdtxt0,\r\n                   <span style=\"color: #008000\">'intervalox'<\/span> : [np.min(xi),np.max(xi)],\r\n                   <span style=\"color: #008000\">'error_medio'<\/span>: dyi0mean,\r\n                   <span style=\"color: #008000\">'error_std'<\/span>  : dyi0std,\r\n                   <span style=\"color: #008000\">'eqg_latex'<\/span>  : grtxt0,\r\n                   <span style=\"color: #008000\">'intervaloy'<\/span>  : [np.min(yi),np.max(yi)],\r\n                   <span style=\"color: #008000\">'errorx_medio'<\/span>: dxi0mean,\r\n                   <span style=\"color: #008000\">'errorx_std'<\/span>  : dxi0std,\r\n                   }\r\n    <span style=\"color: #d35400\">return<\/span>(unaecuacion)\r\n<\/pre>\n<p><em><strong>Referencias<\/strong><\/em>:<br \/>\nBurden R,\u00a0Faires J, Burden A, An\u00e1lisis num\u00e9rico, D\u00e9cima Edici\u00f3n 8.1 p370.<br \/>\nChapra C, Canale R. M\u00e9todos num\u00e9ricos para ingenieros, Quinta edici\u00f3n 17.1.2 p469.<\/p>\n<p>Numpy org. Least Square function.\u00a0 <a href=\"https:\/\/numpy.org\/doc\/stable\/reference\/generated\/numpy.linalg.lstsq.html\">numpy.linalg.lstsq<\/a><\/p>\n<p>M\u00ednimos cuadrados. <a href=\"https:\/\/es.wikipedia.org\/wiki\/M%C3%ADnimos_cuadrados\">https:\/\/es.wikipedia.org\/wiki\/M%C3%ADnimos_cuadrados<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Para el procesamiento de los datos se incorpora una funci\u00f3n a girni_lora_libreria para realizar la linealizaci\u00f3n por m\u00ednimos cuadrados. linealiza_lstsq(xi,yi,digitos = 3) La funci\u00f3n se encarga de convertir el eje x en log10(x), asi como construir las ecuaciones en la forma num\u00e9rica lambda, latex y un diccionario con los par\u00e1metros de la ecuaci\u00f3n. Datos de &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/blog.espol.edu.ec\/girni\/rssi-vs-distancia-linealiza-funcion-python\/\" class=\"more-link\">Continuar leyendo<span class=\"screen-reader-text\"> \"4.2 Rssi vs distancia. Linealiza - funci\u00f3n Python\"<\/span><\/a><\/p>\n","protected":false},"author":8043,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1463489],"tags":[],"class_list":["post-2993","post","type-post","status-publish","format-standard","hentry","category-localizacion-rssi-lora"],"_links":{"self":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/2993","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=2993"}],"version-history":[{"count":10,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/2993\/revisions"}],"predecessor-version":[{"id":3154,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/2993\/revisions\/3154"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/media?parent=2993"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/categories?post=2993"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/tags?post=2993"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}