我目前正在尝试使用Python中的符号计算来计算模拟滤波器的负群延迟。我现在要解决的问题是去掉一些很小的虚系数。在
例如,考虑带有此类分子的分数(虚数部分用粗体表示):
1.705768*宽18+14.702976409432*宽16+16+强>1.06581410364015e-14*I*w^15-28.7694044371724*w^14-9.94759830064144e-14*I*w^13+59.0191623753299*w 12+<16强>5.68434181860808E-14*I*w^11+24.7015297757594*w^10+24.70124.97757594*w^10-1.136868377777714*I*I*w.13[强>1.1368683777777777777.1.361.361 21616E-13*I*w^9-549.093511217598*w^8-5.6843418860808e-14*I*w^7+1345.40434657845*w^6+2.27373675443232e-13*I*w^5-1594.14046181284*w^4-1.13686837721616e-13*I*w^3+980.58940367608*w^2-254.8428594382)
有没有办法自动舍入这些小系数,使它们等于0(一般来说,任何可忽略的值)?或者至少,我可以用某种方法过滤掉虚数吗?我尝试过使用re(给定的分数),但它不能返回任何内容。标准的舍入函数也不能处理符号表达式。在
舍入部分已经在Printing the output rounded to 3 decimals in SymPy中处理过了,所以我不再重复我的答案,集中精力而不是去掉系数的虚部。在
方法1
您可以简单地执行
re(expr)
,其中expr是您的表达式。但要使其工作,必须知道w是一个实变量;否则SymPy就无法判断(3+4*I)*w
的实部是什么。(除非另有说明,否则假设symphy符号是复杂的。)这将完成以下工作:方法2
如果因为某种原因你不能做到以上。。。另一种略带侵入性的方法是将I替换为0:
^{pr2}$这假设表达式已经是展开形式(如图所示),因此没有
(3+4*I)**2
;否则结果将是错误的。在方法3
一种比2更稳健的方法,但专门用于多项式:
在这里,表达式首先被转换成
w
中的多项式(这在您的示例中是可能的,因为它具有多项式形式)。然后取每个系数的实部,并从中重建多项式。如果需要,最后一部分as_expr()
将其返回到表达式形式。在不管怎样,表达式的输出:
相关问题 更多 >
编程相关推荐