求多元函数公式的积分,使用scipy库的quad\dblquad\nquad 进行积分计算,即一重、二重以及多重积分求解方法(含python代码)

一:基础知识

  1. 高等数学积分概念基础
  2. 不会涉及具体求解原理,只要会输入代码求解方程即可

二:内容简介

        建模涉及公式求解主要包含以下内容:一元方程求解,多元方程求解(线性代数),微分方程,以及求积分。所有的求解方法我们都要依次学习,一元方程求解比较简单,在前两篇博客中已经涉及,就不再赘述。本博客主要记录适用python中的scipy库

三:分析+代码展示

        一重积分:

                1、先假设一个被积分方程:F(X) = A*X^{B}+C*X^{D}+E

                2、积分:\int_{a}^{b} F(X)d_{x} = \int_{a}^{b} \left (A*X^{B}+C*X^{D}+E \right )d_{X}

                3、求解:一元函数使用 integrate.quad(fun1,0,10,args=(1,2,3,4,5)) 方法进行求解。其中第一个参数为被积函数方程,第二个参数为积分下限,第三个参数为积分上限。args是被积函数除开自变量X以外需要的参数(A,B,C,D,E),以元组(tuple)形式传参。

                4、返回结果:返回元组(积分结果,积分误差)。返回的res中是一个元组(tuple)类型。式中第一个为参数为积分的结果,第二个参数是积分结果的误差。

#定义被积函数fun1
def fun1(x,A,B,C,D,E):
    return A*x**B+C*x**D+E
#求解
res = integrate.quad(fun1,0,10,args=(1,2,3,4,5))
print(res)
#res:(60383.33333333334, 6.703896697028238e-10)

        二重积分:

                1、假设被积函数:F(x,y) = A*e^{x*y}+B*x+C*y+D

                2、积分:

                \iint_{}^{}F(x,y)d_{x}d_{y}=\iint_{}^{}\left ( A*e^{x*y}+B*x+C*y+D \right )d_{x}d_{y}

                3、求解:二元函数使用integrate.dblquad(fun2,0,1,0,lambda x:x,args=(1,2,3,4))

                        参数一:被积函数fun2;参数二,参数三:被积函数第一个参数的的上下限[0,1],必须为数值区间,不能是表达式。参数四,参数五:被积函数第二个参数的上下限[0,x]。args:被积函数除自变量x,y以外的参数(A,B,C,D),以元组(tuple)方式传递。

                 定积分形式:\int_{0}^{1}\int_{0}^{x}F(x,y)d_{x}d_{y} = \int_{0}^{1}\int_{0}^{x}\left ( A*e^{x*y}+Bx+Cy+D \right )d_{y}d_{x}

                求解过程简述(只是可以这么理解,与程序实际过程执行过程不同):函数先对第二个变量y进行积分,\int_{0}^{x}\left ( A*e^{x*y}+Bx+Cy+D \right )d_{y}。式中积分上限可用lambda表达式获得,它是被积变量y与变量x在上边界的关系。程序自动将lambda中输入变量的表达式,转为为变量x的表达式,作为对变量y积分的积分上限。解的关于x的表达式G\left ( x \right )。再根据参数二和参数三中输入的x的积分上下限,对G\left ( x \right )积分。\int_{0}^{1}\int_{0}^{x}\left ( A*e^{x*y}+Bx+Cy+D \right )d_{y}d_{x} =\int_{0}^{1}G_{x}d_{x}

                补充

                        1、lambda表达式       lambda x,y:x*y     lambda后的x,y表示lambda函数的输入变量,可输入多个 不同变量。:后的是要返回的表达式,所以:的作用类似与return。表达式的计算结果就是返回的值。实例中表示返回x和y的乘积。

                        2、在二重积分计算中,lambda表达式只有一个输入变量t,返回关于t的表达式。integrate.dblquad方程会自动将返回的关于t的关系式转换为关于被积函数第一个变量(示例为x,重点式第一个变量)的关系式,作为第二个变量(示例为y)的上/下界。

                注意:二元函数求积分方程integrate.dblquad()的参数中,积分上下限参数传入顺序按照被积函数F(x,y)中的参数x与y依次传入。

                4、返回结果:同一重积分相同

                强调:lambda传参中的x变量是被积函数中x的一种表示,可以用t,z,y等其他变量表示。如:lambda t:t+1,则代表定积分中y的积分上/下限是x+1。lambda中的t只是上/下限积分中x的一种表示形式。同时也可以看到,被积函数的参数y的上下限都可以通过lambda表示为参数x的函数。再次强调integrate.dblquad()函数是先传被积函数F(p,q)中第一个参数p的上下限,再传第二个q的。

                求解梯度为d_{x}=d_{y} = 1/96。即取图像与x/y轴形成长方形长条时,宽度为1/96。程序内部的设定,可不用管。

#定义二重积分
def fun2(x,y,A,B,C,D):
    return A*np.e**(x*y)+B*x+C*y+D
