Penalty-Based Multibody Animation(3)

本文探讨了在物理模拟中如何避免刚体碰撞后的震荡现象,倾向于采用重阻尼或临界阻尼模型。通过设置合适的弹性系数k和阻尼系数b,确保在两帧间隔时间小于周期一半的情况下,实现简谐运动快速衰减。通过数学推导,得出k和b的计算方法,并解释了如何确定插值步长以在两帧间有效地降低运动幅度,从而增强物理动画的真实感。

        在已知弹簧-阻尼系统的数学模型之后。我们需要知道的是,我们并不想要两个碰撞的刚体出现震荡,而是希望刚体碰撞之后立即弹开,这才是现实中两个刚性物体碰撞的正常效果。为了达成这种效果,我们最好选择重阻尼或者临界阻尼这两种模型中的一种。并且,为了迅速的将两个产生穿透的刚体分开,我们需要在物理渲染一帧的时间内,将简谐运动的幅度降低到0,以保证我们的物理动画更加真实。

        为了达到真实的效果,对于该模型的一些关键参数我们需要人为的设定它。

        首先是两帧之间的间隔时间,应该小于周期的一半,原因是,我们观察简谐运动的曲线可以发现,周期一半正好是弹簧向外弹开物体的最大点,也是开始收缩的最小点,我们当然不希望已经要分开的物体再次的碰撞在一起,所以两帧之间的时间间隔要小于震动周期的一半

         当我们对两帧的间隔时间取极值,也就是周期的一半就可以利用这一点求出一个可用的弹簧的弹性系数k。

          由于

 

         这样根据上式,我们就可以推导出 k 的大小

         然而光有一个弹性系数是不够的,我们还需要一个阻尼系数 b 用于控制简谐运动的衰减。由于我们需要一个足够大的阻尼来避免碰撞来产生的震荡,所以我们需要利用高阻尼简谐运动的条件来推导阻尼系数。也就是

         下面是推到步骤

        

 

 

 

 由于 c 为无穷大,所以推导出 

         由于 k 是与帧数相关,是已知条件,所以 b 就可以利用 k 来求出。同样可以求出来的还有震荡的频率,由于满足。

         所以,震荡的频率为

         这意味着震荡消失了,周期趋近于无穷大。推导出谐振子运动的指数衰减公式。

         由于后面的cos项是一个常数了,所以可以简化为

         这时候我们就疑惑了,既然周期趋近于无穷大了,那么显然两帧之间的间隔时间必定小于周期的一半,那对两帧间隔时间取极值还有什么意义呢,并且我们应该如何求出两帧的间隔时间呢。这个不急,我们接下来会慢慢的说。首先指数衰减,通常以衰减到exp(-1) = 0.37为标准。

         也就是,我们可以将这里面的 τ 设定为我们进行运动插值的步长。也就说说在两帧的间隔时间内若干步插值计算的常数。

 

 

         可以看到,当确定插值的常数之后我们就可以确定出弹性因子与阻尼因子。在两帧之间我们肯定需要在考虑的就是,如何将运动的幅度降低到一个范围内,也就是下图的范围。

         我们既然取了时间τ为时间的步长,那我们就需要知道要插值几步才能满足上述条件。所以推到:

 

         这样的话我们就求出了两帧之间的间隔时间与插值的时间步长的关系。也就是解决了如何通过两帧的间隔时间求出插值的步长。

 

 

 

基于惩罚的双层梯度下降方法(Penalty-based bilevel gradient descent method)是一种用于解决双层优化问题的技术。双层优化问题通常包含一个上层问题和一个下层问题,下层问题的解会影响上层问题的目标函数。 ### 方法介绍 在双层优化问题中,上层问题通常是一个决策问题,而下层问题则是一个在给定上层决策下的优化问题。基于惩罚的双层梯度下降方法通过引入惩罚项来处理双层结构。其核心思想是将下层问题的约束条件以惩罚项的形式添加到上层问题的目标函数中,从而将双层优化问题转化为一个单层优化问题。 具体来说,假设上层问题的目标函数为 $F(x,y)$,其中 $x$ 是上层决策变量,$y$ 是下层问题的最优解,下层问题的目标函数为 $f(x,y)$ ,约束条件为 $g(x,y) \leq 0$。基于惩罚的双层梯度下降方法会构造一个新的目标函数: $F_{penalty}(x,y) = F(x,y) + \mu P(g(x,y))$ 其中 $\mu$ 是惩罚系数,$P(g(x,y))$ 是惩罚函数,通常是一个非负函数,当约束条件满足时 $P(g(x,y)) = 0$,否则 $P(g(x,y)) > 0$。 在每一次迭代中,算法会根据梯度信息更新上层决策变量 $x$ 和下层变量 $y$。对于 $x$ 的更新,使用 $F_{penalty}(x,y)$ 关于 $x$ 的梯度;对于 $y$ 的更新,使用下层问题的目标函数 $f(x,y)$ 关于 $y$ 的梯度。 ### 应用场景 - **机器学习中的超参数优化**:在机器学习中,模型的超参数选择是一个重要的问题。可以将超参数看作上层决策变量,模型参数看作下层变量。上层问题是最小化模型在验证集上的损失,下层问题是在给定超参数下最小化模型在训练集上的损失。基于惩罚的双层梯度下降方法可以用于自动选择最优的超参数 [^1]。 - **资源分配问题**:在资源分配问题中,上层问题可以是决定资源的分配策略,下层问题可以是在给定资源分配下各个子系统的优化问题。例如,在电力系统中,上层问题可以是决定发电计划,下层问题可以是在给定发电计划下各个电厂的经济调度问题。 - **多智能体系统中的协作优化**:在多智能体系统中,每个智能体可以看作一个下层优化问题,而整个系统的目标可以看作上层问题。基于惩罚的双层梯度下降方法可以用于协调各个智能体的行为,以实现整个系统的最优性能。 ### 代码示例 以下是一个简单的基于惩罚的双层梯度下降方法的 Python 代码示例: ```python import numpy as np # 上层目标函数 def F(x, y): return (x - 1)**2 + (y - 2)**2 # 下层目标函数 def f(x, y): return (y - x)**2 # 下层约束条件 def g(x, y): return y - 1 # 惩罚函数 def P(g_val): return max(0, g_val)**2 # 惩罚系数 mu = 1.0 # 学习率 lr_x = 0.1 lr_y = 0.1 # 初始化变量 x = 0.0 y = 0.0 # 迭代次数 num_iterations = 100 for i in range(num_iterations): # 计算下层问题的梯度 grad_y = 2 * (y - x) # 更新下层变量 y = y - lr_y * grad_y # 计算惩罚项的梯度 grad_g = 2 * max(0, g(x, y)) * (1 if g(x, y) > 0 else 0) grad_penalty_x = mu * grad_g * g(x, y) # 计算上层目标函数关于 x 的梯度 grad_F_x = 2 * (x - 1) + grad_penalty_x # 更新上层变量 x = x - lr_x * grad_F_x print("最优上层变量 x:", x) print("最优下层变量 y:", y) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值