全国大学生数学建模大赛,8月15日第2题,打卡
主题活动
发布于 2025-08-19 08:40:53
查看 2过去314天
8月15日 题目二解答说明
题目回顾
今天要解决三个数学问题:
- 计算一个二重积分
- 计算一个三重积分
- 计算一个概率问题
解题思路
1. 二重积分:∫₀²∫₀¹((sin x)•√y + x)dxdy
我的想法:
- 这个积分看起来有点复杂,但其实就是先对x积分,再对y积分
- 被积函数是
sin(x) * √y + x,可以分成两部分:sin(x) * √y和x - 用数值积分的方法,把积分区域分成很多小格子,然后加起来
代码实现:
# 定义被积函数
f1(x, y) = sin(x) * sqrt(y) + x
# 先对x积分(内层积分)
function integrate_x(y)
n = 1000 # 分成1000段
dx = 1.0 / n
sum = 0.0
for i in 1:n
x = (i - 0.5) * dx # 中点法
sum += f1(x, y) * dx
end
return sum
end
# 再对y积分(外层积分)
function integrate_y()
n = 1000
dy = 2.0 / n
sum = 0.0
for i in 1:n
y = (i - 0.5) * dy
sum += integrate_x(y) * dy # 调用内层积分
end
return sum
end
具体做法:
- 先把x从0到1分成1000个小段,用中点法计算
- 对每个y值,调用
integrate_x(y)计算x方向上的积分 - 再把y从0到2分成1000个小段,调用
integrate_y()计算y方向上的积分 - 结果:1.867
2. 三重积分:∫₀^π∫₀¹∫₋₁¹(y sin x + z cos x)dxdydz
我的想法:
- 这是三重积分,要从里到外一层层算
- 被积函数是
y * sin(x) + z * cos(x) - 积分顺序是:先对z积分,再对y积分,最后对x积分
代码实现:
# 定义被积函数
f2(x, y, z) = y * sin(x) + z * cos(x)
# 最内层:对z积分
function integrate_z(x, y)
n = 1000
dz = 2.0 / n
sum = 0.0
for i in 1:n
z = -1.0 + (i - 0.5) * dz # z从-1到1
sum += f2(x, y, z) * dz
end
return sum
end
# 中间层:对y积分
function integrate_y_triple(x)
n = 1000
dy = 1.0 / n
sum = 0.0
for i in 1:n
y = (i - 0.5) * dy
sum += integrate_z(x, y) * dy # 调用z积分
end
return sum
end
# 最外层:对x积分
function integrate_x_triple()
n = 1000
dx = pi / n
sum = 0.0
for i in 1:n
x = (i - 0.5) * dx
sum += integrate_y_triple(x) * dx # 调用y积分
end
return sum
end
具体做法:
- 最里面:
integrate_z(x, y)把z从-1到1分成1000段 - 中间:
integrate_y_triple(x)把y从0到1分成1000段,对每个x调用z积分 - 最外面:
integrate_x_triple()把x从0到π分成1000段,对每个x调用y积分 - 结果:2.000
3. 概率问题:点落在圆内的概率
我的想法:
- 矩形区域是[0,2]×[0,2],面积是4
- 圆的方程是x² + y² ≤ 4,半径是2
- 圆心在(0,0),所以圆完全在矩形内
- 概率 = 圆的面积 / 矩形的面积
代码实现:
# 定义指示函数:点在圆内返回1,否则返回0
function indicator_circle(x, y)
if x^2 + y^2 <= 4
return 1.0
else
return 0.0
end
end
# 理论计算
circle_area = pi * 4 # 圆的面积 = π * 2²
rectangle_area = 4 # 矩形面积 = 2 * 2
probability = circle_area / rectangle_area # 概率 = π
# 数值积分验证
function integrate_prob_y(x)
n = 1000
dy = 2.0 / n
sum = 0.0
for i in 1:n
y = (i - 0.5) * dy
sum += indicator_circle(x, y) * dy
end
return sum
end
function integrate_prob()
n = 1000
dx = 2.0 / n
sum = 0.0
for i in 1:n
x = (i - 0.5) * dx
sum += integrate_prob_y(x) * dx
end
return sum
end
具体做法:
- 理论计算:圆的面积 = π × 2² = 4π,概率 = 4π/4 = π
- 数值验证:用
indicator_circle函数判断每个点是否在圆内 - 对矩形区域积分,得到圆内点的面积
- 结果:π ≈ 3.1416
代码实现要点
数值积分方法
- 用中点法:
(i - 0.5) * dx,精度比矩形法高 - 每个方向都分成1000段,保证精度
- 用嵌套循环实现多重积分
函数设计
- 每个积分方向写一个函数,如
integrate_x、integrate_y等 - 从里到外层层调用:
integrate_x_triple()→integrate_y_triple()→integrate_z() - 代码结构清晰,容易理解和调试
关键技巧
- 中点法:
(i - 0.5) * dx而不是i * dx - 函数嵌套:内层函数作为外层函数的被积函数
- 指示函数:用0/1表示点是否在某个区域内
结果总结
- 二重积分结果: 1.867
- 三重积分结果: 2.000
- 概率结果: π ≈ 3.1416
这些结果看起来都很合理,三重积分的结果接近2,概率是π,都符合数学直觉。
学习收获
- 数值积分是解决复杂积分的好方法,特别是多重积分
- 多重积分要一层层算,不能着急,每层都要写清楚
- 概率问题画图帮助理解,几何意义很重要
- Julia的数值计算能力很强,代码写起来很简洁
- 中点法比矩形法精度高,值得记住

