Python 微分法计算定积分,以及用lambda函数作函数的形参

微分法计算定积分

所有积分区间都分割成100万份,计算以下四个常用积分:

from math import sin
from math import log
from math import exp
from math import pi
from math import e

N=1000000

def interalSin(a,b):
    '''sin(x)在区间[a,b]上的定积分'''
    d=(b-a)/N
    r=0
    for i in range(N):
        r+=d*sin(a+i*d+d/2)
    return r

def interalLn(a,b):
    '''ln(x)在区间[a,b]上的定积分'''
    d=(b-a)/N
    r=0
    for i in range(N):
        r+=d*log(a+i*d+d/2)
    return r

def interalAbs(a,b):
    '''ln(x)在区间[a,b]上的定积分'''
    d=(b-a)/N
    r=0
    for i in range(N):
        r+=d*abs(a+i*d+d/2)
    return r

def interalExp(a,b):
    '''e^x在区间[a,b]上的定积分'''
    d=(b-a)/N
    r=0
    for i in range(N):
        r+=d*exp(a+i*d+d/2)
    return r

print(interalSin(0,pi/2))
print(interalLn(1,e))
print(interalAbs(-1,1))
print(interalExp(-1,1),end='\n\n')
print('e-1/e=')
print(e-1/e)


#执行结果:
'''
1.0000000000000981
1.0000000000000977
1.0000000000000002
2.3504023872872146

e-1/e=
2.3504023872876028
>>> 
'''

注:积分区间微分成100万份,就能得到小数点后12位的精度。

自定义函数作函数的形参:

from math import sin
from math import log
from math import exp
from math import pi
from math import e

N=1000000

def Sinx(x):
    return sin(x)

def Ln_x(x):
    return log(x)

def Absx(x):
    return abs(x)

def Expx(x):
    return exp(x)

def Interal(func,a,b):
    '''func(x)在区间[a,b]上的定积分'''
    d=(b-a)/N
    r=0
    for i in range(N):
        r+=d*func(a+i*d+d/2)
    return r

print(Interal(Sinx,0,pi/2))
print(Interal(Ln_x,1,e))
print(Interal(Absx,-1,1))
print(Interal(Expx,-1,1))

直接用库函数作函数的形参:

from math import sin
from math import log
from math import exp
from math import pi
from math import e

N=1000000

def Interal(func,a,b):
    '''func(x)在区间[a,b]上的定积分'''
    d=(b-a)/N
    r=0
    for i in range(N):
        r+=d*func(a+i*d+d/2)
    return r

print(Interal(sin,0,pi/2))
print(Interal(log,1,e))
print(Interal(abs,-1,1))
print(Interal(exp,-1,1))

用lambda函数表达复合函数,并做形参计算定积分:

用以下两个题目做示例:

from math import pi
from math import sin
from math import cos
from math import log
from math import sqrt
 
N=1000000

fx=lambda x:sqrt(1-sin(2*x))
gx=lambda x:sin(x)/(1+sin(x)+cos(x))

def Interal(func,a,b):
    '''func(x)在区间[a,b]上的定积分'''
    d=(b-a)/N
    r=0
    for i in range(N):
        r+=d*func(a+i*d+d/2)
    return r
 
print(Interal(fx,0,pi/2))
print(2*sqrt(2)-2) #对比答案
print()

print(Interal(gx,0,pi/2))
print((pi/2-log(2))/2) #对比答案


'''
0.8284271247463156
0.8284271247461903

0.43882457311750606
0.43882457311747564
>>>
'''

附:形参个数不定

可以使用*args或**args,但是一定要把*args放到最后面。

def plus(*args):
    tmp=0
    for i in args:
        tmp+=i
    return tmp

def mul_p(fn,x,*args):
    return x*fn(*args)

print(plus(1,2,3,4,5,6,7,8,9,10))
print(mul_p(plus,10,1,2,3,4,5,6,7,8,9,10))

#执行结果:
'''
55
550
>>> 
'''

猜你喜欢

转载自blog.csdn.net/boysoft2002/article/details/114854993