將時間離散化為小步長 Δt,每步更新雙方位置:
Ty += v_rabbit * Δtv_wolf * Δt,分解 x/y 分量double dist() { return sqrt((Tx-Lx)^2 + (Ty-Ly)^2); }
void next_wolf()
{
double dx = fabs(Tx - Lx), dy = fabs(Ty - Ly);
double ldx, ldy;
if (dx > 1e-11) {
double k = dy / dx;
ldx = sqrt(Ld*Ld / (k*k + 1));
ldy = k * ldx;
} else {
double dk = dx / dy;
ldy = sqrt(Ld*Ld / (dk*dk + 1));
ldx = dk * ldy;
}
Lx -= ldx; // 狼在東邊,向西移動
Ly += ldy; // 向北移動
}
void next_rabbit() { Ty += Td; } // Td = 兔子單步距離
void simulate()
{
Tx=0; Ty=0; Lx=33; Ly=0;
Td = 0.1; Ld = 0.2; // 狼速度 2x
while (dist() >= Td) {
next_wolf(); // 狼先動(追擊者反應)
next_rabbit();
printf("兔子:(%.2f,%.2f) 狼:(%.2f,%.2f)\n", Tx,Ty,Lx,Ly);
}
}
程式輸出顯示:
(0.47, 18.00),距離約 2 公尺| 初始狼兔距離 | 洞穴距離 | 速度比 | 結果 |
|---|---|---|---|
| 33 m | 20 m | 2:1 | 兔子逃脫 |
| 100 碼 | 60 碼 | 2:1 | 兔子逃脫(追上點 ≈ 66.7 碼) |
| D | D/2 | 2:1 | 臨界條件:洞穴距離 ≥ 初始距離/2 可逃脫 |
此為經典追擊曲線問題。極坐標解析解顯示:速度比 k=2 時,狼軌跡為拋物線型曲線,追上點距離起點 4/3 * 初始距離。本例初始距離 33,追上點 44,遠大於 20。
Runge-Kutta 4 階 提高精度sqrt