如何检查如果两个传输函数是相同的吗?

50个视图(30天)
我想确认两个传输函数是相等的。
例如:
Kc = 0.4262;Ti = 1.35;
C1 = pidstd (Kc, Ti);
特遣部队(C1)
s =特遣部队(“年代”);
Gc1 = Kc * (1 + 1 / (Ti * s))
断言(tf (C1) = = Gc1)
提出了:
未定义操作符“= =”类型的输入参数“特遣部队”。
还要注意:
Gc1
特遣部队(C1)
Gc1——特遣部队(C1)
Gc1 =
0.5754 + 0.4262
- - - - - - - - - - - - - - - - - -
1.35秒
连续时间传递函数。
ans =
0.4262 + 0.3157
- - - - - - - - - - - - - - - - - -
年代
连续时间传递函数。
ans =
0
静态增益。

接受的答案

沃尔特·罗伯森
沃尔特·罗伯森 2020年8月12日
编辑:沃尔特·罗伯森 2020年8月12日
isequal (tfdata (tf (C1)——Gc1), {[0]})
这可能会失败如果有延迟的特遣部队。
5个评论
沃尔特·罗伯森
沃尔特·罗伯森 2020年8月12日
tf蓄意将通常用于数组,数量的输入输出的数量。所以tfdata旨在返回分子分开每个tf的数组元素的形式,与一般的元素不是彼此相同的长度。系数,而不是建立一个多维数组第一个或最后一个维度是垫最长的分子,和每个元素的前导零最长匹配分子,tfdata函数简单地创建一个单元阵列的分子,如arrayfun tfdata '制服,0。在标量特遣部队的情况下,给你一个标量单元阵列。tfdata没有特殊情况,标量细胞提取内容。

登录置评。

更多的答案(2)

比尔Tubbs
比尔Tubbs 2020年8月12日
编辑:比尔Tubbs 2020年8月12日
有一个 回答Stackoverflow :
然而,它并不直接在我的例子中:
isequal (tf (C1), Gc1)
ans =
逻辑
0
分子和分母,所以他们需要因素是相同的,然后工作原理:
因素= Gc1.denominator {1} (1)
Gc1_factored =特遣部队(Gc1.num{1} /因素,Gc1.den{1} /因素)
isequal (Gc1_factored特遣部队(C1))
系数=
1.3500
Gc1_factored =
0.4262 + 0.3157
- - - - - - - - - - - - - - - - - -
年代
连续时间传递函数。
ans =
逻辑
1
5个评论
比尔Tubbs
比尔Tubbs 2020年11月6日
我认为值得强调的是,如果使用 zpk 平等检查期间,重要的是要还将回到前tf减法在上面评论保罗说。否则,你可以得到一些数值错误侵入。
如。
> > zpk (tf (1, 2 [1]))——zpk (tf (1, 2 [1]))
ans =
1.1102 e-16
- - - - - - - - - - -
(s + 0.5) ^ 2
连续时间零/钢管/增益模型。
> >特遣部队(zpk (tf(1, 2[1])))——特遣部队(zpk (tf (1, 2 [1])))
ans =
0
静态收益。
与如何处理减法zpk对象相比,也许tf对象。

登录置评。


比尔Tubbs
比尔Tubbs 2020年11月6日
编辑:比尔Tubbs 2020年11月6日
根据上面的评论保罗我提供这些函数作为一个解决方案:
函数c = is_equal_tf (G1, G2)
c = almost_zero_static_gain_tf (G1, G2);
结束
函数c = almost_zero_static_gain_tf (G)
(~ ~ k) = zpkdata (G);
c = abs (k) < 1平台以及;
结束
显然,不处理延迟。
它通过以下测试:
断言(is_equal_tf(特遣部队(“年代”),特遣部队(“年代”)))
断言(is_equal_tf (tf(1, 1),特遣部队(1,1)))
断言(is_equal_tf (tf(2, 1[2]),特遣部队(0.5 [1])))
断言(~ is_equal_tf (tf(2.1, 2[1]),特遣部队(0.5 [1])))
断言(is_equal_tf (tf (2, conv(2[1],[1] 5日)),特遣部队(2 (10 7 1))))
断言(~ is_equal_tf (tf (2, conv(2[1],[4 1])),特遣部队(2 (10 7 1))))
断言(is_equal_tf (tf(1, 2[1])——特遣部队(1、1[5]),特遣部队([3 0],[10 7 1])))
断言(is_equal_tf (pidstd(0.42, 1.35), 0.42 *(1 + 1) /(1.35 *特遣部队(“年代”)))))
G1 =特遣部队(rss (5));G2 = G1;
断言(is_equal_tf (G1, G2))
G2。num {1} = G2.num{1} *π;
G2.den {1} = G2.den{1} *π;
断言(is_equal_tf (G1, G2))
任何异常或其他情况下我应该测试?
4评论
比尔Tubbs
比尔Tubbs 2020年11月7日
编辑:比尔Tubbs 2020年11月7日
我唯一知道的是象征性的。有一个漂亮的功能, tf2sym sym2tf 在这个 包由奥斯卡·威韦罗曾Osornio 将与象征功能。然后你可以得到它在一种由眼睛可比,按照你的建议:
> > tf2sym (G1)
ans =
(34 * s + 1) / (220 * s ^ 2 + 54 * s + 2)
> >因子(tf2sym (G1))
ans =
(1/2,34 * s + 1, 1 / (5 * s + 1), 1 / (22 * s + 1))
我不喜欢用这种方法是需要不断切换tf和象征性的,总是在同一个脚本重新定义年代。

登录置评。

类别

找到更多的在动态系统模型帮助中心文件交换

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!