我可以在Matlab中扩展“嵌套”符号函数吗?

时间:2014-02-11 18:37:22

标签: matlab symbolic-math

我正在尝试模拟不同过滤器“构建块”对系统的影响,该系统是基于这些过滤器的构造。 我希望基本的过滤器是“模块化的”,即它们应该是“可替换的”,而不是重写基于基本过滤器的构造。

例如,我有一个过滤器系统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而言。

有什么建议吗?非常感谢提前。

编辑 - 一些澄清:

  • 实际上,我有10-20个传输函数,如G_0和G_1,所以我试图避免每次更改基本块H_0和H_1时重新声明所有这些函数。基本块H_0和H_1实际上的程度远高于此处的示例。
  • G_0和G_1在声明后不会改变,只有H_0和H_1会。
  • H_0(z^2)表示使用z ^ 2作为H_0(z)的参数。因此,无论z出现在H_0的声明中,都应插入z ^ 2
  • 所需的输出是z的函数,而不是H_0和H_1。
  • 可行的hack有一个包含构造声明的m-File(本例中为G_0和G_1),每次重新定义H_0和H_1时都会运行该声明。我想知道是否有一种更优雅的方式,就像上面显示的(非工作)代码一样。

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_0H_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。