【问题标题】:Sympy: integrate() strange outputSympy:集成()奇怪的输出
【发布时间】:2016-01-19 05:13:53
【问题描述】:

我只是在学习如何使用 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的?
  • 我可以为各种wphi 重现这个,甚至是不定积分。例如,integrate(sin(0.7*x + 0.1), x) 给出0。对我来说看起来像一个错误!
  • 它似乎有相当多的整体错误。 (github.com/sympy/sympy/labels/integrals) 如果w 设置为symbol,它仍然可以正确集成
  • 只有当相位是 pi 的整数倍时,它似乎才非零。很奇怪。
  • 感谢 cmets,但这对我来说似乎也是一个错误!。

标签: python sympy


【解决方案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中的集成提供了合理的结果

【讨论】:

  • 感谢您的解决方法,我验证了在 sin() 和 cos() 中象征性地开发表达式并在最后进行评估工作正常,但我对这种行为感到非常惊讶,我不明白为什么。
  • 好的,是的,我理解这种困惑。正如 asmeurer 下面所说,它似乎只发生在 Python 2 中,并且该错误将在下一个版本中修复。感谢您指出这个错误;我不时使用 sympy,现在会更加小心。
【解决方案2】:

我刚刚在 SymPy 的开发版本中运行了你的代码,我得到了(0.499583472197429, 1.78954987094131, 3.42754951227208)。因此,似乎该错误将在下一个版本中修复。

看起来这个错误只存在于 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 web site 上尝试了“SymPy Live Shell”交互系统,再次得到相同的结果:(0.499583472197429,0,0)
  • 你可以试试 GitHub 的 sympy 版本吗?
  • 是的,来自 GitHub 的 sympy 版本 (SymPy 0.7.7.dev) 解决了这个问题。谢谢!!
【解决方案3】:

我可以推荐使用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。确切的数字是我们选择mesh dt和shift 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 来解决数值问题并不是为了学习如何使用 sympy 而这个例子太天真了,我真的很惊讶。
猜你喜欢
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
  • 2013-10-04
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
  • 2015-02-18
  • 2011-06-14
相关资源
最近更新 更多