Penalty-Based Multibody Animation(5)

这篇博客探讨了刚体碰撞后的运动学参数计算,包括速度、角速度、加速度和角加速度的确定。通过分析碰撞点、深度、穿透力等参数,构建数学模型,并利用牛顿-欧拉方程进行求解。文章还涉及了SVD方法处理不可逆矩阵问题,以及如何限制穿透力的方向。最终,通过一系列方程推导出计算刚体运动状态的公式。

        前面我们了解了基于穿透的碰撞计算可以看作是一个简谐运动的一种特殊情况,并且分析了各个参数的确定,但是仍然还有一个问题摆在我们面前。就是,我们终归是要知道两个碰撞之后的刚体的运动学参数的啊。这里的运动学参数指定的是物体的速度、角速度、加速度、角加速度。

        也就是如下的参数

         首先我们确定我们求解的目标,就是已知目前物体关于穿透的一切参数,比如说碰撞的接触点、碰撞的深度、碰撞产生的穿透力、刚体的位置等。

        然后我们定义一些参数。我们假设空间中存在K对碰撞点、n个物体。在 k 对穿透点处 ik 与 jk 表示两个发生碰撞的物体,并且定义ik < jk。同样,每队穿透点都有一个法线nk和穿透点pki表示第k对穿透点在i上那一点相对于物体i坐标系的位置。

        同样可以得到公式:

         这时候我们定义某对物体上的所有穿透点的一个向量。

         注意:rjk其中jk表示第包含第k对碰撞点的物体的索引值,所谓的rjk实际上是某个j物体质心坐标系的原点。

        定义深度向量为:

         显然,为了让两物体迅速的分开,两物体的相对方向,必然要与物体间的深度向量同向,那么我们也可以认为,两物体分离的相对速度就是 d 的导数。

        对 d 的求导可以认为是对几个刚体上某个点的速度的加减法(因为无论pi与pj都是刚体上某一点的世界坐标位置)。这里为了方便表达,构造了一个看起来十分复杂的用来描述物体间接触的矩阵。

        然后定义一个关于物体速度与角速度的向量 

        最后就可以将d的导数写成下面的形式。 

         继续求导

         根据刚体运动中局部坐标系中点的导数,是可以求得C的导数的(pki  ri都是变化的,所以rki导数不为0)

         再根据牛顿-欧拉方程可以求得

         注意这里C与穿透力的乘积主要是为了添加上穿透力带来的力矩,而对力不产生影响。

        接着就可以推导出

         然后再根据critiacl damped的的条件联立方程,得到

         将式子展开并且在排列简化就可以得到

         注意,上面的式子A有时候并不可逆,就导致方程的借不唯一。这时候我们引入singular value decomposition(SVD)的方法来计算。

        定义向量

         定义矩阵

        定义四元数

         用四元数构造矩阵

         注意:上式子由下图导出。

         继续推导

        这时候如果我们要限制穿透力只能沿着发现方向,就可以定义:

         利用关键阻尼的条件

         这里面与上面不一样的是N的导数,但是N表示的仅仅是一个方向,所以他的导数就可以用角速度叉乘以自身方向来求得。

         最后求解出 f 就可以得到

基于惩罚的双层梯度下降方法(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) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值