Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Math 游戏物理的龙格-库塔(RK4)积分_Math_Integration_Physics - Fatal编程技术网

Math 游戏物理的龙格-库塔(RK4)积分

Math 游戏物理的龙格-库塔(RK4)积分,math,integration,physics,Math,Integration,Physics,游戏大师有一个关于如何使用更好的游戏物理。实现是简单的,但它背后的数学让我困惑。我在概念层面上理解导数和积分,但很长一段时间没有操纵方程 下面是Gaffer实施的主要影响: void integrate(State &state, float t, float dt) { Derivative a = evaluate(state, t, 0.0f, Derivative()); Derivative b = evaluate(state, t+dt*0.5f, dt

游戏大师有一个关于如何使用更好的游戏物理。实现是简单的,但它背后的数学让我困惑。我在概念层面上理解导数和积分,但很长一段时间没有操纵方程

下面是Gaffer实施的主要影响:

void integrate(State &state, float t, float dt)
{
     Derivative a = evaluate(state, t, 0.0f, Derivative());
     Derivative b = evaluate(state, t+dt*0.5f, dt*0.5f, a);
     Derivative c = evaluate(state, t+dt*0.5f, dt*0.5f, b);
     Derivative d = evaluate(state, t+dt, dt, c);

     const float dxdt = 1.0f/6.0f * (a.dx + 2.0f*(b.dx + c.dx) + d.dx);
     const float dvdt = 1.0f/6.0f * (a.dv + 2.0f*(b.dv + c.dv) + d.dv)

     state.x = state.x + dxdt * dt;
     state.v = state.v + dvdt * dt;
}
有人能简单地解释一下RK4是如何工作的吗?具体来说,为什么我们要在
0.0f
0.5f
0.5f
、和
1.0f?
四阶导数的平均值与用较小的时间步长进行简单的欧拉积分有何不同


在阅读了下面的公认答案和其他几篇文章后,我对RK4的工作原理有了一个了解。回答我自己的问题:

有人能简单地解释一下RK4是如何工作的吗?

RK4利用了以下事实: 我们可以得到更好的近似值 如果我们使用函数的 高阶导数而非 只是一阶或二阶导数。 这就是为什么 收敛速度比欧拉快得多 近似值。(请看 右边的动画 第页)

具体来说,为什么我们要将导数平均为
0.0f
0.5f
0.5f
1.0f

龙格-库塔法是一种有效的方法 函数的近似 几个点的导数样本 在一个时间段内,不像泰勒 仅对衍生产品取样的系列 一个点。采样后 我们需要知道这些衍生品是如何产生的 对每个样品进行称重,以获得 可能的最接近值。一 做到这一点的简单方法是选择 与 泰勒级数,这就是 龙格-库塔方程的常数 他们下定决心了

更清楚地说明了 我请注意
(15)
是如何定义泰勒的 系列扩展,而
(17)
是 龙格-库塔推导

四阶导数的平均值与时间步长较小的简单euler积分有何不同?

从数学上讲,它收敛很多 比做很多事情都快 近似值。当然,足够了 欧拉近似我们可以得到相等的结果 精度达到RK4,但计算 所需的电力不足以证明使用 欧拉


至于你的问题:我记得有一次我写了一个布料模拟器,布料是一系列在节点上相互连接的弹簧。在模拟器中,弹簧施加的力与弹簧的拉伸程度成正比。该力在节点处产生加速度,从而产生移动节点的速度,从而拉伸弹簧。有两个积分(积分加速度以获得速度,积分速度以获得位置),如果它们不准确,误差就会滚雪球:太多的加速度导致太多的速度,从而导致太多的拉伸,从而导致更大的加速度,使整个系统不稳定

没有图形很难解释,但我会尝试:假设你有f(t),其中f(0)=10,f(1)=20,f(2)=30

f(t)在区间0 矩形规则积分用一个矩形近似该曲面,其中宽度是时间上的增量,长度是新的f(t)值,因此在区间0 为了获得更精确的曲面(积分)估计,可以取较小的t间隔,例如f(0)、f(0.5)、f(1)、f(1.5)和f(2)

如果你仍在关注我,那么RK4方法只是估算t0
(但正如其他人所说,阅读维基百科文章以获得更详细的解释。RK4属于)

就实际数学而言,这可能有点过于简单,但意味着作为
Runge Kutta
集成的直观指南

给定某个时间的某个量
t1
,我们想知道另一个时间的量
t2
。通过一阶微分方程,我们可以知道在
t1
处该量的变化率。我们没有什么可以确定的了;其余的都是猜测

欧拉积分是猜测的最简单方法:使用
t1
处精确已知的变化率,从
t1
线性外推到t2。这通常会给出一个糟糕的答案。如果t2远离t1,这种线性外推将无法匹配理想答案中的任何曲率。如果我们从t1到
t2
采取许多小步骤,我们将遇到类似值的减法问题。舍入错误会破坏结果

所以我们改进了我们的猜测。一种方法是继续做这个线性外推,然后希望它不离事实太远,使用微分方程来计算
t2
处的变化率估计值。这与
t1
的(准确)变化率平均,更好地代表了
t1
t2
之间真实答案的典型斜率。我们用它来做一个新的线性外推,从到
t1
t2
。我们是否应该采取简单的平均值,或者在不做数学估计错误的情况下,在
t1
时对比率给予更多的权重,这并不明显,但这里有一个选择。无论如何,这是一个比欧拉给出的更好的答案

也许更好的方法是,将我们的初始线性外推到