物理建模与模拟

物理建模与模拟

一、物理系统的数学建模

1. 物理建模的基本步骤

在物理学中,将一个物理现象转化为数学模型的基本步骤包括:

  1. 问题描述
    • 明确研究对象和关键物理现象,例如:热传导、流体流动、光的传播与折射等。
  2. 建立假设与简化
    • 对实际问题进行合理简化(如忽略空气阻力、采用一维近似等),以便建立数学模型。
  3. 确定变量与参数
    • 选择描述物理状态的变量(例如温度 u ( x , t ) u(x,t) u(x,t)、速度 v ( x , t ) v(x,t) v(x,t))及相关参数(例如热扩散系数 α \alpha α)。
  4. 建立数学方程
    • 利用基本原理(守恒定律、牛顿第二定律、能量守恒定律等)推导出微分方程或代数方程。例如:
      • 热传导方程
        ∂ u ( x , t ) ∂ t = α ∂ 2 u ( x , t ) ∂ x 2 \frac{\partial u(x,t)}{\partial t} = \alpha \frac{\partial^2 u(x,t)}{\partial x^2} tu(x,t)=αx22u(x,t)
      • 流体力学中常用的 Navier–Stokes 方程
      • 光的折射则利用 Snell 定律:
        n 1 sin ⁡ θ 1 = n 2 sin ⁡ θ 2 n_1 \sin\theta_1 = n_2 \sin\theta_2 n1sinθ1=n2sinθ2
  5. 确定边界条件与初始条件
    • 根据物理问题的实际情况,给出边界条件(如固定温度、无滑移边界)和初始条件(初始温度分布、初始流场等)。
  6. 求解模型
    • 采用解析方法或数值方法求解模型,并对结果进行物理解释和验证。
2. 数学建模实例

以一维热传导为例:

  • 物理问题描述:研究一根均匀金属棒内温度随时间的变化。
  • 建立数学模型:由能量守恒和傅里叶定律得到
    ∂ u ( x , t ) ∂ t = α ∂ 2 u ( x , t ) ∂ x 2 \frac{\partial u(x,t)}{\partial t} = \alpha \frac{\partial^2 u(x,t)}{\partial x^2} tu(x,t)=αx22u(x,t)
  • 边界条件与初始条件:例如
    u ( 0 , t ) = 0 , u ( L , t ) = 0 , u ( x , 0 ) = sin ⁡ ( π x L ) u(0,t)=0,\quad u(L,t)=0,\quad u(x,0)=\sin\left(\frac{\pi x}{L}\right) u(0,t)=0,u(L,t)=0,u(x,0)=sin(Lπx)
  • 求解方法:采用差分法或有限元法求解(详见后续“计算物理方法”部分)。

二、计算物理方法

1. 数值方法简介

当数学模型较为复杂或没有解析解时,我们可以借助计算机进行数值求解。常用的数值方法包括:

  • 差分法:将连续变量离散化,用差分近似替代微分算子。
  • 有限元法:将求解区域划分为若干小单元,在每个单元上构造试探函数,转化为代数方程。
  • 蒙特卡罗方法:用于随机过程的模拟。
2. 数值求解步骤

以差分法求解一维热传导方程为例:

  1. 离散化
    • 将空间 x ∈ [ 0 , L ] x\in[0,L] x[0,L] 分为 N N N 个节点,步长 Δ x = L N − 1 \Delta x=\frac{L}{N-1} Δx=N1L
    • 将时间 t t t 离散为步长 Δ t \Delta t Δt
  2. 差分表达式
    • 时间一阶导数采用前向差分:
      ∂ u ∂ t ∣ ( x i , t n ) ≈ u i n + 1 − u i n Δ t \frac{\partial u}{\partial t} \Big|_{(x_i,t^n)} \approx \frac{u_i^{n+1}-u_i^n}{\Delta t} tu (xi,tn)Δtuin+1uin
    • 空间二阶导数采用中心差分:
      ∂ 2 u ∂ x 2 ∣ ( x i , t n ) ≈ u i + 1 n − 2 u i n + u i − 1 n ( Δ x ) 2 \frac{\partial^2 u}{\partial x^2} \Big|_{(x_i,t^n)} \approx \frac{u_{i+1}^n-2u_i^n+u_{i-1}^n}{(\Delta x)^2} x22u (xi,tn)(Δx)2ui+1n2uin+ui1n
  3. 得到数值格式
    将上述差分式代入原方程,得显式差分格式:
    u i n + 1 = u i n + r ( u i + 1 n − 2 u i n + u i − 1 n ) , r = α Δ t ( Δ x ) 2 u_i^{n+1}=u_i^n + r\left(u_{i+1}^n-2u_i^n+u_{i-1}^n\right),\quad r=\frac{\alpha\Delta t}{(\Delta x)^2} uin+1=uin+r(ui+1n2uin+ui1n),r=(Δx)2αΔt
  4. 稳定性与精度
    • 稳定性条件(显式方法):一般要求 r ≤ 0.5 r\le0.5 r0.5
    • 精度取决于 Δ x \Delta x Δx Δ t \Delta t Δt 的大小。