#求解。
#lambda表达式中x与被积函数中x毫无关系。可以替换为z,t等其他表示。它只代表了输入的变量t,返回的也是t
#该lambda表达式代表的是被积函数第二个参数y的积分上限为y=x。
res = integrate.dblquad(fun2,0,1,0,lambda x:x,args=(1,2,3,4))
print(res)
#(结果,结果误差)
#res:(3.992284409060536, 1.0751611370477254e-13)

 

n重积分:

        1、假设被积函数F(x,y,z) = x+y+z  

        2、积分形式\oint_{0}^{1}\oint_{0}^{1}\oint_{0}^{z}F\left ( x,y,z \right )=\oint_{0}^{1}\oint_{0}^{1}\oint_{0}^{z}\left ( x+y+z \right )d_{x}d_{y}d_{z }

        3、求解:res2= integrate.nquad(fun4,[boundary1,[0,1],[0,2]])     --------------公式(1)

                参数一:被积分方程

                参数二:关于x,y,z上下限的list。还是按照顺序[[p1min,p1max],[p2min,p2max],[p3min,p3max]]。p1代表被积函数中的参数1。min,max分别表示上下界限。

                上下界的函数表示法:

         在公式(1)中,自定义的函数boundary1就是返回的参数1的上下界限。从下面代码可以看到该函数返回的是list。假设boundary1代表的是第q个被积函数变量的上下界,则boundary1中输入变量个数等于被积函数的变量数减去减q。例如:

         本例中被积函数F(x,y,z)一共三个变量x,y,z,boundary1返回的参数1(x)的上下界,所以自定义函数boundary1中两个变量(p,q)分别依次代表被积函数中参数1(x)后的两个参数(y,z)。如果自定义函数boundary1在公式1中处在第二个参数的位置,则它只能有一个参数,对应的是被积函数F(x,y,z)中的最后一个变量z。

def boundary1(p,q):
    return [0,q]

        4、结果展示

        可见nquad也可以获取到二重积分的解。

#被积函数
def fun5(x,y,z):
    return x+y+z
#x的边界函数
def boundary1(p,q):
    return [0,q]
#下面这个边界就只有一个参数,可以用在nquad的list中的第二个位置。代表第二个变量相关于第三个变量的上下界
def boundary2(e):
    return [e-1,e+10]
#求积分。返回的元组,用两个参数接收分别为(积分结果,结果误差)
res3,_ = integrate.nquad(fun5,[boundary1,[0,1],[0,2]])
print(res3)
#res3结果为:  5.0

四:所有代码汇总如下(关注即可复制下载)

        如果代码不能复制粘贴,可关注抖音:yibinfuzi,私信免费获取。

import numpy as np
from scipy import integrate

#一重积分------------------------------
#先定义一个被积分方程
print("一重积分------------------")
def fun1(x,A,B,C,D,E):
    return A*x**B+C*x**D+E
def fun1_infi(x):
    return np.e**(-x)
#求解
res = integrate.quad(fun1,0,10,args=(1,2,0,0,0))
res_inf = integrate.quad(fun1_infi,0,np.inf)
print(res)
print(res_inf)
#res:(60383.33333333334, 6.703896697028238e-10)

#二重积分----------------------------------------
print("二重积分---------------------------------")
#定义积分
def fun2(x,y,A,B,C,D):
    return A*np.e**(x*y)+B*x+C*y+D
def fun3(x,y):
    return x*y**2
#参数的输入,第二三个参数对应的是被积函数中第一个自变量的上下限。第三四个对应的是被积函数中第二个自变量的上下限
#lambda表达式中x与被积函数中x毫无关系。可以替换为z,t等其他表示。
#该lambda表达式代表的是被积函数第二个参数y的积分上限为y=x。
res = integrate.dblquad(fun2,0,1,0,lambda x:x,args=(1,2,3,4))
res1 = integrate.dblquad(fun3,0,1,0,lambda x:x)

print(res)
print(res1)

#n重积分----------------------------------------------------
print("n重积分------------")
def fun4(x,y):
    return 2*x+y
def fun5(x,y,z):
    return x+y+z
def boundary(p):
    return [0,p]
def boundary1(p,q):
    return [0,q]
# res2,_ = integrate.nquad(fun4,[[1,2],[2,3]])
res2,_ = integrate.nquad(fun4,[boundary,[0,1]])
res3,_ = integrate.nquad(fun5,[boundary1,[0,1],[0,2]])
print(res2)
print(res3)




       
   五:总结
  1. 只要知道了函数方法需要输入哪些值,就可以解出值。
  2. 一共三个函数:
    1. integrate.quad(fun1,0,10,args=(1,2,3,4,5))
    2. integrate.dblquad(fun2,0,1,0,lambda x:x,args=(1,2,3,4))
    3. integrate.nquad(fun4,[boundary1,[0,1],[0,2]])
  3. 第一个参数都是被积函数,后面依次输入被积函数中变量的上下界,只是输入的形式有所不同

作者是石油工程专业研究生,方向为.油气工程信息化与智能化技术。正在自学数值模拟和神经网络,欢迎一起交流学习python数值模拟和神经网络相关内容。如代码未能复制粘贴,可关注抖音:yibinfuzi,私信获取代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值