Fast Simulation of Mass-Spring Systems in Rust 论文阅读

参考资料:

Fast Simulation of Mass-Spring Systems in Rust

论文阅读:Fast Simulation of Mass-Spring Systems

【论文精读】讲解刘天添2013年的fast simulation of mass spring system(Projective Dynamics最早的论文)

Projective Dynamics笔记(一)——Fast Mass Spring

文章目录

  • 概述
  • 流程概述:
  • 1.前置知识
      • 1.1 运动方程(牛顿第二定律)
      • 1.2 二阶导数的离散化
      • 1.3 代入运动方程
      • 1.4 物理意义
  • 2. 将隐式积分问题转化为一个优化问题
    • 2.1 要解的是隐式积分问题是:
    • 2.2 引入辅助变量d
    • 2.3 Block Coordinate Descent(块坐标下降法)
      • Global Step部分

概述

这篇论文通过引入弹簧方向的辅助变量,并采用块坐标下降法解决了传统隐式欧拉法中速度慢的问题,成功实现了弹簧质点系统的快速仿真。该方法特别适用于实时应用,并且在低迭代次数下也能得到较好的视觉效果。

流程概述:

1.前置知识

1.1 运动方程(牛顿第二定律)

在物理仿真中,系统的运动通常由二阶微分方程描述,例如: M d 2 q d t 2 = f ( q ) M \frac{d^2q}{dt^2} = f(q) Mdt2d2q=f(q)
其中:

  • ( M ) 是质量矩阵,表示系统中各质点的质量。
  • ( q(t) ) 是位置向量,表示质点的位置。
  • ( f(q) ) 是作用在质点上的力,通常是位移 ( q ) 的函数。

1.2 二阶导数的离散化

使用中心差分法,二阶导数 ( d 2 q d t 2 \frac{d^2q}{dt^2} dt2d2q ) 的离散形式为:
d 2 q d t 2 ≈ q n + 1 − 2 q n + q n − 1 h 2 \frac{d^2q}{dt^2} \approx \frac{q_{n+1} - 2q_n + q_{n-1}}{h^2} dt2d2qh2qn+12qn+qn1
其中:

  • ( q_n ) 是时间 ( t_n ) 时的位置。
  • ( q_{n+1} ) 是时间 ( t_{n+1} = t_n + h ) 时的位置。
  • ( q_{n-1} ) 是时间 ( t_{n-1} = t_n - h ) 时的位置。
  • ( h ) 是时间步长

1.3 代入运动方程

将二阶导数的离散化形式代入运动方程 ( M d 2 q d t 2 = f ( q ) M \frac{d^2q}{dt^2} = f(q) Mdt2d2q=f(q) ):
M q n + 1 − 2 q n + q n − 1 h 2 = f ( q n + 1 ) M \frac{q_{n+1} - 2q_n + q_{n-1}}{h^2} = f(q_{n+1}) Mh2qn+12qn+qn1=f(qn+1)
最后我们得到隐式欧拉法的公式:
M ( q n + 1 − 2 q n + q n − 1 ) = h 2 f ( q n + 1 ) M(q_{n+1} - 2q_n + q_{n-1}) = h^2 f(q_{n+1}) M(qn+12qn+qn1)=h2f(qn+1)
其中,( q n + 1 q_{n+1} qn+1 ) 是需要通过求解获得的未知位置,( f ( q n + 1 ) f(q_{n+1}) f(qn+1) ) 依赖于 ( q n + 1 q_{n+1} qn+1 ),因此这是一个隐式公式

1.4 物理意义

在这里插入图片描述

2. 将隐式积分问题转化为一个优化问题

2.1 要解的是隐式积分问题是:

