计算机仿真的过程,计算机仿真的过程与方法.doc

《通信系统仿真》 实验报告

姓名杨利刚班级A0811实验室203组号28学号28实验日期实验名称实验一 计算机仿真的过程与方法实验成绩教师签字一、实验目的

1、掌握计算机仿真的一般过程

2、掌握Matlab编程仿真的基本方法

3、掌握动态系统模型的状态方程求解方法

4、掌握基于概率模型的蒙特卡罗方法

二、实验原理

1、计算机仿真的一般过程

通信系统的计算机仿真就是根据物理系统的运行原理建立相应的数学描述,并进行计算机数值求解的过程。

系统的数学描述称为系统数学模型或仿真模型。为了对系统数学模型进行计算机数值分析,还需要将数学模型以某种计算机语言表达出来,然后进行调试、运行,最后得出数值结果。用计算机语言重新表达的数学模型称为系统的计算机仿真模型。

根据物理模型的不同特点、原理以及不同的系统仿真目标所得出的数学模型和相应求解算法也不尽相同。通信系统的计算机仿真过程往往是多种形式数学模型和各种算法综合的数值计算过程。

对仿真模型和仿真结果的检验是仿真数据有效性的保证。通常的验证方法是证伪,而不是证实。通过模型的相互比较就能够查找出错误根源,进而改进和修正模型。

2、基于动态系统模型的状态方程求解方法

动态系统,就是有记忆系统的数学描述是状态方程。对动态系统建模,就是根据研究对象的物理模型找出相应的状态方程的过程。所谓对动态系统的仿真,就是利用计算机来对所得出的状态方程进行数值求解的过程。

3、基于概率模型的蒙特卡罗方法

对于不确定系统,使用基于概率模型的蒙特卡罗方法。蒙特卡罗方法是一种基于随机试验和统计计算的数值方法,也称计算机随机模拟方法或统计模拟方法。

蒙特卡罗方法的数学基础是概率论中的大数定理和中心极限定理。 大数定理指出,随着独立随机试验次数增加,试验统计事件出现的概率将接近于该统计事件的概率。

蒙特卡罗方法的基本思想:当所求解问题是某种随机事件出现的概率,或某个随机变量的期望值时,通过某种实验的方法,以这种事件出现的概率来估计该随机事件的概率,或者得出这个随机变量的某些数字特征,并将其作为问题的解。如所求解的问题不是一个随机事件问题,那么可以通过数学分析方法找出与之等价的随机事件模型,然后再利用蒙特卡罗方法去求解。

在建模和仿真中,应用蒙特卡罗方法主要有两部分工作:

1)用蒙特卡罗方法模拟某一过程时,产生所需要的各种概率分布的随机变量。

2)用统计方法把模型的数字特征估计出来,从而得到问题的数值解,即仿真结果。

三、实验内容

1、在例题1.1中,如果考虑落体受到空气阻力,且阻力与下落速度成正比,试修改数学模型和相应的仿真程序。在考虑阻力的情况下,在相同高度同时下落的质量不同的物体仍然同时落地吗?请通过仿真验证并解释之。

实验代码:

% ch1example1prg1.m

g=9.8; % 重力加速度

k0=-1; %阻力系数

m=1; %物体质量

v=0; % 设定初始速度条件

s=0; % 设定初始位移条件

t=0; % 设定起始时间

dt=0.01; % 设置计算步长

N=200; % 设置仿真递推次数. 仿真时间等于N与dt的乘积

for k=1:N

a=g+k0*v/m; %加速的计算

v=v+a*dt; % 计算新时刻的速度

s(k+1)=s(k)+v*dt; % 新位移

t(k+1)=t(k)+dt; % 时间更新

end

% 理论计算, 以便与仿真结果对照

t_theory=0:0.01:N*dt; % 设置解析计算的时间点

v_theory=g*t_theory; % 解析计算的瞬时速度

s_theory=1/2*g*t_theory.^2; % 解析计算的瞬时位移

% 作图: 仿真结果与解析结果对比

t=0:dt:N*dt;

plot(t,s,'o', t_theory,s_theory, '+');

xlabel('时间 t'); ylabel('位移 s');

legend('仿真结果','理论结果');

运行结果:

实验结论:

通过实验数据的验证,从相同高度下落的物体,在考虑阻力的情况下,质量大的物体先落地。

2、在例题1.1中,除了考虑落体受到空气阻力,如果再考虑空气对物体的浮力,那么如何进一步修改例题1.1中的数学模型和相应的仿真程序呢?请通过仿真验证你的模型并解释之。

实验代码:

% ch1example1prg1.m

clear all,close all,clc

g=9.8; % 重力加速度

k0=-1; %阻力系数

m=1; %物

在Java,为了实现7种不同类型的方块并添加自动下落功能,我们可以创建一个抽象基类`Block`作为所有方块的共同父类,然后为每种特定类型的方块创建具体的子类,并在主循环处理它们的下落。这里是一个简单的示例: ```java // 定义抽象基类 Block abstract class Block { protected int x; protected int y; // 公共方法,比如绘制方块、更新位置等 public void draw(Graphics g) {} abstract void moveDown(); public Block(int startX, int startY) { this.x = startX; this.y = startY; } // 每个子类需要覆盖这个方法来表示不同的方块类型 public abstract String getType(); } // 七种不同类型的方块,例如 DiamondBlock, SquareBlock 等 class DiamondBlock extends Block { // 实现 moveDown() 和 getType() @Override void moveDown() { y++; } @Override public String getType() { return "Diamond"; } } // ... 你可以为其他6种方块编写类似的子类 public class Main { private List<Block> blocks = new ArrayList<>(); public static void main(String[] args) { Main game = new Main(); // 创建7种方块并添加到游戏列表 for (int i = 0; i < 7; i++) { blocks.add(new DiamondBlock(0, i * 50)); // 假设每个方块高度为50像素 } while (true) { // 游戏循环 // 更新并绘制方块 for (Block block : blocks) { block.moveDown(); // 下落 block.draw(game.getGraphics()); // 在画布上绘制 } // 清除屏幕 // ... // 判断是否有方块落地,如果落地则移除并生成新方块 if (blocks.stream().anyMatch(block -> block.getY() >= game.getHeight())) { blocks.removeIf(block -> block.getY() == game.getHeight()); blocks.add(new DiamondBlock(0, game.getHeight())); // 新方块从顶部落下 } // 延迟一段时间以控制游戏速度 try { Thread.sleep(50); // 这里只是一个例子,实际游戏可能会使用更复杂的帧率控制 } catch (InterruptedException e) { e.printStackTrace(); } } } } ``` 在这个示例,我们创建了一个包含不同类型方块的游戏列表,并在每一轮循环让它们下落。当某个方块到达底部时,我们会将其移除并添加一个新的方块到顶部。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值