一:基础知识
- 高等数学积分概念基础
- 不会涉及具体求解原理,只要会输入代码求解方程即可
二:内容简介
建模涉及公式求解主要包含以下内容:一元方程求解,多元方程求解(线性代数),微分方程,以及求积分。所有的求解方法我们都要依次学习,一元方程求解比较简单,在前两篇博客中已经涉及,就不再赘述。本博客主要记录适用python中的scipy库
三:分析+代码展示
一重积分:
1、先假设一个被积分方程:
2、积分:
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、假设被积函数:
2、积分:
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)方式传递。
定积分形式:
求解过程简述(只是可以这么理解,与程序实际过程执行过程不同):函数先对第二个变量y进行积分,。式中积分上限可用lambda表达式获得,它是被积变量y与变量x在上边界的关系。程序自动将lambda中输入变量的表达式,转为为变量x的表达式,作为对变量y积分的积分上限。解的关于x的表达式。再根据参数二和参数三中输入的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的。
求解梯度为。即取图像与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、假设被积函数
2、积分形式
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)
五:总结
- 只要知道了函数方法需要输入哪些值,就可以解出值。
- 一共三个函数:
- integrate.quad(fun1,0,10,args=(1,2,3,4,5))
- integrate.dblquad(fun2,0,1,0,lambda x:x,args=(1,2,3,4))
- integrate.nquad(fun4,[boundary1,[0,1],[0,2]])
- 第一个参数都是被积函数,后面依次输入被积函数中变量的上下界,只是输入的形式有所不同
作者是石油工程专业研究生,方向为.油气工程信息化与智能化技术。正在自学数值模拟和神经网络,欢迎一起交流学习python数值模拟和神经网络相关内容。如代码未能复制粘贴,可关注抖音:yibinfuzi,私信获取代码。