M q n + 1 − 2 q n + q n − 1 h 2 = f ( q n + 1 ) M \frac{q_{n+1} - 2q_n + q_{n-1}}{h^2} = f(q_{n+1}) Mh2qn+12qn+qn1=f(qn+1)
其中:
n是时间迭代步
q是所有粒子的位置向量
M是粒子质量对角矩阵
h是时间步长
f是整个系统的保守力
q n + 1 q_{n+1} qn+1是未知状态量,设为x。 q n q_{n} qn q n − 1 q_{n-1} qn1是已知量,设为 y = 2 q n − q n − 1 y=2q_{n}-q_{n-1} y=2qnqn1
所以得到式子 M ( x − y ) = h 2 f ( x ) M(x-y)=h^2f(x) M(xy)=h2f(x)
求解这个方程,等效于求解下面这个方程的极小值:
(令g(x)求导为0得到上式)
g ( x ) = 1 2 ( x − y ) T M ( x − y ) + h 2 E ( x ) g(x) = \frac{1}{2}(x - y)^T M (x - y) + h^2 E(x) g(x)=21(xy)TM(xy)+h2E(x)

其中,( E ) 为系统的势能(因为 ( ∇ E = − f \nabla E = -f E=f ),因此 ( ∇ g = 0 \nabla g = 0 g=0 ) 等效于公式 (7))。

按照胡克定律,弹簧的弹性势能为:

E = 1 2 k ( ∥ p 1 − p 2 ∥ − r ) 2 E = \frac{1}{2} k ( \|p_1 - p_2\| - r )^2 E=21k(p1p2r)2

其中:

  • ( p 1 , p 2 p_1, p_2 p1,p2 ) 为两个粒子的位置,
  • ( r ) 为弹簧的静止长度(rest length)。

但如果直接采用这个形式,上面的 ( g(x) ) 极值问题就不太好解。为了将上式变形为一个方便求解的形式,作者引入了一个辅助变量 ( d ∈ R 3 d \in \mathbb{R}^3 dR3 )。

2.2 引入辅助变量d

公式如下:
假设d是一个未知的三位向量,那么:
( ∥ p 1 − p 2 ∥ − r ) 2 = min ⁡ ∥ d ∥ = r ∥ p 1 − p 2 − d ∥ 2 (\|p_1 - p_2\| - r)^2 = \min_{\|d\|=r} \|p_1 - p_2 - d\|^2 (p1p2r)2=d=rminp1p2d2

1. 左边公式的物理意义:

左边的公式 ( ( ∥ p 1 − p 2 ∥ − r ) 2 (\|p_1 - p_2\| - r)^2 (p1p2r)2 ) 是弹簧势能的表示形式,依据胡克定律,它表示弹簧当前长度 ( |p_1 - p_2| ) 与静止长度 ( r ) 之间的差的平方。这里 ( p 1 p_1 p1 ) 和 ( p 2 p_2 p2 ) 是弹簧两端质点的位置

2. 右边公式的几何解释:

右边的公式引入了一个辅助向量 ( d ),并对其施加约束 ( |d| = r )。这个向量表示固定长度为 ( r ) 的向量,但方向可以自由变化。优化问题为:
min ⁡ ∥ d ∥ = r ∥ p 1 − p 2 − d ∥ 2 \min_{\|d\|=r} \|p_1 - p_2 - d\|^2 d=rminp1p2d2
这个问题的意思是寻找一个向量 ( d ),使得 ( p 1 − p 2 p_1 - p_2 p1p2 ) 与 ( d ) 的差最小,即让 ( ∥ p 1 − p 2 − d ∥ \|p_1 - p_2 - d\| p1p2d ) 最小化

显然当 d = r p 1 − p 2 ∥ p 1 − p 2 ∥ 时取极小值 显然当d = r \frac{p_1 - p_2}{\|p_1 - p_2\|}时取极小值 显然当d=rp1p2p1p2时取极小值

重新定义弹簧的弹性势能E(x,d)

在这里插入图片描述

矩阵L和J的推导

在这里插入图片描述

第一行的式子为什么可以等于L和J,证明如下:
忽略 d i T d i d^T_{i}d_{i} diTdi是关于 d 的平方项,但这项对 x 的优化没有直接影响,因此我们暂时忽略它,只关注 x 和 d 之间的关系

在这里插入图片描述
S i T S_i^T SiT是一个选择矩阵,是一个单位向量(标准基),用于选择第 𝑖个弹簧的位移变量 d i d_{i} di

