对于一个项目,我正在尝试从 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