全国大学生数学建模竞赛,8月21日,第五题打卡
主题活动
发布于 2025-08-22 08:43:44
查看 2过去311天
题目五解答 - 8月21日
问题概述
今天我们要解决两个数学问题:
- 多元函数求导 - 计算两个复杂函数对x、y、z的偏导数
- 温度分布问题 - 分析金属板的温度分布,计算梯度和方向导数
问题1: 多元函数求导
函数1: f(x, y, z) = 2xy·tan(x) + e^(3xz) + cos(yz)
这是一个包含三角函数、指数函数和余弦函数的复杂函数。让我们分别计算它对x、y、z的偏导数。
手动计算过程:
对x求偏导 ∂f/∂x:
- 第一项
2xy·tan(x): 使用乘积法则- ∂/∂x[2xy·tan(x)] = 2y·tan(x) + 2xy·sec²(x)
- 第二项
e^(3xz): 使用链式法则- ∂/∂x[e^(3xz)] = e^(3xz) · 3z = 3z·e^(3xz)
- 第三项
cos(yz): 对x求导为0- ∂/∂x[cos(yz)] = 0
结果: ∂f/∂x = 2y·tan(x) + 2xy·sec²(x) + 3z·e^(3xz)
对y求偏导 ∂f/∂y:
- 第一项: ∂/∂y[2xy·tan(x)] = 2x·tan(x)
- 第二项: ∂/∂y[e^(3xz)] = 0
- 第三项: ∂/∂y[cos(yz)] = -sin(yz)·z = -z·sin(yz)
结果: ∂f/∂y = 2x·tan(x) - z·sin(yz)
对z求偏导 ∂f/∂z:
- 第一项: ∂/∂z[2xy·tan(x)] = 0
- 第二项: ∂/∂z[e^(3xz)] = e^(3xz) · 3x = 3x·e^(3xz)
- 第三项: ∂/∂z[cos(yz)] = -sin(yz)·y = -y·sin(yz)
结果: ∂f/∂z = 3x·e^(3xz) - y·sin(yz)
Julia代码实现:
# 函数1: f(x, y, z) = 2xy * tan(x) + e^(3xz) + cos(yz)
println("(1) 函数 f(x, y, z) = 2xy * tan(x) + e^(3xz) + cos(yz)")
# 手动计算偏导数
println("∂f/∂x = 2y*tan(x) + 2xy*sec²(x) + 3z*e^(3xz)")
println("∂f/∂y = 2x*tan(x) - z*sin(yz)")
println("∂f/∂z = 3x*e^(3xz) - y*sin(yz)")
函数2: g(x, y, z) = (x + y + yz) / sin(xy)
这是一个分式函数,需要使用商法则来求导。
手动计算过程:
对x求偏导 ∂g/∂x:
使用商法则: ∂/∂x[u/v] = (v·∂u/∂x - u·∂v/∂x) / v²
- u = x + y + yz, ∂u/∂x = 1
- v = sin(xy), ∂v/∂x = cos(xy)·y
结果: ∂g/∂x = [sin(xy) - (x+y+yz)·cos(xy)·y] / sin²(xy)
对y求偏导 ∂g/∂y:
- u = x + y + yz, ∂u/∂y = 1 + z
- v = sin(xy), ∂v/∂y = cos(xy)·x
结果: ∂g/∂y = [sin(xy)·(1+z) - (x+y+yz)·cos(xy)·x] / sin²(xy)
对z求偏导 ∂g/∂z:
- u = x + y + yz, ∂u/∂z = y
- v = sin(xy), ∂v/∂z = 0
结果: ∂g/∂z = y / sin(xy)
Julia代码实现:
# 函数2: g(x, y, z) = (x + y + yz) / sin(xy)
println("(2) 函数 g(x, y, z) = (x + y + yz) / sin(xy)")
# 手动计算偏导数
println("∂g/∂x = [sin(xy) - (x+y+yz)*cos(xy)*y] / sin²(xy)")
println("∂g/∂y = [sin(xy)*(1+z) - (x+y+yz)*cos(xy)*x] / sin²(xy)")
println("∂g/∂z = y / sin(xy)")
问题2: 金属板温度分布
温度函数: T(x, y) = 100e^(-x² - 2y²)
这是一个二维高斯函数,描述金属板的温度分布。温度在原点(0,0)处最高,向四周递减。
(1) 计算温度梯度 ∇T
手动计算过程:
对x求偏导 ∂T/∂x:
- ∂T/∂x = 100 · ∂/∂x[e^(-x² - 2y²)]
- = 100 · e^(-x² - 2y²) · ∂/∂x(-x² - 2y²)
- = 100 · e^(-x² - 2y²) · (-2x)
- = -200x · e^(-x² - 2y²)
对y求偏导 ∂T/∂y:
- ∂T/∂y = 100 · ∂/∂y[e^(-x² - 2y²)]
- = 100 · e^(-x² - 2y²) · ∂/∂y(-x² - 2y²)
- = 100 · e^(-x² - 2y²) · (-4y)
- = -400y · e^(-x² - 2y²)
梯度: ∇T = (∂T/∂x, ∂T/∂y) = (-200x·e^(-x²-2y²), -400y·e^(-x²-2y²))
Julia代码实现:
# 手动计算梯度
println("(1) 温度梯度 ∇T = (∂T/∂x, ∂T/∂y)")
println("∂T/∂x = -200x * e^(-x^2 - 2y^2)")
println("∂T/∂y = -400y * e^(-x^2 - 2y^2)")
# 在点(0.5, -0.5)处计算梯度
x0 = 0.5; y0 = -0.5
e_term = exp(-x0^2 - 2*y0^2)
grad_T_x = -200 * x0 * e_term
grad_T_y = -400 * y0 * e_term
println("在点(0.5, -0.5)处的梯度:")
println("∇T(0.5, -0.5) = ($(round(grad_T_x, digits=4)), $(round(grad_T_y, digits=4)))")
(2) 计算方向导数
我们需要计算温度沿方向v=(3,4)的方向导数。
计算步骤:
-
单位化方向向量:
- ||v|| = √(3² + 4²) = √25 = 5
- u = v/||v|| = (3/5, 4/5) = (0.6, 0.8)
-
方向导数公式: D_u T = ∇T · u
-
数值计算:
- D_u T = (-47.24, 94.48) · (0.6, 0.8)
- = -47.24·0.6 + 94.48·0.8
- = -28.344 + 75.584
- ≈ 47.24
Julia代码实现:
# (2) 计算方向导数
println("(2) 计算温度沿方向 v=(3,4)的方向导数")
# 方向向量 v=(3,4)
vx = 3; vy = 4
# 单位化方向向量
v_norm = sqrt(vx^2 + vy^2)
u_x = vx / v_norm
u_y = vy / v_norm
println("单位化方向向量: u = ($(round(u_x, digits=4)), $(round(u_y, digits=4)))")
# 方向导数 = ∇T · u
directional_derivative = grad_T_x * u_x + grad_T_y * u_y
println("方向导数 = $(round(directional_derivative, digits=4))")
详细验证计算
让我们用Julia代码来验证我们的计算是否正确:
# 数值验证和详细计算
println()
println("=== 详细计算过程 ===")
# 计算e^(-0.75)的值
e_075 = exp(-0.75)
println("e^(-0.75) = $(round(e_075, digits=4))")
# 验证梯度计算
println("梯度验证:")
println("∂T/∂x(0.5, -0.5) = -200 * 0.5 * $(round(e_075, digits=4)) = $(round(grad_T_x, digits=4))")
println("∂T/∂y(0.5, -0.5) = -400 * (-0.5) * $(round(e_075, digits=4)) = $(round(grad_T_y, digits=4))")
# 验证方向导数计算
println("方向导数验证:")
println("D_u T = $(round(grad_T_x, digits=4)) * $(round(u_x, digits=4)) + $(round(grad_T_y, digits=4)) * $(round(u_y, digits=4))")
println("D_u T = $(round(grad_T_x * u_x, digits=4)) + $(round(grad_T_y * u_y, digits=4))")
println("D_u T = $(round(directional_derivative, digits=4))")
物理意义解释
梯度的物理意义
梯度 ∇T 表示温度变化最快的方向:
- 在点(0.5, -0.5)处,梯度为(-47.24, 94.48)
- 这意味着温度在x方向减少,在y方向增加
- 梯度的方向指向温度增加最快的方向
方向导数的物理意义
方向导数 表示在指定方向上温度的变化率:
- 方向导数 ≈ 47.24 为正值
- 这表示沿方向(3,4)温度会增加
- 如果方向导数为负值,则表示温度会减少
温度分布特点
println()
println("=== 物理意义解释 ===")
println("1. 梯度 ∇T 表示温度变化最快的方向")
println("2. 在点(0.5, -0.5)处,梯度为($(round(grad_T_x, digits=4)), $(round(grad_T_y, digits=4)))")
println("3. 方向导数 $(round(directional_derivative, digits=4)) 为正值,表示沿方向(3,4)温度增加")
println("4. 温度在原点(0,0)处最高,向四周递减")
温度分布数值表
让我们看看不同位置的温度值:
# 创建简单的数值表格
println()
println("=== 温度分布数值表 ===")
println("坐标点\t\t温度值")
println("(0,0)\t\t$(round(100*exp(0), digits=2))°C")
println("(0.5,-0.5)\t$(round(100*exp(-0.5^2-2*(-0.5)^2), digits=2))°C")
println("(1,0)\t\t$(round(100*exp(-1^2), digits=2))°C")
println("(0,1)\t\t$(round(100*exp(-2*1^2), digits=2))°C")
结果分析:
- 原点(0,0)温度最高:100°C
- 点(0.5,-0.5)温度:约47.24°C
- 点(1,0)温度:约36.79°C
- 点(0,1)温度:约13.53°C
下面是运行结果



