我正在尝试模拟不同过滤器“构建块”对系统的影响,该系统是基于这些过滤器的构造。 我希望基本的过滤器是“模块化的”,即它们应该是“可替换的”,而不是重写基于基本过滤器的构造。
例如,我有一个过滤器系统G_0,G_1,它是根据一些名为H_0和H_1的基本过滤器定义的。
我正在尝试执行以下操作:
syms z
syms H_0(z) H_1(z)
G_0(z)=H_0(z^(4))*H_0(z^(2))*H_0(z)
G_1(z)=H_1(z^(4))*H_0(z^(2))*H_0(z)
这声明了我想要使用的z域,以及基于基本过滤器H_0,H_1的两个过滤器G_0,G_1的构造。
现在,我正在尝试根据一些基本过滤器来评估构造:
H_1(z) = 1+z^-1
H_0(z) = 1+0*z^-1
此时我想得到的是z的扩展多项式。 例如。对于上面的声明,我希望看到G_0(z)= 1,并且G_1(z)= 1 + z ^( - 4)。
我尝试过像“subs(G_0(z))”,“formula(G_0(z))”,“formula(subs(subs(G_0(z))))”这样的东西,但我一直在得到结果就H_0和H_1而言。
有什么建议吗?非常感谢提前。
编辑 - 一些澄清:
H_0(z^2)
表示使用z ^ 2作为H_0(z)
的参数。因此,无论z出现在H_0的声明中,都应插入z ^ 2 答案 0 :(得分:0)
这看起来效果很好,并且非常容易扩展。我仅将H_0
重新定义为H_1
作为示例。
syms z
H_1(z) = 1+z^-1;
H_0(z) = 1+0*z^-1;
G_0=@(Ha,z) Ha(z^(4))*Ha(z^(2))*Ha(z);
G_1=@(Ha,Hb,z) Hb(z^(4))*Ha(z^(2))*Ha(z);
G_0(H_0,z)
G_1(H_0,H_1,z)
H_0=@(z) H_1(z);
G_0(H_0,z)
G_1(H_0,H_1,z)
答案 1 :(得分:0)
这似乎是命名空间问题。您无法根据任意/抽象symfun
来定义符号表达式或函数,然后明确定义这些symfun
并能够使用它们来获取原始符号的漏洞利用形式表达或功能(至少不容易)。这是一个如何用名称替换符号函数的例子:
syms z y(z)
x(z) = y(z);
y(z) = z^2; % Redefines y(z)
subs(x,'y(z)',y)
不幸的是,这种方法依赖于指定要被替换的函数 - 因为使用了字符串,Matlab将具有不同参数的任意/抽象symfun
视为不同的函数。因此,以下示例不起作用,因为它返回y(z^2)
:
syms z y(z)
x(z) = y(z^2); % Function of z^2 instead
y(z) = z^2;
subs(x,'y(z)',y)
但如果最后一行改为subs(x,'y(z^2)',y)
,那么它就可以了。
所以一个选项可能是为case创建字符串,但这看起来过于复杂和不优雅。我认为,仅仅不明确地(重新)定义你的任意/抽象H_0
,H_1
等函数并使用其他变量更有意义。就简单的例子而言:
syms z y(z)
x(z) = y(z^2);
y_(z) = z^2; % Create new explicit symfun
subs(x,y,y_)
返回z^4
。对于您的代码:
syms z H_0(z) H_1(z)
G_0(z) = H_0(z^4)*H_0(z^2)*H_0(z);
G_1(z) = H_1(z^4)*H_0(z^2)*H_0(z);
H_0_(z) = 1+0*z^-1;
H_1_(z) = 1+z^-1;
subs(G_0, {H_0, H_1}, {H_0_, H_1_})
subs(G_1, {H_0, H_1}, {H_0_, H_1_})
返回
ans(z) =
1
ans(z) =
1/z^4 + 1
然后,您可以随意更改H_0_
和H_1_
等,然后再次使用subs to evaluate
G_1 and
G_2。