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
>>> 
'''

 

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hann Yang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值