简介
关键词:数值计算库(线性代数、常微分方程、信号处理、图像处理、矩阵等)
官网:scipy.org
学习大致内容:
integral 积分
optimize 最优化
interpolation 插值
linear 线性计算
others
scipy1.0—积分quad、dblquad、nquad
scipy.integrate.quad
"""
scipy1.0:integrate积分
马玉华 2019.11.5
"""
import numpy as np
import scipy
from scipy import integrate #解决错误:AttributeError: module 'scipy' has no attribute 'integrate'
def main():
# quad一维积分 ,dblquad二维积分(double quad),nquad 多维积分
result1 = integrate.quad(lambda x:np.exp(-x) , a=0,b=np.inf) #quad(func,a,b),对函数func从a到b积分。np.inf表示无穷大
print(result1,type(result1)) # 返回结果为:元组(积分值,误差值)。 因为电脑算的数值积分不同于定积分不定积分,会有一个误差值
result2 = integrate.dblquad(lambda y,x: x*y**3 , a=0,b=5,gfun= lambda x:0, hfun=lambda x:6) # ∫_0^6【∫_0^5〖xy^3 ⅆx〗】 ⅆy
# integral of func(y,x) from x=a..b ,and y=gfun(x)..hfun(x)
print('积分值,误差值:',result2)
def f(x,y): #积分函数
return x*y
def bound_x(y): #积分内容边界
return [0, 1-2*y]
def bound_y(): #积分内容边界
return [0, 0.5]
result3 = integrate.nquad(f,[bound_x,bound_y]) #nquad(积分函数,积分边界)。 ∫_0^0.5【∫_0^(1-2y)【xyⅆx】】ⅆy
# 这其中被调用的函数f(x,y)、bound_x(y)均不写括号(),因为我们没有要传入的实参,写了反而会因为没有传入参数而出现错误。bound_y()可写可不写,因为定义的函数中就不需要接收参数
print(result3)
"""
为什么要写出这么多函数来调用,直接积分不行吗?
如果直接积分,应该这么写:integrate.nquad(lambda x,y: x*y, [[0,1-2*y],[0,0.5]])
那就会出现 name 'y' is not defined ,就是x积分域中的1-2*y的y没有被定义没法使用
可写成result3 = integrate.nquad(lambda x,y: x*y, [bound_x,[0,0.5]])
或result3 = integrate.nquad(f, [bound_x,bound_y()])
"""
if __name__ == '__main__':
main()
上述例子中的积分为:
输出结果:
"C:\Users\mayuhuaw\Desktop\Python数据分析-基础技术\3. scipy\venv\Scripts\python.exe" "C:/Users/mayuhuaw/Desktop/Python数据分析-基础技术/3. scipy/scipy1.0:integrate积分.py"
(1.0000000000000002, 5.842606703608969e-11) <class 'tuple'>
积分值,误差值: (4049.9999999999995, 4.4964032497318833e-11)
(0.010416666666666668, 4.101620128472366e-16)
进程已结束,退出代码 0
对quad、dblquad、nquad的用法还有疑问可参见官网:
方法一:https://docs.scipy.org/doc/scipy/reference/integrate.html
方法二:打开官网scipy.org
点documentation
选scipy
点 API reference 下的语句
可得到