在这里, d = S i T d d = S_i^T d d=SiTd 可以理解为,向量 d d d 中的每个分量 d i d_i di 对应一个特定的弹簧的偏移量。通过 S i T d S_i^T d SiTd,我们提取了 d d d 中与第 i i i 个弹簧相关的那部分位移。

换句话说, S i T S_i^T SiT 确保我们从总的 d d d 向量中只选取第 i i i 个元素(因为 S i T S_i^T SiT 是一个标准基,其他位置上的元素都会被置为 0)。

因此,对于每个弹簧 i i i,我们有:

d i = S i T d d_i = S_i^T d di=SiTd

这表示 d i d_i di 是通过选择矩阵 S i T S_i^T SiT d d d 中提取出来的。
在这里插入图片描述

外力为什么放在 X T () X^T() XT()里面

外力 𝑓 e x t 𝑓_{ext} fext被视作对系统的额外作用力,所以在总的能量函数中,它会影响线性部分,即外力对位移 x 的作用是线性的。因此,外力项自然可以放入这个线性项中
乘以 h 2 ℎ^2 h2体现了外力在整个时间步长内的累积效应
力和加速度是直接相关的。加速度是位移 𝑥对时间 𝑡的二阶导数。而当我们离散化这个二阶导数时,时间步长 ℎ被平方了

2.3 Block Coordinate Descent(块坐标下降法)

在这里插入图片描述

Global Step部分

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/457525.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp圆形波浪进度效果

uniapp圆形波浪进度效果 背景实现思路代码实现尾巴 背景 最近项目中有些统计的地方需要用到圆形的波浪进度效果,要求是根据百分比值然后在一个圆形内动态的展示一个波浪形的进度,看参考一下效果。 实现思路 这个效果看着挺复杂的,那么我们…

【Linux】磁盘文件系统(inode)、软硬链接

文章目录 1. 认识磁盘1.1 磁盘的物理结构1.2 磁盘的逻辑结构 2. 引入文件系统2.1 EXT系列文件系统的分区结构2.2 inode 3. 软硬链接3.1 软链接3.2 硬链接 在讲过了内存文件系统后,我们可以知道文件分为两种: 打开的文件(内存中)未…

如何提高英语口语表达能力?

提高英语口语表达能力是一个逐步积累和实践的过程。 1. 自我练习方法 录音与回听 录音:用手机或其他设备录下自己的口语练习,比如描述一天的活动、讲述一个故事或复述一篇文章。 回听:仔细听录音,找出发音、语法和流利度方面的问…

【设计模式-状态模式】

状态模式(State Pattern)是一种行为设计模式,它允许一个对象在内部状态改变时改变它的行为。换句话说,这种模式让对象在不同的状态下能够表现出不同的行为,而不需要修改对象的代码。状态模式通过将对象的行为与状态进行…

node集成redis (教学)

文章目录 前言一、安装redis二、可视化界面测试连接1.vscode安装插件 三、node代码编写1.先安装两个库(redis和ioredis)2.测试连接 (前提是你的redis服务器要启动起来) 总结 前言 在Node.js中集成ioredis是一个常见的做法&#x…

vscode配色主题与图标库推荐

vscode配色主题推荐:Andromedavsocde图标库: vscode-icons Andromeda Dark theme with a taste of the universe 仙女座:一套宇宙深空体验的哑暗色主题; 高对比度,色彩饱和; Easy Installation Open the extensions sidebar on Visual Studio CodeSear…

【LeetCode:263. 丑数 + 数学】

在这里插入代码片 🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕…

apply call bind 简介

Function.prototype.call(thisArg [, arg1, arg2, …]) call() 简述 call() 方法 调用一个函数, 其具有一个指定的 this 值和分别地提供的参数(参数的列表)。当第一个参数为 null、undefined 的时候, 默认 this 上下文指向window。 call() 简单实例 const name …

【项目复现】——DDoS-SDN Detection Project

文章目录 概要整体架构流程1. 系统和网络配置2. SDN控制器配置3. 流量生成4. 数据采集5. DDoS检测机制6. 机器学习模型训练7. 实时检测部署 前期准备复现流程第一步:系统和网络配置1.1 安装和设置操作系统1.2 安装VirtualBox和Mininet1.3 创建SDN网络拓扑 第二步&am…

