Python 实现定积分与二重定积分的操作

木白
木白
发布时间:2026-10-15 | 2人浏览过
原创

本文介绍如何利用 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),这是蒙特卡洛方法的一种,适用于无法直接采样的情况。

以上为个人经验总结,希望能提供参考,也希望大家多多支持本站。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表