预备知识
(1)单-Lanchester方程的解
单-Lanchester方程的表达式为:
{
x
1
˙
=
−
b
y
1
y
1
˙
=
−
a
x
1
\left\{\begin{matrix} \dot{x_1}= -by_1\\ \dot{y_1}= -ax_1 \end{matrix}\right.
{x1˙=−by1y1˙=−ax1
其中x、y分别为甲、乙双方的作战单位数,a、b分别为甲、乙双方对对方的毁伤系数,满足以下条件:
a > 0 a>0 a>0
b > 0 b>0 b>0
x ( 0 ) = x 0 > 0 x(0)={x_0}>0 x(0)=x0>0
y ( 0 ) = y 0 > 0 y(0)={y_0}>0 y(0)=y0>0
那么,解为:
{
x
=
c
e
−
λ
t
+
d
e
λ
t
a
y
=
c
e
−
λ
t
−
d
e
λ
t
b
\left\{\begin{matrix} x = \frac{ce^{-\lambda t}+de^{\lambda t}}{\sqrt[]{a} } \\ y = \frac{ce^{-\lambda t}-de^{\lambda t}}{\sqrt[]{b} } \end{matrix}\right.
{x=ace−λt+deλty=bce−λt−deλt
其中,
{
c
=
1
2
(
a
x
0
+
b
y
0
)
d
=
1
2
(
a
x
0
−
b
y
0
)
λ
=
a
b
\left\{\begin{matrix} \begin{aligned} c &= \frac{1}{2}(\sqrt{a}x_0+\sqrt{b}y_0 ) \\ d &= \frac{1}{2}(\sqrt{a}x_0-\sqrt{b}y_0 ) \\ \lambda &= \sqrt{ab} \end{aligned} \end{matrix}\right.
⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧cdλ=21(ax0+by0)=21(ax0−by0)=ab
(2)全文的公式使用下面的网址编辑而成:
正文
本文摘自沙昌基教授《数理战术学》第3章 单兵种直瞄武器交战的lanchester方程的第3节 留预备队。文中举了一个简单的数值例子,证明了战场上留预备队是一种好的策略。
假设如下:
甲、乙双方发生了一场战斗,乙方拟向甲方进攻,可能的战场有三处:
(1)主要进攻方向(对甲来说是主要防御方向,后文简称为“方向1”);
(2)次要进攻方向(对甲来说是次要防御方向,后文简称为“方向2”);
(3)甲方大本营(后文简称为“大本营”)。
首先给出甲、乙两方的初始兵力。
甲方兵力为 x 0 = 10000 {x_0} = 10000 x0=10000,乙方兵力为 y 0 = 12000 {y_0} = 12000 y0=12000。
其次给出三个战场交战的Lanchester方程,按照顺序分别为:
那么此时,甲、乙双方有三种策略。
(1)策略1
甲方不留预备队,将兵力平均安排至方向1和方向2
即取
方向1: x 10 = 5000 {x_{10}} = 5000 x10=5000;
方向2: x 20 = 5000 {x_{20}} = 5000 x20=5000;
大本营: x 30 = 0 {x_{30}} = 0 x30=0
假定乙方集中全力从方向1进攻,则战场1的Lanchester方程解为:
{
x
1
=
5000
e
−
t
−
500
e
−
t
y
1
=
10000
e
−
t
+
1000
e
t
\left\{\begin{matrix} \begin{aligned} x_1&= 5000e^{-t}-500e^{-t}\\ y_1&= 10000e^{-t}+1000e^{t} \end{aligned} \end{matrix}\right.
{x1y1=5000e−t−500e−t=10000e−t+1000et
则当 T = 1 2 ln 11 T = \frac{1}{2}\ln 11 T=21ln11时, x 1 ( T ) = 0 {x_1}(T)=0 x1(T)=0, y 1 ( T ) = 2000 11 {y_1}(T)=2000\sqrt {11} y1(T)=200011。
结果表明:经战斗时间T后,乙方突破方向1,可长驱直捣大本营。
Matlab仿真结果如下图所示。
(2)策略2
甲方全部留在大本营
即取
方向1: x 10 = 0 {x_{10}} = 0 x10=0;
方向2: x 20 = 0 {x_{20}} = 0 x20=0;
大本营: x 30 = 10000 {x_{30}} = 10000 x30=10000
此时,乙方可轻易通过方向1、方向2前进至大本营处与甲方展开决战。
那么,战场3的Lanchester方程为
{
x
3
=
11000
e
−
t
−
1000
e
−
t
y
1
=
11000
e
−
t
+
1000
e
t
\left\{\begin{matrix} \begin{aligned} x_3&= 11000e^{-t}-1000e^{-t}\\ y_1&= 11000e^{-t}+1000e^{t} \end{aligned} \end{matrix}\right.
{x3y1=11000e−t−1000e−t=11000e−t+1000et
则当 T = 1 2 ln 11 T = \frac{1}{2}\ln 11 T=21ln11时, x 1 ( T ) = 0 {x_1}(T)=0 x1(T)=0, y 1 ( T ) = 2000 11 {y_1}(T)=2000\sqrt {11} y1(T)=200011。
结果表明:经战斗时间T后,乙方摧毁甲方全部兵力获胜。在这种策略下,甲方也不能有效抵抗乙方的进攻。
Matlab仿真结果如下图所示。
(3)策略3
甲方对兵力适当配置
即取
方向1: x 10 = 3000 {x_{10}} = 3000 x10=3000;
方向2: x 20 = 3000 {x_{20}} = 3000 x20=3000;
大本营: x 30 = 4000 {x_{30}} = 4000 x30=4000
假定乙方集中全力从方向1进攻,则战场1的Lanchester方程解为:
{
x
1
=
4500
e
−
t
−
1500
e
−
t
y
1
=
9000
e
−
t
+
3000
e
t
\left\{\begin{matrix} \begin{aligned} x_1&= 4500e^{-t}-1500e^{-t}\\ y_1&= 9000e^{-t}+3000e^{t} \end{aligned} \end{matrix}\right.
{x1y1=4500e−t−1500e−t=9000e−t+3000et
作战开始后,甲方知道方向1上吃紧,就将预备队 x 30 x_{30} x30 全部派往方向1,经时间 T = ln 1.25 T=\ln1.25 T=ln1.25 后到达方向1。在预备队到达前的瞬间,甲、乙双方的兵力存活情况如下:
x
1
(
T
1
−
0
)
=
4500
×
0.8
−
1500
×
1.25
=
3600
−
1875
=
1725
x_1(T_1-0)=4500 \times 0.8 - 1500 \times 1.25 = 3600 - 1875 = 1725
x1(T1−0)=4500×0.8−1500×1.25=3600−1875=1725
y
1
(
T
1
−
0
)
=
9000
×
0.8
−
3000
×
1.25
=
7200
+
3750
=
10950
y_1(T_1-0)=9000 \times 0.8 - 3000 \times 1.25 = 7200 +3750 = 10950
y1(T1−0)=9000×0.8−3000×1.25=7200+3750=10950
当预备队到达战场后,甲方兵力布置变为
x 1 ( T 1 + 0 ) = x 1 ( T 1 − 0 ) + x 30 = 1725 + 4000 = 5725 x_1(T_1+0) = x_1(T_1-0) + x_{30}=1725+4000=5725 x1(T1+0)=x1(T1−0)+x30=1725+4000=5725
乙方实力不变。
从
T
1
T_1
T1 时刻起算,方向1处的Lanchester方程解为:
{
x
1
(
T
1
+
t
1
)
=
5600
e
−
t
+
125
e
−
t
y
1
(
T
1
+
t
1
)
=
11200
e
−
t
−
250
e
t
\left\{\begin{matrix} \begin{aligned} x_1(T_1+t_1)&= 5600e^{-t}+125e^{-t}\\ y_1(T_1+t_1)&= 11200e^{-t}-250e^{t} \end{aligned} \end{matrix}\right.
{x1(T1+t1)y1(T1+t1)=5600e−t+125e−t=11200e−t−250et
此时,乙方不能突破主攻方向,甲方有效地抵抗了乙方的进攻。这种情况下,乙方在方向1与方向2分兵进攻效果显然更差。
Matlab仿真结果如下图所示。
对这三种作战部署方案的分析说明,无论是倾巢分兵把守,还是全部留守都不能抵御敌方进攻,只有适当留预备队才是克敌制胜之道。这一结果与军事常识中留预备队的战术是一致的。
Matlab仿真代码
Matlab仿真代码分为三个文件:
(1)SingleLanchesterMain.m;
(2)diffSolution.m;
(3)evaluate.m。
在这里分别给出。
SingleLanchesterMain.m
clear;clc;close all;
% 仿真时长
scheme = 3; % 选择1、2、3来选择战场策略
switch scheme
case 1
% 毁伤系数
a = 2;
b = 0.5;
% 作战单位初值
x0 = 5000;
y0 = 12000;
% 微分方程解
[A,B,C,D,lambda] = diffSolution(a,b,x0,y0);
% 解算过程
[t,x] = evaluate(lambda,A,B);
% 交战结果
y = C*exp(-lambda*t) - D*exp(lambda*t);
fprintf('交战时间为 【%1.4f】 秒\n',t);
fprintf('敌方战斗力剩余 【%4.2f】\n',y);
case 2
% 毁伤系数
a = 1;
b = 1;
% 作战单位初值
x0 = 10000;
y0 = 12000;
% 微分方程解
[A,B,C,D,lambda] = diffSolution(a,b,x0,y0);
% 解算过程
[t,x] = evaluate(lambda,A,B);
% 交战结果
y = C*exp(-lambda*t) - D*exp(lambda*t);
fprintf('交战时间为 【%1.4f】 秒\n',t);
fprintf('敌方战斗力剩余 【%4.2f】\n',y);
case 3
% 毁伤系数
a = 2;
b = 0.5;
% 作战单位初值
x0 = 3000;
y0 = 12000;
% 微分方程解
[A,B,C,D,lambda] = diffSolution(a,b,x0,y0);
% 解算过程
t = log(1.25);
x = A*exp(-lambda*t) + B*exp(lambda*t);
y = C*exp(-lambda*t) - D*exp(lambda*t);
fprintf('我方战斗力剩余 【%4.2f】\n',x);
fprintf('敌方战斗力剩余 【%4.2f】\n',y);
disp('-----------------------');
% 再次求解微分方程解
fprintf('我方增援 【%4.2f】\n',4000);
disp('-----------------------');
x = x + 4000;
fprintf('我方现存战斗力 【%4.2f】\n',x);
disp('-----------------------');
% 解算过程
[A,B,C,D,lambda] = diffSolution(a,b,x,y);
t = 0;
y1 = C*exp(-lambda*t) - D*exp(lambda*t);
while y1 > 0
y1 = C*exp(-lambda*t) - D*exp(lambda*t);
t = t + 1e-4;
end
% 交战结果
x1 = A*exp(-lambda*t) + B*exp(lambda*t);
t = t+log(1.25);
fprintf('交战时间为 【%1.4f】 秒\n',t);
fprintf('我方战斗力剩余 【%4.2f】\n',x1);
fprintf('敌方战斗力剩余 【%4.2f】\n',y1);
otherwise
disp('-----------------');
disp('请选择正确的方案!');
end
diffSolution.m
function [A,B,C,D,lambda] = diffSolution(a,b,x0,y0)
% 微分方程解
c = 0.5*(sqrt(a)*x0 + sqrt(b)*y0);
d = 0.5*(sqrt(a)*x0 - sqrt(b)*y0);
lambda = sqrt(a*b);
A = c/sqrt(a);
B = d/sqrt(a);
C = c/sqrt(b);
D = d/sqrt(b);
end
evaluate.m
function [t,x] = evaluate(lambda,A,B)
t = 0;
x = A*exp(-lambda*t) + B*exp(lambda*t);
while x > 0
x = A*exp(-lambda*t) + B*exp(lambda*t);
t = t + 1e-4;
end
end
就酱~
希望自己以后不要忘记这些代码!