Sympy:integrate()奇怪的输出

时间:2016-01-17 20:07:48

标签: python sympy

我正在学习如何使用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)

有人能解释我为什么吗?

3 个答案:

答案 0 :(得分:0)

这似乎是个错误。解决方法可能是首先获得积分的符号表达式(这似乎工作正常),然后在上限和下限对每组参数进行评估并计算差异:

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

中存储的整合提供了合理的结果

答案 1 :(得分:0)

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

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

答案 2 :(得分: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

引用Integrating in Python using Sympy ,使用符号库进行数值工作是一个坏主意