zoukankan      html  css  js  c++  java
  • python Scipy积分运算大全(integrate模块——一重、二重及三重积分)

    python中Scipy模块求取积分的方法:

    SciPy下实现求函数的积分的函数的基本使用,积分,高等数学里有大量的讲述,基本意思就是求曲线下面积之和。

    其中rn可认为是偏差,一般可以忽略不计,wi可以视为权重。

    在SciPy里提供了很多的求各类积分的函数,依据传入参数的不同可以分为两类:一类是传入一个已知的函数和积分的上下限;另一类是传入点集,这个适用于做完物理实现后收集的一些数据,但函数无法确定,但有很多的数据点,那么这些点包络下的面积是多少,也是积分问题,所以在SciPy里有针对点集求积分的函数,形式上函数的参数是数组或者列表。

    1、已知函数型求积分

    本节以几个问题的形式展示SciPy下如何求积分。

    • 问题1:这里假设函数为f(x)=x+1,求积分的上下限为[1,2],数学表达式为:

    可以利用Scipy模块下的子模块integrate里的quad函数来求这个数学问题的计算值。

    from scipy import integrate
    def f(x):
        return x + 1
    v, err = integrate.quad(f, 1, 2)
    print v
    

    程序的执行结果为:

    2.5

    问题2:但对于f(x)=ax+b这种函数,a和b肯能未知的这种函数,quad能用么?答案是可以的,quad有形参args可以传入一些参数进去的。
    from scipy import integrate
    def f(x, a, b):
        return a * x + b
    v, err = integrate.quad(f, 1, 2, args = (-1, 1))
    print v
    

    程序的执行结果是:

    -0.5

    问题3:如果遇到积分函数有断点,可以通过quad函数的points给出断点继续求积分。例如:


    这里f(x)在x=0的地方存在断点,如果没有给出断点就通过quad计算计算:
    from scipy import integrate
    import numpy as np
    def f(x):
        return 1 / np.sqrt(abs(x))
    v, err = integrate.quad(f, -1, 1)
    print v
    

    程序运行时:

    scipy1801.py:4: RuntimeWarning: divide by zero encountered in double_scalars
      return 1 / np.sqrt(abs(x))
    inf
    

    结果是inf(无限、无穷)且有除0错误! 修改一下:

    from scipy import integrate
    import numpy as np
    def f(x):
        return 1 / np.sqrt(abs(x))
    v, err = integrate.quad(f, -1, 1, points=[0])
    print v
    

    结果是:

    4
    

    我们可以绘制一下这个函数的可视化曲线:

    from scipy import integrate
    import numpy as np
    def f(x):
        return 1 / np.sqrt(abs(x))
    v, err = integrate.quad(f, -1, 1, points=[0])
    print v
    
    import numpy as np, matplotlib.pyplot as plt
    from mpl_toolkits.mplot3d.axes3d import Axes3D
    fig, ax = plt.subplots(figsize=(8, 3))
    x = np.linspace(-1, 1, 10000)
    ax.plot(x, f(x), lw=2)
    ax.fill_between(x, f(x), color='green', alpha=0.5)
    ax.set_xlabel("$x$", fontsize=18)
    ax.set_ylabel("$f(x)$", fontsize=18)
    ax.set_ylim(0, 25)
    plt.show()
    

    得到如下的结果图: 

    2 给出点集的积分

    在无法确认积分函数的情况下,给出一些序列也可做积分。

    • 问题4求积分而是有这个函数的10个样本数据,那传入quad函数的不是f(x)=x, 而是对应的各个(xi,yi)。
    from scipy import integrate
    import numpy as np
    def f(x):
        return np.sqrt(x)
    x = np.linspace(0, 2, 10)
    y = f(x)
    v = integrate.trapz(y, x)
    print v
    

    程序的运行结果:

    1.8652953655957172

    3 多重积分

    SciPy下的二重积分可以用dblquad函数来计算、三重积分可以用tplquad函数来计算而关于f(x1,x2,⋯,xn)的多重积分可以使用nquad函数。

    • 二重积分dblquad函数来计算,假设有一个函数f(x,y)需要计算其二重积分。
    如何用Scipy的dblquad函数呢? 对于一个泛型的二重积分的一般表达式格式为:

    那么dblquad函数的第一个形参应是f(x,y)、第2、3、4、5分别是a、b、g(x)、h(x),也就是说dblquad函数的第4和5是一个函数。
    from scipy import integrate
    import numpy as np
    def f(x, y):
        return x * y
    def h(x):
        return x
    v, err = integrate.dblquad(f, 1, 2, lambda x: 1, h)
    print v
    

    程序的执行结果:

    1.125


    三重积分可以使用tplquad来计算。三重积分的一般表达式格式为:

    tqlquad(f, a, b, g, h, q, r)
    

    其中f、g、h、q、r均为函数。下面以计算

    用Python编写的程序如下所示:

    from scipy import integrate
    import numpy as np
    f = lambda x, y, z : x
    g = lambda x : 0
    h = lambda x : (1 - x) / 2
    q = lambda x, y : 0
    r = lambda x, y : 1 - x - 2 * y 
    v, err = integrate.tplquad(f, 0, 1, g, h, q, r)
    print v
    

    程序执行结果:

    0.02083333333


     

     

  • 相关阅读:
    面对一个全新的环境,作为一个Mysql DBA,首先应该了解什么?
    Puppet学习之puppet的安装和配置
    Puppet学习之文件管理
    AJAx在windows 2003 系统下没有响应
    如何学习jquery
    系统底层图书推荐
    Jquery+Aspx实现Ajax得不到响应
    如何深入学习asp.net
    asp.net精华文章推荐
    爱恨交加的asp.net服务器控件
  • 原文地址:https://www.cnblogs.com/Yanjy-OnlyOne/p/11185582.html
Copyright © 2011-2022 走看看