在SymPy中取符号表达式的系数四舍五入

2024-09-30 20:24:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在尝试使用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(给定的分数),但它不能返回任何内容。标准的舍入函数也不能处理符号表达式。在


Tags: 方法函数re内容标准表达式符号分子
1条回答
网友
1楼 · 发布于 2024-09-30 20:24:08

舍入部分已经在Printing the output rounded to 3 decimals in SymPy中处理过了,所以我不再重复我的答案,集中精力而不是去掉系数的虚部。在

方法1

您可以简单地执行re(expr),其中expr是您的表达式。但要使其工作,必须知道w是一个实变量;否则SymPy就无法判断(3+4*I)*w的实部是什么。(除非另有说明,否则假设symphy符号是复杂的。)这将完成以下工作:

w = symbols('w', real=True)
expr = # your formula
expr = re(expr)

方法2

如果因为某种原因你不能做到以上。。。另一种略带侵入性的方法是将I替换为0:

^{pr2}$

这假设表达式已经是展开形式(如图所示),因此没有(3+4*I)**2;否则结果将是错误的。在

方法3

一种比2更稳健的方法,但专门用于多项式:

expr = Poly([re(c) for c in Poly(expr, w).all_coeffs()], w).as_expr()

在这里,表达式首先被转换成w中的多项式(这在您的示例中是可能的,因为它具有多项式形式)。然后取每个系数的实部,并从中重建多项式。如果需要,最后一部分as_expr()将其返回到表达式形式。在

不管怎样,表达式的输出:

-1.705768*w**18 + 14.702976409432*w**16 - 28.7694094371724*w**14 + 59.0191623753299*w**12 + 24.7015297857594*w**10 - 549.093511217598*w**8 + 1345.40434657845*w**6 - 1594.14046181284*w**4 + 980.58940367608*w**2 - 254.8428594382

相关问题 更多 >