【问题标题】:Using scipy to integrate a function?使用 scipy 集成一个功能?
【发布时间】:2017-03-10 11:19:37
【问题描述】:

我正在尝试使用 SciPy 来集成这个功能:

y(x) = (e^-ax)*cos(x) 介于 0 和 4pi 之间。

这是我目前的代码:

from numpy import *
from scipy.integrate import simps
a = 0 
x = linspace(0 , 4*pi, 100)
y = (e^-(a*x))*cos(x)
integral_value = simps(y,x)
print integral_value

但它似乎不起作用。任何帮助将不胜感激,谢谢!

【问题讨论】:

  • “似乎不起作用”不是提问的正确方式。告诉我们出了什么问题,例如错误消息或与您的期望不符的值。

标签: python scipy


【解决方案1】:

如果你运行程序,你会得到以下错误:

TypeError: 输入类型不支持 ufunc 'bitwise_xor',并且根据强制转换规则 ''safe'' 无法安全地将输入强制转换为任何支持的类型

所以你知道问题出在你的函数中的^(按位异或)。在 Python 中,使用** 取指数

如果有人写:

y = (e**-(a*x))*cos(x)

取而代之的是:

>>> print integral_value
-0.000170200006112

完整程序:

from numpy import *
from scipy.integrate import simps
a = 0 
x = linspace(0 , 4*pi, 100)
y = (e**-(a*x))*cos(x)
integral_value = simps(y,x)
print integral_value

您还可以通过以下方式显式使用numpy 函数:

from numpy import *
from scipy.integrate import simps
a = 0 
x = linspace(0 , 4*pi, 100)
y = exp(-a*x)*cos(x)
integral_value = simps(y,x)
print integral_value

为了提高精度,可以增加点数(100不是那么多)。

【讨论】:

  • 我认为辛普森没有必要。
  • @BillBell:象征性地整合它确实很容易。但人们也可能对数值积分的稳定性感兴趣。或者比如Monte Carloquasi Monte Carlo整合的效果是什么。
【解决方案2】:
import numpy as np
import math
from scipy.integrate import simps
a = 0
x = np.linspace(0 , 4*math.pi, 100)

#create a vectorized function which can be applied directly to an array    
fn = np.vectorize(lambda x: math.exp(-a*x)*math.cos(x))
y = fn(x)

integral_value = simps(y, x)
print integral_value

这确实产生了-0.000170200006112 的值。请注意,对于a=0,积分等于 0,因此为了“更接近”您需要细化网格...

【讨论】:

    【解决方案3】:

    用大锤敲碎坚果......

    >>> from sympy import *
    >>> var('a x')
    (a, x)
    >>> y = exp(-a*x)*cos(x)
    >>> y.subs(a,0)
    cos(x)
    

    我们中的任何人都应该惊讶地发现它在给定的间隔内积分为 0(零)吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-02
      • 2020-04-13
      相关资源
      最近更新 更多