均方根信息滤波(SRIF)测试(一)

本文介绍了SRIF(均方根信息滤波)的基础概念,并展示了如何使用Householder变换进行上三角分解,接着通过Cholesky分解和反向替换求解逆上三角矩阵。此外,还提供了SRIF的测试代码,用于估计数据中的参数并比较真实值和估计值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

均方根信息滤波(Square Root Information Filter)由于具有更好的数值稳定性而被广泛使用。参考Gerald J.Bierman的Factorization Methods for Discrete Sequential Estimation 对SRIF的基本原理进行了学习,并完成了SRIF的仿真数据测试,该方法在实现中暂未考虑状态方程的过程噪声,因此仅仅适用于不随时间变化的参数估计问题。数据仿真采用的是抛物线y=ax^2 + bx + c;其中a=3.2,b=1.2,c=3.0。对其中的参数a、b和c进行参数估计。仿真噪声服从0均值,标准差为1.2的正态分布。其测试结果如下:
图片
图片
 


其中进行SRIF滤波解算的代码如下:


double randn(double myu, double sig)

{

    double PI = 3.14159265357;

    double a,b;

    a=((double)rand()+1.0)/((double)RAND_MAX+1.0);  

    b=((double)rand()+1.0)/((double)RAND_MAX+1.0);  

    return myu+sqrt(-2.0*log(a))*sin(2.0*PI*b)*sig;

}


void HouseholderUpperTri( double* M,int num_of_row, int num_of_column )

{

    int colcount = 0;

    int m = num_of_row;

    int n = num_of_column;

    double* A = M ; 

    int test = num_of_row<=num_of_column?(m-1):(n-1);

    double *u = new double[num_of_row];

    

    while( A != NULL )

    {

        if( colcount >= test+1 )

        {

            break;

        }

        

        double s =0.0 ,s1 =0.0,b =0.0,r = 0.0 ;

        int t =0 , i =0, j = 0 ;

        if( *A >= 0 ) t = 1;

        else if( *A < 0 ) t =-1;

        for( i = 0; i<m;i++ )

        {

            s1+=  (*(A+i*num_of_column ))*(*(A+i*num_of_column ));

        }

        s = -t*sqrt(s1); 

        memset(u,0,sizeof(double)*num_of_row);

        for( i =0 ; i<m; i++ )

        {

            if( i == 0 )

            {

                u[i] = *A - s;

            }

            else

            {

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值