如何让SymPy按MATLAB方式处理含负平方根倒数的积分?
如何让SymPy输出与MATLAB一致的含Fresnel函数的积分结果?
我正在处理如下积分函数:
import sympy as sm a,b,x = sm.symbols('a b x') f = sm.integrate(sm.cos(a*x + 0.5*b*x**2),(x,0,1))
SymPy给出的积分结果中,Fresnel S和C函数的参数包含因子1/sqrt(b),这会导致问题:当b为负数时,分母变为复数,最终引发积分结果的符号突变,但实际上该积分始终为实数(复项会抵消),且在b=0处应该是连续的。例如:
f.subs([(a,1),(b,1e-9)]).evalf() # =0.84147 f.subs([(a,1),(b,-1e-9)]).evalf() # =−0.84147
我注意到1/sqrt(b)和sqrt(1/b)在数学上等价,但后者在b为负时不会出现符号变化。目前我只能手动将SymPy表达式中Fresnel函数的参数从1.0*a/(sqrt(pi)*sqrt(b))修改为1.0*a/(sqrt(pi))*sqrt(1/b),但这种方法不够通用,无法处理更复杂的表达式。
在MATLAB符号工具箱中测试相同积分:
syms a b x real f = int(cos(a*x + 0.5*b*x^2),x,0,1)
MATLAB的积分结果中,相关项以sqrt(1/b)的形式出现在Fresnel函数参数的分子中,避免了符号突变问题。
请问如何让SymPy以与MATLAB相同的方式计算该函数?
内容的提问来源于stack exchange,提问作者SebAndSeb
相关产品推荐
相关产品推荐