三、案例分析:物理建模与模拟实例

案例 1:热传导问题的数值模拟

问题描述
模拟一根长度为 L = 1 L=1 L=1 的金属棒内温度随时间的变化。

  • 初始条件:
    u ( x , 0 ) = sin ⁡ ( π x ) u(x,0)=\sin(\pi x) u(x,0)=sin(πx)
  • 边界条件:
    u ( 0 , t ) = u ( 1 , t ) = 0 u(0,t)=u(1,t)=0 u(0,t)=u(1,t)=0
  • 物理参数:
    (\alpha=1);选择合适的 Δ x \Delta x Δx Δ t \Delta t Δt(确保 r = α Δ t ( Δ x ) 2 ≤ 0.5 r=\frac{\alpha\Delta t}{(\Delta x)^2}\le0.5 r=(Δx)2αΔt0.5)。

数值求解步骤与答案

  1. N = 50 N=50 N=50 个网格点,则 Δ x ≈ 1 49 ≈ 0.02041 \Delta x\approx\frac{1}{49}\approx0.02041 Δx4910.02041
  2. Δ t = 0.0001 \Delta t=0.0001 Δt=0.0001,则
    r ≈ 1 × 0.0001 ( 0.02041 ) 2 ≈ 0.24   ( < 0.5 ) r\approx\frac{1\times0.0001}{(0.02041)^2}\approx0.24\ (<0.5) r(0.02041)21×0.00010.24 (<0.5)
  3. 利用迭代公式更新每个时间步的温度分布。

(具体计算过程请见后续 Python 代码示例。)

案例 2:光的折射模拟——物理建模与模拟项目

问题描述
模拟一束光在两种介质交界处的折射现象。

  • 物理原理:利用 Snell 定律
    n 1 sin ⁡ θ 1 = n 2 sin ⁡ θ 2 n_1\sin\theta_1=n_2\sin\theta_2 n1sinθ1=n2sinθ2
    其中 n 1 , n 2 n_1,n_2 n1,n2 分别为两种介质的折射率,(\theta_1) 为入射角(相对于法线),(\theta_2) 为折射角。
  • 实例参数
    n 1 = 1.0 n_1=1.0 n1=1.0(空气)、 n 2 = 1.5 n_2=1.5 n2=1.5(玻璃);入射角 (\theta_1=45^\circ)。
    由 Snell 定律得
    sin ⁡ θ 2 = n 1 n 2 sin ⁡ 4 5 ∘ ≈ 1 1.5 × 0.7071 ≈ 0.4714 , \sin\theta_2=\frac{n_1}{n_2}\sin45^\circ\approx\frac{1}{1.5}\times0.7071\approx0.4714, sinθ2=n2n1sin451.51×0.70710.4714,
    因此,(\theta_2\approx28.1^\circ)。

建模思路

  • 将介质交界面设为水平直线(例如 y = 0 y=0 y=0);
  • 设光线起始于上方介质,沿某方向入射,交界处按 Snell 定律计算折射角;
  • 用直线方程描述入射光线和折射光线,最终绘制出图像。

四、课堂活动

活动目标
学生需选择一个物理现象(例如气流模拟或光的折射),建立数学模型,并利用数值方法编程实现模拟。

活动要求与流程

  1. 建模
    • 明确研究对象、建立数学模型(写出方程、确定边界和初始条件)。
  2. 编程实现
    • 使用 Python 编写数值求解代码(如差分法、射线追踪等)。
  3. 结果展示与讨论
    • 绘制图表展示模拟结果,并讨论不同参数(如步长、介质参数)对结果的影响。

实例
本课中提供的“光的折射”模拟示例,即要求学生计算折射角、编程绘制入射与折射光线的路径,并验证 Snell 定律。


五、Python 代码实现示例——光的折射模拟

下面给出利用 Snell 定律模拟光在两介质交界处折射的 Python 示例代码:

import numpy as np
import matplotlib.pyplot as plt

# 介质参数
n1 = 1.0    # 上介质(空气)的折射率
n2 = 1.5    # 下介质(玻璃)的折射率

# 入射角(相对于法线,单位为度)
theta1_deg = 45.0
theta1 = np.radians(theta1_deg)

# 计算折射角(利用 Snell 定律 n1*sin(theta1) = n2*sin(theta2))
sin_theta2 = (n1/n2) * np.sin(theta1)
theta2 = np.arcsin(sin_theta2)
theta2_deg = np.degrees(theta2)
print("入射角: {:.1f}°,折射角: {:.1f}°".format(theta1_deg, theta2_deg))

# 定义界面:设 y=0 为两介质交界线,y>0 为上介质,y<0 为下介质

# 模拟入射光线
# 假设入射光线起点为 (0, 1)(单位任意),方向由 theta1 确定(下行)
# 入射方向的单位向量:(sin(theta1), -cos(theta1))
t_incident = np.linspace(0, 1/np.cos(theta1), 100)  # 参数 t 控制光线位置
x_incident = 0 + np.sin(theta1) * t_incident
y_incident = 1 - np.cos(theta1) * t_incident

# 计算入射光线与界面的交点(y=0)
t_int = 1/np.cos(theta1)
x_int = np.sin(theta1) * t_int
y_int = 0  # 交点

# 模拟折射光线(从交点开始,在下介质中)
# 折射光线方向单位向量:(sin(theta2), -cos(theta2))
t_refract = np.linspace(0, 1, 100)
x_refract = x_int + np.sin(theta2) * t_refract
y_refract = y_int - np.cos(theta2) * t_refract

# 绘制光线轨迹
plt.figure(figsize=(8,6))
plt.plot(x_incident, y_incident, label="入射光线")
plt.plot(x_refract, y_refract, label="折射光线")
plt.axhline(0, color='k', linestyle='--', label="介质界面")
plt.xlabel("x 坐标")
plt.ylabel("y 坐标")
plt.title("光在介质交界处的折射模拟")
plt.legend()
plt.grid(True)
plt.show()

代码说明

  • 利用 Snell 定律计算入射角 (45^\circ) 下的折射角(结果约为 (28.1^\circ));
  • 将介质界面设为 y = 0 y=0 y=0
  • 模拟入射光线从点 (0,1) 出发,直至与界面相交;
  • 在交点处根据折射角重新计算折射光线的方向,并绘制整个光路。

六、总结与讨论

  1. 物理建模
    • 通过将实际物理现象(如热传导、光折射等)转化为数学模型,我们可以利用数学工具和数值方法求解复杂问题。
  2. 计算物理方法
    • 数值方法(差分法、有限元法等)使我们能够在没有解析解的情况下,通过编程进行模拟,并通过结果验证理论。
  3. 案例分析
    • 结合热传导和光折射两个实例,展示了如何建立数学模型、确定边界条件和利用数值方法进行模拟。
  4. 课堂活动
    • 学生可选择其他物理现象(如气流模拟、液体波动等)进行建模与数值模拟,进一步体会数学物理建模与计算方法在实际工程问题中的应用。

通过本课程的学习,将掌握物理建模的基本步骤与方法,并能利用计算机模拟解决复杂物理问题,从而为后续工程与科研中的实际问题提供理论与数值支持。

Physics Modelling for Game Programmers 游戏编程中的物理建模(中文删节版) 后记】 我将这本书界定成 3D 游戏开发的入门书籍,其实一直来我都有一个疑问,起初的时候我看 了很多 3D 开发方面的书籍也做了一些例子程序,但是对 3D开发还是有许多未知,自从我 见到这书以后,我终于明白我缺少的是什么了?其实就是需要一条线把我所学过的这些知识 全部串起来,反观当下无论是纸皮书还是电子书往往都是将 3D 开发分成若干块,专门讲一 块或是几块,开发是一个整体,所以我看了那么多书似乎前面还是有一层纱捅不破。 如果你是个新手,那绝对在此书会找到很多你感兴趣的东西,如果对于 DirectX 你已经足够 了解但就是不知从何开始,这本书可以整理你的思路,带你走出山谷奔向另一座高峰。 大概因为作者是一名老师的缘故,论述有些拖泥带水,文中涉及到的 c++以及 Direct3D 基 础知识我都没有翻出,我相信你轻易就能找到相应的替代品,对于 15 章和 16 章的实例分 析没有翻,我想任何具备高中物理程度的人都不难推导出这些公式,所以传言说老外的应用 科学的普及教育做得奇差,大概是真的。 本书只能作为免费传播,请勿用于商业,谢谢,最后我非常希望我的努力能换来你的赞许, 如果真是这样,那我将会很荣幸! 底层模式:HAL 和HEL(删除) 高层模式:DirectX 组件(删除) COM对象(删除) 使用DirectX 初始化 DirectX 的硬件方法 使用DirectX 向导初始化 Direct3D 使用物理建模框架初始化 Direct3D 小结(删除) 第三节:3D 编程和物理学的数学工具(删除) 三角几何(删除) 2D坐标系(删除) 3D和4D坐标系(删除) 物理单位(删除) 矢量 代码中实现的矢量:物理建模的数学库 矢量标量的乘除法 点积 叉积 单位化矢量 投影 Direct3D 中的矢量 矩阵 特性 加法和减法 乘法和除法 矩阵相乘 转置 行列式 逆矩阵 小结(删除) 第四节:2D 变换和渲染 2D变换 主动和被动变换 平移 旋转 缩放 组合变换 变换实现:一个三角形的自旋 使用物理建模的框架 设定几何体 更新帧(Frame) 渲染帧 将所有的步骤放置到一起(删除) 小结(删除) 第五节:3D 变换和渲染 3D变换 齐次坐标 平移 缩放 旋转 3D管道 局部坐标转世界坐标 世界坐标转观察坐标 观察坐标转投影坐标 投影坐标转屏幕坐标 3D渲染 例子1:3D 自旋三角形 例子2:自旋的圆椎 小结(删除) 第六节:网格(Mesh)和 X 文件 纹理 从文件创建纹理 设定纹理 材质 装载一个网格 获取纹理和材质 渲染网格 清除网格 d3d_mesh类 载入一个网格 渲染一个网格 d3d_mesh类中的引用计数 小结(删除) 第二部分:3D 对象,运动和碰撞 第七节:动态粒子 点状粒子 一维运动力学 速度(删除) 速度的导数求法(删除) 加速度(删除) 力 2D 和 3D 运动力学(删除) 质点模型 介绍d3d_point_mass类 使用d3d_point_mass类 游戏中的质点 小结(删除) 第八节:粒子碰撞 碰撞检测 包围球 包围圆柱 包围盒 空间分隔的优化 碰撞响应 动量守恒 能量 弹性碰撞 刚性碰撞 补偿系数 2D和3D 的粒子碰撞 球的碰撞 实现 小结(删除) 第九节:刚体动力 刚体 重心 2D 刚体旋转 2D 刚体的粒子 转矩和惯性力矩 3D刚体 3D转矩 3D 的平行轴定理 主轴线 定向 3D 刚体的实现 d3d_rigid_body类 初始化 d3d_rigid_body对象 更新d3d_rigid_body对象 渲染d3d_rigid_body对象 小结(删除) 第十节:刚体碰撞 碰撞检测 粗糙近似 碰撞检测的改进 碰撞响应 线性碰撞响应 角度碰撞响应 组合碰撞响应 更新物理建模框架 小结(删除) 第十一节:重力和抛射体 牛顿万有引力法则 抛射体轨迹 抛射体运动模型 冲力恒力之间的差异 滚动 小结(删除) 第十二节:质量弹力系统 实现弹力所需的事 头发马尾辫 织物 一切从周期运动开始 胡克定律 衰减周期运动 实现织物 升级质点 弹力 织物类 初始化织物 更新和渲染织物 进行调整 增加织物的表现力 小结(删除) 第十三节:水体波纹 水体浮力 水的特性 浮力产生的原理 求取压强和密度 运动阻力 对摩擦力的观察 粘性阻力 水体的流向 波 实现水体 低开销实现的技巧 3D水体 在水体中放置对象 为刚体增加浮力 它会浮起来吗? 小结(删除) 第三部分:3D 模拟 第十四节:为游戏开发需做的准备 重新设计物理建模的框架 简单程序的初始化 添加一个游戏类 设置高效的矩阵变换 恢复丢失的设备对象 使用质点重新定义刚体 网格原点和重心 DirectInput 介绍(删除) 初始化 DirectInput(删除) 获取键盘和鼠标输入(删除) 关闭DirectInput(删除) DirectX 中的摄像机运动(删除) 小结(删除) 第十五节:汽车,气垫船,船只以及小舟(删除整章) 汽车 能量,力,加速度和摩擦 车辆的空气阻力 制动 车辆拐弯 实现一个基本的车辆模型 气垫船和无引力飞船 气垫船是如何工作的 气垫船的空气阻力 气垫船拐弯 船只和小舟 船只和小舟的包围边界 船体容积的计算 船只和小舟的续航能力 质量和有效质量 阻力和小舟 空气阻力 流速和波 小结 第十六节:飞机和宇宙飞船(删除整章) 飞行模拟的简单方法 低空飞行或是无物理影响 实现一个简单的飞行模拟 飞机相关的物理学 飞机的主要部件 基本的动力 飞机建模:具备适合的地点和动力 宇宙飞船相关的物理学 宇宙中的空战 火箭 月球着陆器 其他行星已知的物理学 其他行星待论证的物理学 结束语(删除) 附录 A 术语(删除) 附录 B C++的一个简明介绍(删除) 附录 C window编程基础(删除) 索引(删除)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值