SymPy:integrate()奇怪的输出

6

我正在学习如何使用sympy,并尝试对sin函数进行简单的积分。当sin()的参数具有恒定相位常数时,integrate()的输出会给出相同的值:0。

from sympy import *
w = 0.01
phi = 0.3
k1 = integrate(sin(w*x), (x, 0.0, 10.0))
k2 = integrate(sin(w*x + 0.13), (x, 0.0, 10.0))
k3 = integrate(sin(w*x + phi),(x, 0.0, 10.0))
k1, k2, k3

(0.499583472197429, 0, 0)

有人能解释一下为什么吗?

你是如何定义 x 的? - Warren Weckesser
2
我可以针对各种 wphi 进行重现,甚至可用于不定积分。例如,integrate(sin(0.7*x + 0.1), x) 得到的结果是 0。在我看来,这似乎是个错误! - TheBamf
看起来有相当多的积分错误。(https://github.com/sympy/sympy/labels/integrals) 但是如果将w设置为symbol,它仍然会正确地进行积分。 - Lol4t0
1
当相位为 pi 的整数倍时,它似乎只有非零值。非常奇怪。 - Alex Riley
谢谢评论,但对我来说似乎也是一个错误! - user1259970
@user1259970:我刚刚又看到了这个旧问题... 有没有任何答案解决了这个问题,如果是的话,你可以接受它吗?谢谢! - Cleb
3个回答

1

这似乎是一个漏洞。一个解决方法是先获得您的积分的符号表达式(这似乎很好地工作),然后在上下限的每组参数上评估它并计算差异:

import sympy as sp
x, w, phi = sp.symbols('x w phi')

# integrate function symbolically
func = sp.integrate(sp.sin(w * x  + phi), x)

# define your parameters
para = [{'w': 0.01, 'phi': 0., 'lb': 0., 'ub': 10., 'res': 0.},
        {'w': 0.01, 'phi': 0.13, 'lb': 0., 'ub': 10., 'res': 0.},
        {'w': 0.01, 'phi': 0.3, 'lb': 0., 'ub': 10., 'res': 0.}]

# evaluate your function for all parameters using the function subs
for parai in para:
    parai['res'] = func.subs({w: parai['w'], phi: parai['phi'], x: parai['ub']})
    -func.subs({w: parai['w'], phi: parai['phi'], x: parai['lb']})

此后,para 的内容如下所示:

[{'lb': 0.0, 'phi': 0.0, 'res': 0.499583472197429, 'ub': 10.0, 'w': 0.01},
 {'lb': 0.0, 'phi': 0.13, 'res': 1.78954987094131, 'ub': 10.0, 'w': 0.01},
 {'lb': 0.0, 'phi': 0.3, 'res': 3.42754951227208, 'ub': 10.0, 'w': 0.01}]

似乎能够为积分提供合理的结果,并将这些结果存储在 res 中。

您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - user1259970
好的,是的,我理解你的困惑。正如asmeurer在下面所说的那样,这似乎只发生在Python 2中,并且该错误将在下一个版本中修复。感谢指出这个错误;我偶尔使用sympy,现在会更加小心了。 - Cleb

0

我能建议使用numpy进行数值积分吗?

>>> import numpy as np
>>> w = 0.01
>>> phi = 0.3
>>> dt = 0.01
>>> t = 2*np.pi*np.arange(0,1,dt)
>>> np.sum( np.sin(t)*dt)
-1.0733601507606494e-17
>>> np.sum( np.sin(t+ phi)*dt)
2.5153490401663703e-17

这些数字基本上接近于0。确切的数字取决于我们选择的网格dt和移位phi(以及np.sin的精度)的影响。

为了更符合您的示例:

>>> t = np.arange(0,10,dt)
>>> w = 0.01
>>> phi = 0.3
>>> np.sum( np.sin(w*t)*dt)
0.4990843046978698
>>> np.sum( np.sin(w*t + phi)*dt)
3.4270800187375658
>>> np.sum( np.sin(w*t + 0.13)*dt)
1.7890581525454512

正如使用Sympy在Python中集成所引用的那样,对于数值计算来说,使用符号库是一个不好的选择


谢谢,你说得对。我并不想使用sympy来解决数值问题,只是想学习如何使用sympy。这个例子非常简单,让我感到非常惊讶。 - user1259970

0

我刚在 SymPy 的开发版本中运行了你的代码,得到了 (0.499583472197429, 1.78954987094131, 3.42754951227208)。所以看起来这个 bug 将会在下一个版本中被修复。

同时看起来这个 bug 只存在于 Python 2 中。当我使用 Python 3 时,即使是最新的稳定版本(0.7.6.1),我也得到了相同的答案。


谢谢asmeuser。我不确定这是否是一个错误,因为我已经检查并验证了我正在使用Python 3.4.4(在Anaconda 2.1.0上),而且根据init_session()的说法,sympy版本是0.7.6.1。我已经尝试了“SymPy Live Shell”交互式系统,位于SymPy网站,但我仍然得到了相同的结果:(0.499583472197429,0,0)。 - user1259970
1
你能试一下GitHub上的sympy版本吗? - asmeurer
是的,来自 GitHub 的 sympy 版本(SymPy 0.7.7.dev)已经修复了这个问题。谢谢! - user1259970

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接