matlab中如何解决argmin问题_MATLAB仿真中的变量单双精度问题

在MATLAB仿真过程中遇到变量精度问题,导致解算结果异常。通过检查发现在姿态更新函数insupdate中,位置增量虽非零但因单精度处理被误认为0。将速度向量vn转换为双精度后,解算结果正确但速度变慢。问题源于单精度数据处理的精度限制,但具体原因尚不明朗。
摘要由CSDN通过智能技术生成

0c81657aadafe7a00373dfd73ad823df.png

MATLAB 默认采用双精度进行数据计算,在使用MATLAB时也不会注意到每个变量的具体类型。最近用MATLAB跑捷联惯导静态仿真时却出现了问题。

首先用光纤惯导在静止条件采集了6000s以上的数据:

726f330458d30d3a13fde9202d25d51d.png

然后利用惯导数据进行惯导解算,得到的解算结果如下图:

78e1788a22397a04c1bd56ee9057bc2f.png

虽然存在明显的姿态和速度误差,但是位置输出却没有误差。然后我又换用严老师的捷联惯导工具箱做惯导解算,结果得到的速度误差相同,位置误差同样为0。

为了查明原因,在姿态更新函数insupdate中位置更新部分中断检查。函数源码如下:

function [ qnb, vn, pos, eth ] = insupdate( qnb, vn, pos, wm, vm, ts )
%   纯惯导更新函数
%   输入:qnb 姿态四元数, vn 速度, pos 位置(纬经高), wm 陀螺角增量, vm速度增量, ts采样周期 
    nn = size(wm,1); nts = nn*ts;
    [phim, dvbm] = cnscl([wm, vm],1);
    eth = earth(pos, vn);
    vn1 = vn + rv2m(-eth.wnin*nts/2)*qmulv(qnb, dvbm) + eth.gcc*nts;
    vn  = (vn+vn1)/2;
    pos = pos + [vn(2)/eth.RMh; vn(1)/eth.clRNh; vn(3)]*nts;  vn = vn1;
    qnb = qmul(rv2q(-eth.wnin*nts), qmul(qnb, rv2q(phim)));
    qnb = qnormlz(qnb);
end

惯导解算中,位置增量[vn(2)/eth.RMh;vn(1)/eth.clRNh;vn(3)]*nts并不为零,但是位置向量pos在加上位置增量后却依然是0。检查发现位置增量是“3×1 single 列向量”,速度向量vn也是单精度。在位置更新前加入“vn = double(vn)”后得到的导航解算结果如下:

e7a9eb201c9c058ac8df1956d05f0ad5.png

位置误差已经正常,但是解算速度也变慢了。

位置增量大约是10^-10量级,即使使用单精度存储数据,也不应当直接按0处理,虽然解决了这个问题,但是还不清楚具体的原因。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值