基于MATLAB的差分方程战斗模型

MATLAB实现战争模型的数值解法

摘要

战争模型是一种非常典型的连续系统仿真模型,战争系统中变量的关系具有很高的学习研究的价值。本文将通过MATLAB软件来实现简单的战斗模型模拟,通过差分方程的形式实现数值解的求解。除此之外,本文还将探讨在有增援条件下的战争模型的变化,并将进一步分析增援总人数和单位时间增援人数的关系

模型简介

假定 X 部队t时刻存活的士兵数为x(t),而 Y 部队在t时刻存活的士兵数为 y(t),将
x(t)与 y(t)都看作连续变量。并假定双方所有士兵不是战死就是活着参加战斗,即不考虑
俘虏和伤员。
关于双方的作战伤亡情况,一种合理的假设是,在Δt 时间内,X 部队被杀死的士兵数
Δx 将取决于Δt 的长短,以及在Δt起始时刻与其交战的 Y部队的士兵数。假定是一种正比
关系,即 在这里插入图片描述
其中a 是一个常数,代表了Y 部队的战斗力,称为“杀伤率”,更明确地说,a 是Y 部队的
一个士兵在单位时间内杀死X 部队的名士兵数。类似地,对于Y 部队有在这里插入图片描述在这里插入图片描述
根据微分方程的形式,我们可以得到如下的差分方程
在这里插入图片描述

代码实现

现在根据之前得到的差分方程来进行离散化的数值求解:

变量含义变量值
t离散的时刻为一个矩阵,初值为0
dt时间步长0.001
aY军队的战斗力0.15
bX军队的战斗力0.1
xX军队的剩余人数矩阵,初始值为10000
yY军队的剩余人数矩阵,初始值为5000
totallr已经增援的数量初始值为0
p每隔固定的时间增援的人数变量
q增援的最大人数变量
time_interval增援时间间隔设为100倍dt,0.1

当Y方没有增援时,p=0

clear all
t=0;
a=0.15;b=0.1;
dt = 0.001 ;
x(1)=10000;y(1)=5000;t(1)=0;
r=2.5;%假定y获得增援的时刻
totalr=0;
p=0;q=6000;
time_interval=0.1
for i=1: 1e5
x(i+1)=x(i)-a*y(i)*dt; %用导数定义理解近似解法:函数增量/自变量增量apprx 导数
y(i+1)=y(i)-b*x(i)*dt;
t(i+1)=t(i)+dt;
   if t(i+1)>r&&rem(t(i+1),time_interval)<0.000001&&totalr<q
    y(i+1)=y(i+1)+p;
    totalr=totalr+p;   
   end
if x(i+1)<1 ||y(i+1)<1,%战斗结束条件:假设直到一方剩余士兵数量<1
T=t(i+1);
break
end
end
T%战争结束的时刻
lastx=x(i+1)%结束战争时X的剩余人数
lasty=y(i+1)%结束战争时Y的剩余人数
t_=1:length(x);
plot(t_,x,'r',t_,y,'g')

在这里插入图片描述
Y会输。当p=700,q=6000时:在这里插入图片描述
Y赢了。
现在来通过全局搜索法探究,当Y要赢的时候p 和q要满足的大致关系

clear all
t=0;
a=0.15;b=0.1;
dt = 0.001 ;
x(1)=10000;y(1)=5000;t(1)=0;
r=2;%假定y获得增援的时刻
totalr=0;
avalable=[];
num=0;
time_interval=0.1;
for p=0:1:800;
for q=0:25:15000
x(1)=10000;y(1)=5000;t(1)=0;
totalr=0;
check=0;
for i=1: 1e5
x(i+1)=x(i)-a*y(i)*dt; %用导数定义理解近似解法:函数增量/自变量增量apprx 导数
y(i+1)=y(i)-b*x(i)*dt;
t(i+1)=t(i)+dt;
   if t(i+1)>r&&rem(t(i+1),time_interval)<0.000001&&totalr<q%注意这个地方rem不能让他判断是否等于0,因为小数除法存在计算机误差,可以整除时余数不是绝对的0,而是0.0..(若干个0)..0xxx.
    y(i+1)=y(i+1)+p;
    totalr=totalr+p;   
   end
if x(i+1)<1%X输了的时候直接结束这次循环
    check=1; 
    break
end

if x(i+1)<1 ||y(i+1)<1,%战斗结束条件:假设直到一方剩余士兵数量<1
T=t(i+1);
break
end

end
if check==1
    avalable=[avalable;p,q];
    num=num+1
    break
end  
end
end
T
lastx=x(i+1)
lasty=y(i+1)
t_=1:length(x);
%plot(t_,x,'r',t_,y,'g')
plot(avalable(:,1),avalable(:,2))
xlabel('每次增援')
ylabel('增援总人数')

在这里插入图片描述
结果如上图所示。这里出现锯齿状的线条推测是因为差分方程的精度不够,导致可能的周期性波动。经查阅资料得知,理论上的曲线应为一大致趋势相同但平滑的曲线,所以这次实验有待改进。

  • 12
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值