非常抱歉,这是因为在之前的代码中没有定义变量xArr和yArr。如果您想要绘制历史搜索图,需要先将搜索过程中每个时间步的状态值存储到xArr和yArr数组中,然后再使用这两个数组来绘制历史搜索图。
例如,可以在粒子滤波器递推更新的部分添加以下代码来记录每个时间步的状态值:
```matlab
% 递推更新
pred = zeros(length(APD), 1);
xArr = zeros(length(APD), 1);
yArr = zeros(length(APD), 1);
for i = 1:length(APD)
% 预测每个粒子的下一个状态
for j = 1:N_particles
if i > length(fittedmodel) || isempty(fittedmodel{i}) % 无拟合模型
particles(j) = particles(j) + randn * sigma_process;
else % 有拟合模型
particles(j) = feval(fittedmodel{i}, time(i)) + randn * sigma_process;
end
end
% 计算粒子的权重
for j = 1:N_particles
diff = particles(j) - APD(i);
weights(j) = exp(-diff^2 / (2*sigma_observe^2));
end
% 将所有非正数的权重设为最小值
min_weight = min(weights(weights > 0));
if isempty(min_weight)
min_weight = 1e-6; % 避免除以 0 的情况
end
min_weights = min_weight * ones(N_particles, 1);
idx_zeros =find(weights <= 0);
weights(idx_zeros) = min_weights(idx_zeros);
% 归一化权重
weights = weights / sum(weights);
% 计算预测值
pred(i) = sum(particles .* weights);
% 记录状态值
xArr(i) = truedistance(i);
yArr(i) = pred(i);
% 重采样