【问题标题】:How to create a mathematical expression in scipy?如何在 scipy 中创建数学表达式?
【发布时间】:2016-08-09 10:21:39
【问题描述】:

我一直在为一个数学项目探索 scipy 和 scipy 的核心包。

我需要对一些方程进行微积分运算......所以为了学习 scipy,我决定测试一个简单的方程 (PDF of a normal random variable)。我需要在微积分运算期间保持常量不变......而不是为其赋值。

我能够使用 sympy 成功创建它。代码如下:

from sympy import *

x = Symbol('x')
mu = Symbol('mu')
sigma = Symbol('sigma')

def normpdfeqn():
    y = exp(-(((x-mu)**2)) / (2*(sigma**2))) / (sqrt(2*pi*(sigma**2)))
    return y

print(integrate(normpdfeqn(), (x)))

并得到正确的输出:

sigma*erf(sqrt(2)*(-mu + x)/(2*sigma))/(2*sqrt(sigma**2))

然后我尝试对 scipy 做同样的事情。

我一直在阅读http://docs.scipy.org/doc/scipy/reference/tutorial/integrate.html,但不知道如何为其创建方程式。这是我到目前为止尝试过的(与上面的代码几乎相同):

from sympy import exp
from sympy import sqrt
from sympy import pi
from scipy.integrate import quad
from sympy import Symbol
x = Symbol('x')
mu = Symbol('mu')
sigma = Symbol('sigma')

def integrand():
    y = exp(-((x-mu)**2) / (2*(sigma**2))) / (sqrt(2*pi*(sigma**2)))
    return y


I = quad(integrand(), 0, 1,)
print(I)

代码可能远未完成,我不知道如何让它工作。

如果我总是使用上面显示的方程式,我应该费心学习 scipy 积分吗?还是继续使用 sympy 和 numpy?

【问题讨论】:

  • 如果你想做symbolic操作你应该使用sympy。 Scipy 进行数值操作。
  • @BrenBarn 所以,我使用 sympy 创建我的方程,然后使用lambdify(或者它是一些其他函数,不记得)他们使用带有 numpy 或 scipy 的 eqn ......这个工作流程是好吗?
  • 非常有趣。大多数人将这两种努力分开,因为它们的方程式不会经常改变。但是你打算有一个分析输入,然后代码首先进行分析分析(没有监督),然后计算数值结果?这可能是雄心勃勃的。我喜欢它。
  • @roadrunner66 我正在和我的数学教授合作一个项目,该项目通过改变一些因素来研究信号的变化。这就是为什么我的方程式会经常变化的原因。
  • @vicky96:我认为你可以这样做,是的。

标签: python python-2.7 python-3.x scipy sympy


【解决方案1】:

这个简化的代码可能是朝着您的目标迈出的一步:

它需要一个函数,这里是一个二次函数,以使事情尽可能简单,并评估其闭式积分(使用 sympy)

然后它使用 scipy 对 0 到 3 之间的整数值进行数值计算。

而闭式积分使用与 sympy 相同的极限。

它有点像原型,但似乎可以满足您的要求。

from sympy import *
from scipy.integrate import quad

x = Symbol('x')

def func():
    y = x**2 + 2*x +3
    return y

def integrand(expr):
    y = lambda x: eval(expr)
    return y 


y = repr(func())             # a str representation of the original function

res = integrate(func(), (x)) # a sympy representation of the closed form integral 
                             # of the original function

I = quad(integrand(y), 0, 3) # a scipy numerical integration of the original function

print(y)        # sympy repr of original function
print(I)        # scipy numerical integration of the original function
print()
print(res)      # sympy repr of closed form integral of original function
print(integrand(repr(res))(3) - integrand(repr(res))(0)) # closed form integer evaluation

结果输出:

x**2 + 2*x + 3
(27.0, 2.9976021664879227e-13)

x**3/3 + x**2 + 3*x
27.0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-13
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 2023-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多