首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

狼追兔子追擊問題:C 語言數值模擬解法

     編輯:關於C語言

問題描述

  • 兔子起點 O(0,0),洞穴 B(0,20)(正北 20 公尺)
  • 狼起點 A(33,0)(兔子正東 33 公尺)
  • 狼速度是兔子的 2 倍,時刻朝向兔子當前位置移動
  • 問:兔子到達洞穴前會被捕獲嗎?

數值模擬法(歐拉法)

將時間離散化為小步長 Δt,每步更新雙方位置:

  • 兔子:直線向北,Ty += v_rabbit * Δt
  • 狼:朝向兔子方向移動 v_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);
    }
}

模擬結果

程式輸出顯示:

  • 兔子到達 y=20 時,狼位於 (0.47, 18.00),距離約 2 公尺
  • 狼在 y ≈ 22 公尺 才追上兔子
  • 結論:兔子成功進洞,未被捕獲

推廣結論

初始狼兔距離洞穴距離速度比結果
33 m20 m2:1兔子逃脫
100 碼60 碼2:1兔子逃脫(追上點 ≈ 66.7 碼)
DD/22:1臨界條件:洞穴距離 ≥ 初始距離/2 可逃脫

數學驗證(解析解)

此為經典追擊曲線問題。極坐標解析解顯示:速度比 k=2 時,狼軌跡為拋物線型曲線,追上點距離起點 4/3 * 初始距離。本例初始距離 33,追上點 44,遠大於 20。

程式碼優化建議

  • 使用 Runge-Kutta 4 階 提高精度
  • 自適應步長控制
  • 向量化運算避免重複 sqrt
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved