物理建模的一个重要概念:因果/非因果建模

物理系统的建模仿真,根据建模思想可划分为:

  1. 因果建模(Causal Modeling)
  2. 非因果建模(Acausal Modeling)

二者的核心思想是通过信号流还是方程来定义模型的行为。

像我们熟知的Simulink就是基于因果建模的思想,而Amesim、Modelica、maplesim、Simscape等物理仿真平台则是基于非因果建模的思想。

1. 因果建模

因果建模(Causal Modeling)也可称为信号流(signal-flow)建模,顾名思义,在建模过程中,各个组件通过信号连接。这些信号在组件之间交换,每个组件都有固定的输入信号(输入)和输出信号(输出)。

在组件内部,通过明确的赋值和操作,从已知输入计算输出。

这类似于编程语言中的赋值,对右侧的已知变量或一组变量执行计算,并将结果分配给左侧的另一个变量。

组件之间的信号连接定义了不同组件的输入和输出之间的唯一分配(一个输入对应一个输出)。

因此当存在多个输入/输出相连接时,必须考虑信号的分配与处理。

无论是将一个输出与多个输入并行连接,还是将多个输出连接到同一个输入,都必须考虑信号之间如何相互作用。

这种关系成为显式分配,即组件内部和组件之间存在固定的因果关系,链接各个组件的输入和输出,所需的整体模型被创建为来自各个显式运算的方程组。求解器可以通过连续应用各个运算对方程组进行数值计算,从而计算建模微分方程组的解。

因果建模也就是基于信号流的建模特别适合对因果关系明确且不会改变的系统进行建模,例如基于信号的控制器或系统。

但对于物理系统而言,有时相同的变量既充当输入又充当输出,变量之间的关系不具有因果方向,例如在机械系统中,来自环境的力影响物体的位移,但另一方面,物体的位移影响物体和环境之间的力。

2. 非因果建模

非因果建模(Acausal Modeling)也称为基于方程(equation-based)或基于物理(physics-based modeling)的建模。

其核心思想是用守恒定律描述系统或组件的行为和性能。

非因果建模是一种声明式建模风格,是基于方程而不是赋值语句的建模,对系统的输人和输出没有明确的规定。相反,它是通过联立组件本构方程(如欧姆定律)和守恒方程得到整个系统的方程组,一般情况下,利用守恒定律会把一个系统表示为微分代数方程(DAE)。

为了构建非因果关系模型,就需要识别所建模型的流变量(通量)势变量(跨量) ,这是来自于键合图的概念,其中:

  • 势变量代表了系统的驱动力。

  • 流变量代表在“势变量”驱动下的流量。

领域 (Domain)势变量(Potential)流变量 (Flow)
电学 (Electrical)电压 (Voltage)电流 (Current)
平移 (Translational)位置 (Position)力 (Force)
旋转 (Rotational)角度 (Angle)扭矩 (Torque)
磁 (Magnetic)磁势 (Magnetic potential)磁通量(Magnetic flux rate)
液压 (Hydraulic)压力 (Pressure)体积流量 (Volume flow)
热 (Heat)温度 (Temperature)热流量 (Heat flow)
化学 (Chemical)化学势 (Chemical potential)颗粒流 (Particle flow)
气动 (Pneumatic)压力 (Pressure)质量流量 (Mass flow)

流变量和势变量共同作用,可以描述系统的整体行为和动态响应。使得非因果建模能够自然、直观地表示复杂系统的相互作用和能量转换

非因果建模工具通常支持文本建模和可视化建模两种方式,前者以面向对象的方法为基础,通过称述式的数学方程语句来对物理系统进行建模。而后者可直接利用已有模型库同过块图连接来进行建模。

Simscape语言

Modelica语言

3. 非因果建模的优势

非因果建模采用更高层次的系统模型描述,通过计算机生成的精确方程而具有更好的数值稳定性和计算性能,相较于因果建模在模型重用和分层建模上有更好的表现。

3.1 模型可读性

一般情况下,通过因果建模方式建立的模型看起来一点也不像公式或模型图,通过模型或公式代码很难直观地理解系统的目的。

而非因果方式建立的模型与物理系统的结构十分类似,相应公式的数学形式是隐式微分代数方程的形式。

非因果模型通过方程直接描述系统行为,这些方程本身就起到了文档化的作用,不需要额外的文档来解释输入输出关系,模型本身就是最好的文档。

使用非因果建模语言(如Modelica)可以在不同物理域之间保持一致的建模风格。这种统一性使得不同领域的工程师能够更容易地理解和合作,阅读和维护模型也更加方便。

可读性对比

3.2 组合/扩展性

因果建模的一大挑战是:方程的复杂性并不与系统的规模成线性关系,随着系统规模的增加,方程的复杂性呈指数级别增长,建模工作量与出错的可能性也会增加。

例如对于一个连杆数不断增加的三维摆系统,因果建模所需计算的加法与乘法数量随连杆数的增加而成倍增加,而非因果建模所需增加的模块数量为定值。

连杆数量加法次数乘法次数非因果模块数量
1275
221829
313566013
46693,97417
52,72619,22421

再比如对于图示弹簧阻尼系统的建模,每增加一组弹簧-阻尼-质量块,因果建模的方式往往需要考虑因果关系而重新推导公式并搭建模型,且已经搭建的模型无法直接复用。

而非因果建模的方式无需考虑因果关系,可对已有模型进行组合或复用,大大降低了建模工作量。

组合/扩展性对比

3.3 多物理域建模

非因果建模的另一个优点在对于多物理域系统的支持,原因在于:

  1. 灵活性和模块化设计:非因果建模允许组件之间相互连接,而无需预先定义明确的因果关系(即输入和输出),这使得模型更加模块化和灵活,组件可以更容易地重用和重新配置。

  2. 自然描述系统:多物理域建模中,系统通常涉及多个物理现象(如电学、机械、热学等),非因果建模通过使用方程和约束来描述这些物理现象,使得模型更接近于真实系统的自然行为。

  3. 减少人工干预:传统的因果建模通常需要工程师手动分配输入和输出,这可能导致错误和效率低下。非因果建模自动生成求解顺序,减少了人工干预,提升了模型构建的效率和准确性。

  4. 提高模拟精度:非因果建模可以更精确地捕捉系统动态,因为它们使用方程组而不是单一方程来描述系统行为。这种方法在模拟非线性和动态复杂系统时特别有用。

  5. 简化模型维护:由于非因果建模是基于方程的,它更容易进行模型的修改和扩展。新的组件可以在不改变现有模型结构的情况下添加或修改,极大地简化了模型的维护工作。

  6. 提高求解器效率:非因果建模允许使用高级求解器来处理方程组,优化计算效率。先进的求解算法可以自动处理复杂的系统,找到有效的解。

Simscape 机-电系统

Modelica 机-电系统

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、付费专栏及课程。

余额充值