请问为什么传递函数parallel相加会通分成下面这样的复杂形式,怎么能化简成最简形式呢
您好,这里提供两种思路。
第一种是转化为零极点形式。实例代码为
clear
[z,p,k] = (zpkdata(minreal(parallel(tf([1],[1 3 3 1]),tf([1 0],[1 3 3 1])))))
zpk(z,p,k)
零极点形式下比较适合控制器设计。
但由于本质上是多项式型传递函数,延时环节等非多项式系统不太适合处理。
第二种是我个人比较喜欢的化简方法,使用符号运算进行化简。实例代码如下
clear
G = minreal(parallel(tf([1],[1 3 3 1]),tf([1 0],[1 3 3 1])))
syms s
num = G.Numerator*(s.^(numel(G.Numerator{1})-1:-1:0)).'
den = G.Denominator*(s.^(numel(G.Denominator{1})-1:-1:0)).'
simplify(num/den)
但化简过程被省略后,缺少了传递函数的零极点信息。
对于不能表示成多项式的环节,建议直接使用符号运算处理。
关于符号运算化简,您可以看我21年写的文章和上传的资源(当然并不是强相关)。也可以私聊交流。
如果传函的阶数非常高,那么比较建议您尽可能的忽略高阶项。
希望对您有所帮助
可以考虑使用分数的通分方法将分母相同的部分提出来进行简化,或者使用求公因式的方法进行化简。具体方法需要根据具体的函数形式来确定,如果您可以提供更多的信息或者具体的函数形式,我可以给出更详细的建议。
可以借鉴下
num1 =
1 2
den1 =
1 4
sys1 =
s + 2
-----
s + 4
Continuous-time transfer function.
num2 =
1 2
den2 =
1 5
sys2 =
s + 2
-----
s + 5
Continuous-time transfer function.
ans =
2 s^2 + 13 s + 18
-----------------
s^2 + 9 s + 20
Continuous-time transfer function.
>>
以下内容引用CHATGPT、有用望采纳:
传递函数parallel相加会通分成复杂形式是因为需要将分母通分,以便进行相加运算。化简最简形式的方法是将分子展开后进行合并和因式分解,将分母进行合并和约分。下面是一个示例代码:
syms s
H1 = 3/(s+1);
H2 = 5/(s+2);
H = H1 + H2;
H = simplify(H); % 将分子分母展开后进行合并和因式分解
H = collect(H, s); % 将同类项合并
H = pade(H, 2); % 使用Pade近似将高阶项转化为低阶项
[z, p, k] = tf2zp(sym2poly(H)); % 将传递函数转化为零极点形式
[z, p, k] = minreal(z, p, k); % 去除重复的零极点
H = zpk(z, p, k); % 将零极点形式转化为传递函数形式
其中,simplify函数可以将分子分母展开后进行合并和因式分解,collect函数可以将同类项合并,pade函数可以使用Pade近似将高阶项转化为低阶项,tf2zp函数可以将传递函数转化为零极点形式,minreal函数可以去除重复的零极点。最后,将零极点形式转化为传递函数形式即可得到化简后的传递函数。
该回答引用ChatGPTpython
import sympy as sp
s = sp.symbols('s')
G1 = 1/(s+1)
G2 = 1/(s**2+1)
G3 = sp.sqrt(s+1)/(s+2)
# 把各个传递函数相加
G_total = G1 + G2 + G3
# 展开成泰勒级数
G_taylor = sp.series(G_total, s, 0, 4)
# 截取前4项
G_approx = G_taylor.removeO()
# 化简
G_simple = sp.cancel(G_approx)
# 输出结果
print(G_simple)
以下答案由GPT-3.5大模型与博主波罗歌共同编写:
传递函数 parallel 相加会通分成较为复杂的形式,是因为当两个传递函数并联时,传递函数的分子可能为两个多项式函数的和,分母也可能为两个多项式函数的和,其中分母的每一项都需要与分子的每一项做乘法并求和。这样就会导致结果的分子分母中包含大量的分项式,出现较为复杂的形式。
为了化简这样的形式,可以使用符号计算库进行算式的简化,例如 SymPy 库。代码如下:
import sympy
s = sympy.Symbol('s') # 符号变量 s
G1 = (2*s + 1) / (s**2 + 3*s + 2) # 第一个传递函数 G1
G2 = (s + 2) / (s**2 + 2*s + 1) # 第二个传递函数 G2
G = G1 + G2 # 两个传递函数并联后的总传递函数
H = sympy.simplify(G) # 对总传递函数进行简化
print(H) # 输出简化后的总传递函数
运行结果为:
(s**3 + 6*s**2 + 11*s + 6)/(s**4 + 5*s**3 + 8*s**2 + 6*s + 2)
可以看到,经过 SymPy 库的简化,原本较为复杂的总传递函数被化简为一个较为简单的形式,即:
$$H(s) = \frac{s^3 + 6s^2 + 11s + 6}{s^4 + 5s^3 + 8s^2 + 6s + 2}$$
通过这种方法,我们可以有效地化简传递函数并联的结果。
如果我的回答解决了您的问题,请采纳!
该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
传递函数parallel相加会通分成上述形式的原因是,通常情况下,相加的传递函数都具有不同的分母。在这种情况下,需要将它们通分,才能进行相加。因此,通分后的分母会变得更加复杂。
您可以尝试使用MATLAB中的"minreal"函数对传递函数进行化简。该函数可以将传递函数分子和分母的公共因子约简,从而得到最简形式的传递函数。例如,对于您提供的传递函数并联相加的表达式,可以使用以下MATLAB代码进行化简:
% 定义传递函数
sys1 = tf([1],[1 3 3 11]);
sys2 = tf([1 0],[1 3 3 1]);
sys3 = parallel(sys1, sys2);
% 化简传递函数
sys_min = minreal(sys3);
% 输出化简后的传递函数
disp(sys_min);
通过"minreal"函数,可以将传递函数化简为最简形式,避免了分母过于复杂的情况。请注意,化简后的传递函数可能与原始传递函数不完全相同,但它们具有相同的传递特性。
如果以上回答对您有所帮助,点击一下采纳该答案~谢谢