Python 实现定积分与二重定积分的操作
本文介绍如何利用 Python 的 SciPy 库计算定积分与二重积分,重点解析 dblquad 函数的使用及区间参数传递方式。同时结合蒙特卡洛采样与接受-拒绝法,通过数值模拟求解复杂函数期望与积分值,提供完整代码示例与注意事项。
1.概述
近期项目中涉及数学微积分的程序实现。起初尝试使用 Java,但因相关文档匮乏且实现复杂而放弃,最终选择 Python 方案。Python 实现代码量较少,主要依赖 sympy 与 scipy 两种库。本文重点记录基于 scipy 的实现方法。
2.内容
2.1 所求函数

2.2 python代码
# 引入需要的包
import scipy.integrate
from numpy import exp
from math import sqrt
import math
# 创建表达式
f = lambda x,y : exp(x**2-y**2)
# 计算二重积分:(p:积分值,err:误差)
# 这里注意积分区间的顺序
# 第二重积分的区间参数要以函数的形式传入
p,err= scipy.integrate.dblquad(f, 0, 2, lambda g : 0, lambda h : 1)
print(p)
2.3 注意问题
1. exp尽量使用numpy的exp
2. 注意积分区间参数的顺序
3. 第二重积分的区间参数要以函数的形式传入
补充:python实现求解积分
例子 1:
假设存在随机变量 x,其定义域为 X,概率密度函数为 p(x)。若 f(x) 是定义在 X 上的函数,目标是计算 f(x) 关于概率密度 p(x) 的数学期望
。
蒙特卡洛方法依据概率分布 p(x) 独立抽取 n 个样本 x1, x2, ..., xn,从而近似得到 f(x) 的期望值:

该过程的核心在于求解具有概率密度的函数期望值。
期望值的计算逻辑为:积分(各点密度函数 × 各点价值函数)。
例子 2:
假设需计算 h(x) 在定义域 X 上的积分:

将 h(x) 分解为函数 f(x) 与概率密度函数 p(x) 的乘积,从而将问题转化为求解 f(x) 关于 p(x) 的数学期望
:

此处 Ep(x) 表示将整体分布视为概率分布,即总发生概率为 1。
若将 f(x) 表示为
,则有:

更一般地,假设需计算
。熟悉积分的读者已知答案为
,那么如何通过采样方法获得该值?
令
,且 0 < x < 10,则
。
以下是相关代码实现:
'''import random
num=1000000
sum=0
for i in range(0,num):
x=random.uniform(0,10)
sum+=x*x*10
sum/=1000000
print(sum)'''
import random
numSamples=10000
samples=[random.uniform(0,10)for _ in range(numSamples)]
f_samples=[10*sample**2 for sample in samples]
result=1/10000.0*sum(f_samples)
print(result)
result=333.10527012455066
random.uniform(x,y) 表示在 [x, y) 区间内生成一个实数。
对于复杂的 h(x),此方法计算更为便捷(尤其适用于不熟悉积分计算技巧的场景)。
蒙特卡洛方法本质上是利用大数定律,通过大量统计模拟得出最终数值。
至此,我们简要介绍了蒙特卡洛方法,但尚未涉及如何利用复杂概率密度函数进行采样。
接下来介绍接受-拒绝法(accept-reject sampling method),这是蒙特卡洛方法的一种,适用于无法直接采样的情况。
以上为个人经验总结,希望能提供参考,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













