我正在 Matlab 中做一个无线通信算法,在计算不同距离的损失时计算对数模型的损失和偏差。
一切正常,这是我的功能: d0 = 引用距离(始终相同) nombre = 这是一个 .mat 文件,它有一个矩阵 250x2,其中第一列有距离(从那里我取了不同的值),第二列有值 Lfs2 = 这是距离为 d0 的丢失
Lfs2 = -20*log10((4*pi*d0)/((299792458)/(freq*10^6)));
我刚刚制定了算法,我的 250x2 矩阵一切正常,但出于测试目的,我用 4246x2 矩阵制作了一个蓝牙信号模型,但是当我用这个值做我的算法时,我的 n(丢失因子)是正确的计算,但我的 desv 因子不是..这是因为数字太大了 INF
function [ n , desv ] = perd_desv(d0, Lfs2, nombre)
%UNTITLED Summary of this function goes here
% Detailed explanation goes here
% Comprobamos que Pld0 es una perdida y no una atenuación
if Lfs2>0
Lfs2 = -Lfs2;
end
Lfs2;
%Nombre = 'Practica28.mat';
load(nombre);
medida = Pl(:,2);
distancia = Pl(:,1);
% Calculo la n %
syms n;
p = 0;
for i=1:size(medida,1)
p = p + (medida(i)-(-Lfs2)-10*n*log10(distancia(i)/d0))^2;
end
perdida = double(solve(diff(p)));
n = sprintf('%.2f',perdida);
% Calculo de la desv
w = 0;
for i=1:size(medida,1)
w = w + (1/size(medida,1))*(medida(i)-(Lfs2)-10*perdida*log10(distancia(i)/d0))^2;
end
w = 0;
for i=1:size(medida,1)
w = w + (1/size(medida,1))*(medida(i)-(-Lfs2)-10*perdida*log10(distancia(i)/d0))^2;
end
desv = sprintf('%.2f',double(sqrt(w)));
问题是..我知道在 Matlab 中有用于系列总和的 symsum..但我看不到如何使用 symsum 来定义此算法..而且我不知道如何表示该数字适合我的变量..
非常感谢
最佳答案
一个建议(当您需要肯定不会失败的高速计算时不要遵循)是“展开”您的对数。由于对数的特性,可以很容易地表示:
log(a/b) = log(a)−log(b)
对于 a 和 b 适合 double
的情况范围,但 a/b 没有。这是一个猜测(因为您没有提供关于 medida
和 distancia
相对于 d0
的数量级的提示)。
所以,尝试编写如下代码:
% constants below may be calculated just once
Lfs2 = -20*(log10(4*pi*d0) - log10(299792458) + 6 + log10(freq))
或:
w = w + (1/size(medida,1))*( ...
medida(i) ...
- Lfs2 ...
- 10*perdida*(log10(distancia(i)) - log10(d0)) ...
)^2;
此外,验证是否 size(medida,1)
有时不为零(没有提示是如何计算的,除了它是某个矩阵的第一列)。
关于algorithm - 在matlab中表示长数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26235965/