我正在学习如何使用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)
有人能解释我为什么吗?
答案 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 ,使用符号库进行数值工作是一个坏主意