探索现代软件开发中的持续集成与持续交付(CI/CD)实践

探索现代软件开发中的持续集成与持续交付(CI/CD)实践 随着软件开发的飞速进步,现代开发团队已经从传统的开发模式向更加自动化和灵活的开发流程转变。持续集成(CI) 与 持续交付(CD) 成为当下主…

w~自动驾驶合集6

我自己的原文哦~ https://blog.51cto.com/whaosoft/12286744 #自动驾驶的技术发展路线 端到端自动驾驶 Recent Advancements in End-to-End Autonomous Driving using Deep Learning: A SurveyEnd-to-end Autonomous Driving: Challenges and Frontiers 在线高精地图 HDMa…

iOS AVAudioSession 详解【音乐播放器的配置】

前言 在 iOS 音频开发中,AVAudioSession 是至关重要的工具,它控制着应用的音频行为,包括播放、录音、后台支持和音频中断处理等。对于音乐播放器等音频需求强烈的应用,设计一个合理的 AVAudioSession 管理体系不仅能保证音频播放…

三周精通FastAPI:16 Handling Errors处理错误

官网文档:https://fastapi.tiangolo.com/zh/tutorial/handling-errors 处理错误 某些情况下,需要向客户端返回错误提示。 这里所谓的客户端包括前端浏览器、其他应用程序、物联网设备等。 需要向客户端返回错误提示的场景主要如下: 客户端…

FastAPI、langchain搭建chatbot,langgraph实现历史记录

环境:openEuler、python 3.11.6、Azure openAi、langchain 0.3.3、langgraph 0.2.38 背景:基于FastAPI、langchain实现一个QA系统,要求实现历史记录以及存储特征信息 时间:20241022 说明:在历史记录的存储中&…

R语言机器学习算法实战系列(十四): CatBoost分类算法+SHAP值 (categorical data gradient boosting)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍CatBoost的原理CatBoost的步骤教程下载数据加载R包导入数据数据预处理数据描述数据切割设置数据对象调节参数训练模型预测测试数据评估模型模型准确性混淆矩阵模型评估指标ROC Curv…

mysql 通过GROUP BY 聚合并且拼接去重另个字段

我的需求: 我想知道同一个手机号出现几次,并且手机号出现在哪些地方。下面是要的效果。 源数据: CREATE TABLE bank (id bigint(20) unsigned NOT NULL AUTO_INCREMENT,user_id int(11) NOT NULL DEFAULT 0,tel varchar(255) COLLATE utf8mb4_unicode_…

【自然语言处理】BERT模型

BERT:Bidirectional Encoder Representations from Transformers BERT 是 Google 于 2018 年提出的 自然语言处理(NLP)模型,它基于 Transformer 架构的 Encoder 部分。BERT 的出现极大提升了 NLP 任务的性能,如问答系…

Python | Leetcode Python题解之第509题斐波那契数

题目&#xff1a; 题解&#xff1a; class Solution:def fib(self, n: int) -> int:if n < 2:return nq [[1, 1], [1, 0]]res self.matrix_pow(q, n - 1)return res[0][0]def matrix_pow(self, a: List[List[int]], n: int) -> List[List[int]]:ret [[1, 0], [0, …

自动化部署-02-jenkins部署微服务

文章目录 前言一、配置SSH-KEY1.1 操作jenkins所在服务器1.2 操作github1.3 验证 二、服务器安装git三、jenkins页面安装maven四、页面配置自动化任务4.1 新建任务4.2 选择4.3 配置参数4.4 配置脚本 五、执行任务5.1 点击执行按钮5.2 填写参数5.3 查看日志 六、查看服务器文件七…

51单片机STC8G串口Uart配置

测试环境 单片机型号&#xff1a;STC8G1K08-38I-TSSOP20&#xff0c;其他型号请自行测试&#xff1b; IDE&#xff1a;KEIL C51&#xff1b; 寄存器配置及主要代码 STC8G系列单片机具有4个全双工异步串行通信接口&#xff1b;本文以串口1为例&#xff0c;串口1有4种工作方式…