使用sympy计算传递函数拉普拉斯逆变换出现RisingFactorial报错如何解决
报错根因
sympy的符号拉普拉斯逆变换要求运算过程中所有多项式系数为精确数值(整数、有理数),你当前传递函数里全是浮点系数,极小值的浮点还存在精度误差,导致符号运算过程中生成了非整数阶的特殊函数表达式RisingFactorial,无法继续运算就抛出了该错误。
解决方法
方法1:将浮点系数转换为精确有理数后再运算
利用sympy的nsimplify或者Rational把所有浮点系数转成精确的有理数值,同时可以先把延迟项e^(-2s)单独提取,利用拉普拉斯延迟特性简化运算:
import sympy as sp s = sp.symbols('s') t = sp.symbols('t', positive=True) # 定义传递函数时先转精确有理数 num = sp.nsimplify(1.0e-8 * s + 0.02) * sp.exp(-2*s) den = sp.nsimplify(s * (1.0e-11 * s**2 + 2.0000003e-5 * s + 0.00177)) wtl = num / den # 先提取延迟项,计算无延迟部分的逆变换 no_delay_part = sp.nsimplify((1.0e-8 * s + 0.02) / (s * (1.0e-11 * s**2 + 2.0000003e-5 * s + 0.00177))) inv_no_delay = sp.inverse_laplace_transform(no_delay_part, s, t, noconds=True) # 应用延迟特性,替换t为t-2,乘以阶跃函数 wtl_t = inv_no_delay.subs(t, t-2) * sp.Heaviside(t-2)
方法2:直接用数值方法计算逆变换结果
如果你不需要符号解析解,只需要数值结果,用scipy的信号处理库运算效率更高,完全不会有符号运算的兼容性问题:
import numpy as np from scipy import signal import matplotlib.pyplot as plt # 定义传递函数系数 num = [1.0e-8, 0.02] den = [1.0e-11, 2.0000003e-5, 0.00177, 0] # 构建系统 sys = signal.TransferFunction(num, den) # 计算阶跃响应,时间范围覆盖延迟时段 t = np.linspace(0, 10, 1000) t_out, y_out = signal.step(sys, T=t) # 应用2s延迟 y_out[t_out < 2] = 0 # 直接得到各时刻的数值结果 print(y_out)
内容的提问来源于stack exchange,提问作者Gino
相关产品推荐
相关产品推荐

