Sympy:整合()奇怪的输出
Sympy: integrate() strange output
我刚刚在学习如何使用 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)
有人能解释一下为什么吗?
这似乎是一个错误。一个变通的解决方案可能是首先获得积分的符号表达式(这似乎工作正常),然后在上限和下限对每组参数进行评估并计算差异:
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
中的集成提供了合理的结果
我只是 运行 你在 SymPy 开发版本中的代码,我得到了 (0.499583472197429, 1.78954987094131, 3.42754951227208)
。所以看来这个bug会在下个版本修复。
看起来这个错误也只出现在 Python 2 中。当我使用 Python 3 时,即使使用最新的稳定版本 (0.7.6.1),我也会得到相同的答案。
我可以推荐使用 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 中引用 使用符号库进行数值计算是个坏主意
我刚刚在学习如何使用 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)
有人能解释一下为什么吗?
这似乎是一个错误。一个变通的解决方案可能是首先获得积分的符号表达式(这似乎工作正常),然后在上限和下限对每组参数进行评估并计算差异:
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
我只是 运行 你在 SymPy 开发版本中的代码,我得到了 (0.499583472197429, 1.78954987094131, 3.42754951227208)
。所以看来这个bug会在下个版本修复。
看起来这个错误也只出现在 Python 2 中。当我使用 Python 3 时,即使使用最新的稳定版本 (0.7.6.1),我也会得到相同的答案。
我可以推荐使用 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 中引用 使用符号库进行数值计算是个坏主意