下面是完整的代码
# 使用Julia基础功能解决多元函数求导和温度分布问题
println("=== 题目五解答 ===")
println("日期: 8月21日")
println()
# 问题1: 多元函数求导
println("问题1: 求多元函数对x, y, z的导数表达式")
println()
# 函数1: f(x, y, z) = 2xy * tan(x) + e^(3xz) + cos(yz)
println("(1) 函数 f(x, y, z) = 2xy * tan(x) + e^(3xz) + cos(yz)")
# 手动计算偏导数
println("∂f/∂x = 2y*tan(x) + 2xy*sec²(x) + 3z*e^(3xz)")
println("∂f/∂y = 2x*tan(x) - z*sin(yz)")
println("∂f/∂z = 3x*e^(3xz) - y*sin(yz)")
println()
# 函数2: g(x, y, z) = (x + y + yz) / sin(xy)
println("(2) 函数 g(x, y, z) = (x + y + yz) / sin(xy)")
# 手动计算偏导数
println("∂g/∂x = [sin(xy) - (x+y+yz)*cos(xy)*y] / sin²(xy)")
println("∂g/∂y = [sin(xy)*(1+z) - (x+y+yz)*cos(xy)*x] / sin²(xy)")
println("∂g/∂z = y / sin(xy)")
println()
# 问题2: 温度分布问题
println("问题2: 金属板温度分布")
println("温度函数: T(x, y) = 100e^(-x^2 - 2y^2)")
println()
# 手动计算梯度
println("(1) 温度梯度 ∇T = (∂T/∂x, ∂T/∂y)")
println("∂T/∂x = -200x * e^(-x^2 - 2y^2)")
println("∂T/∂y = -400y * e^(-x^2 - 2y^2)")
# 在点(0.5, -0.5)处计算梯度
x0 = 0.5; y0 = -0.5
e_term = exp(-x0^2 - 2*y0^2)
grad_T_x = -200 * x0 * e_term
grad_T_y = -400 * y0 * e_term
println("在点(0.5, -0.5)处的梯度:")
println("∇T(0.5, -0.5) = ($(round(grad_T_x, digits=4)), $(round(grad_T_y, digits=4)))")
println()
# (2) 计算方向导数
println("(2) 计算温度沿方向 v=(3,4)的方向导数")
# 方向向量 v=(3,4)
vx = 3; vy = 4
# 单位化方向向量
v_norm = sqrt(vx^2 + vy^2)
u_x = vx / v_norm
u_y = vy / v_norm
println("单位化方向向量: u = ($(round(u_x, digits=4)), $(round(u_y, digits=4)))")
# 方向导数 = ∇T · u
directional_derivative = grad_T_x * u_x + grad_T_y * u_y
println("方向导数 = $(round(directional_derivative, digits=4))")
println()
println("=== 解答完成 ===")
# 数值验证和详细计算
println()
println("=== 详细计算过程 ===")
# 计算e^(-0.75)的值
e_075 = exp(-0.75)
println("e^(-0.75) = $(round(e_075, digits=4))")
# 验证梯度计算
println("梯度验证:")
println("∂T/∂x(0.5, -0.5) = -200 * 0.5 * $(round(e_075, digits=4)) = $(round(grad_T_x, digits=4))")
println("∂T/∂y(0.5, -0.5) = -400 * (-0.5) * $(round(e_075, digits=4)) = $(round(grad_T_y, digits=4))")
# 验证方向导数计算
println("方向导数验证:")
println("D_u T = $(round(grad_T_x, digits=4)) * $(round(u_x, digits=4)) + $(round(grad_T_y, digits=4)) * $(round(u_y, digits=4))")
println("D_u T = $(round(grad_T_x * u_x, digits=4)) + $(round(grad_T_y * u_y, digits=4))")
println("D_u T = $(round(directional_derivative, digits=4))")
println()
println("=== 物理意义解释 ===")
println("1. 梯度 ∇T 表示温度变化最快的方向")
println("2. 在点(0.5, -0.5)处,梯度为($(round(grad_T_x, digits=4)), $(round(grad_T_y, digits=4)))")
println("3. 方向导数 $(round(directional_derivative, digits=4)) 为正值,表示沿方向(3,4)温度增加")
println("4. 温度在原点(0,0)处最高,向四周递减")
# 创建简单的数值表格
println()
println("=== 温度分布数值表 ===")
println("坐标点\t\t温度值")
println("(0,0)\t\t$(round(100*exp(0), digits=2))°C")
println("(0.5,-0.5)\t$(round(100*exp(-0.5^2-2*(-0.5)^2), digits=2))°C")
println("(1,0)\t\t$(round(100*exp(-1^2), digits=2))°C")
println("(0,1)\t\t$(round(100*exp(-2*1^2), digits=2))°C")
所属专栏:Syslab基础平台
产品信息:Syslab科学计算环境