首页 > 解决方案 > 在 C# 中使用 alglib 进行双线性变换的计算错误

问题描述

对于一个项目,我正在尝试从 z 变换到 s 变换。为此,我编写了使用双线性变换的代码,并使用 Matlab 检查了结果。不幸的是,他们错了,我没有看到错误。也许有人可以帮助我提示。

public double[]  BiliTransf(double[] a, double Ts)
{
    int n = a.Length;
    double[] bil_p = { 2, Ts };
    double[] bil_m = { 2, -Ts };

    init[0] = 1;
    for (int i = 1; i < n; i++)
    {
         init[i] = 0;
    }
    int j;
    for (int i=0; i<n; i++)
    {
        // (1+s)^i
        s_p = init;
        for (j = 0; j < i; j++)
        {
            alglib.convr1d(s_p, 1+j, bil_p, 2, out s2_p);
            s_p = s2_p;
        }
        // (1-s)^n-1-i
        s_m = init;
        for (j = 0; j < n-1-i; j++)
        {
            alglib.convr1d(s_m, 1+j, bil_m, 2, out s2_m);
            s_m = s2_m;
        }

        // s_m * s_p
        alglib.convr1d(s_m, s_m.Length, s_p, s_p.Length, out s2_m);
        VektorMulti(ref s2_m,  a[n-1-j]);
        VektorAddV2ToV1(ref a_cont, ref s2_m);
    }
    return a_cont;
}

调用 C# Fbk:

a_tf = sv.BiliTransf(new double { 1, 0.5, 0.1}, 0.05);
a_tf[0]/a_tf[0] ; a_tf[0]/a_tf[1] ; a_tf[0]/a_tf[2]);

结果:a0:1 / a1:-35,56 / a2:4266,67

调用 Matlab:

H = tf([1 0.5 0.1],[1 0.5 0.1 ],0.05)
sysc = d2c(H, 'tustin')

结果:a0:1 / a1:120 / a2:4267

标签: c#alglib

解决方案


推荐阅读