下面是完整代码
# 8月15日 题目二解答 - 积分计算
# --- 第一个二重积分 ---
println("1. 计算二重积分:∫₀²∫₀¹((sin x)•√y + x)dxdy")
# 定义被积函数 f(x, y) = sin(x) * √y + x
f1(x, y) = sin(x) * sqrt(y) + x
# 使用简单的数值积分方法
function integrate_x(y)
# 对 x 从 0 到 1 积分
n = 1000 # 分割数
dx = 1.0 / n
sum = 0.0
for i in 1:n
x = (i - 0.5) * dx # 中点法
sum += f1(x, y) * dx
end
return sum
end
function integrate_y()
# 对 y 从 0 到 2 积分
n = 1000 # 分割数
dy = 2.0 / n
sum = 0.0
for i in 1:n
y = (i - 0.5) * dy # 中点法
sum += integrate_x(y) * dy
end
return sum
end
integral1 = integrate_y()
println("第一个二重积分的结果: ", integral1)
println()
# --- 第二个三重积分 ---
println("2. 计算三重积分:∫₀^π∫₀¹∫₋₁¹(y sin x + z cos x)dxdydz")
# 定义被积函数 f(x, y, z) = y * sin(x) + z * cos(x)
f2(x, y, z) = y * sin(x) + z * cos(x)
function integrate_z(x, y)
# 对 z 从 -1 到 1 积分
n = 1000 # 分割数
dz = 2.0 / n
sum = 0.0
for i in 1:n
z = -1.0 + (i - 0.5) * dz # 中点法
sum += f2(x, y, z) * dz
end
return sum
end
function integrate_y_triple(x)
# 对 y 从 0 到 1 积分
n = 1000 # 分割数
dy = 1.0 / n
sum = 0.0
for i in 1:n
y = (i - 0.5) * dy # 中点法
sum += integrate_z(x, y) * dy
end
return sum
end
function integrate_x_triple()
# 对 x 从 0 到 π 积分
n = 1000 # 分割数
dx = pi / n
sum = 0.0
for i in 1:n
x = (i - 0.5) * dx # 中点法
sum += integrate_y_triple(x) * dx
end
return sum
end
integral2 = integrate_x_triple()
println("第二个三重积分的结果: ", integral2)
println()
# --- 概率计算 ---
println("3. 概率计算:点(X,Y)落在以原点为圆心,半径为2的圆内部的概率")
# 矩形区域 R: X ∈ [0, 2], Y ∈ [0, 2]
# 圆的方程: x² + y² ≤ 4
# 定义指示函数:如果点在圆内返回1,否则返回0
function indicator_circle(x, y)
if x^2 + y^2 <= 4
return 1.0
else
return 0.0
end
end
# 计算圆与矩形的交集面积
# 由于圆的半径是2,圆心在(0,0),矩形在[0,2]×[0,2]
# 所以圆完全包含在矩形内,交集面积就是圆的面积
# 圆的面积 = π * r² = π * 4 = 4π
circle_area = pi * 4
# 矩形的面积 = 2 * 2 = 4
rectangle_area = 4
# 概率 = 圆的面积 / 矩形的面积
probability = circle_area / rectangle_area
println("圆的面积: ", circle_area)
println("矩形的面积: ", rectangle_area)
println("概率 P(A) = ", probability)
println("概率 P(A) ≈ ", round(probability, digits=6))
# 也可以用数值积分验证
function integrate_prob_y(x)
# 对 y 从 0 到 2 积分
n = 1000 # 分割数
dy = 2.0 / n
sum = 0.0
for i in 1:n
y = (i - 0.5) * dy # 中点法
sum += indicator_circle(x, y) * dy
end
return sum
end
function integrate_prob()
# 对 x 从 0 到 2 积分
n = 1000 # 分割数
dx = 2.0 / n
sum = 0.0
for i in 1:n
x = (i - 0.5) * dx # 中点法
sum += integrate_prob_y(x) * dx
end
return sum
end
prob_numerical = integrate_prob() / rectangle_area
println("数值积分验证的概率: ", prob_numerical)所属专栏:Syslab基础平台
产品信息:Syslab科学计算环境