哈工大 计算机仿真技术实验报告 实验3 利用数值积分算法的仿真实验
- 格式:pdf
- 大小:621.62 KB
- 文档页数:9
(4-3)
利用梯形法构建线性系统的仿真模型为:
h m x m 1 xm 1 xm 2 x 1 h h h xm 1 1 A 1 A xm B um um 1 2 2 2 y Cxm 1 Dum 1 m 1
(4-8)
五、实验步骤
5.1 连续系统模型:
微分方程
传递函数
G (s) U c (s ) 1 2 U ( s ) LCs RCs 1
5.2 离散系统模型:
六、实验结果
6.1 实验截图
h = 5.0e-5;
h = 5.0e-6:
h = 5.0e-7:
七、实验结果分析
在 h=5e-5,h=5e-6,h=5e-7 时得到的图像,可以看出,在 h=5e-5 时,前向欧拉 法和后向欧拉法图像明显谁真, 而梯形法和二阶显示 Adams 法图像有轻微失真, 步距仍然较大。 在步距为 h 5*106 时,前向欧拉法和后向欧拉法图像有部分失真,前向欧 拉法失真较严重。而梯形法和二阶显示 Adams 法图像与连续型函数曲线相似度 极高,仿真效果非常好。 当步距为 h 5*107 时,所有方法仿真效果都非常好,与连续型函数曲线相 似度都极高。可见,步距 h 5*107 时,所有仿真方法都可以应用。 从仿真模型实现的难易性、 模型的稳定性、模型的精度及离散时间间隔等方 面,对比分析上述方法构造的离散系统模型的优缺点。 难易性:通过单个模型的分别仿真,可以得出显式四阶 Runge-Kutta 法建模 最为复杂,仿真时间也较长,对步距要求较低。其次复杂的是二阶显式 Adams 法和梯形法,仿真时间稍短,梯形法取梯形面积,误差也较小。前向欧拉法和后 向欧拉法模型的复杂程度差不多,仿真时间也差不多。
利用二阶显式 Adams 法构建线性系统的仿真模型为:
(4-4)
h 23F m 16 Fm 1 5Fm 2 xm 1 xm 12 y m 1 Cxm 1 Dum 1 Fm Axm Bum Fm 1 Axm 1 Bum 1 Fm 2 Axm 2 Bum 2
系统电路如图 2.1 所示。电路元件参数:直流电压源 ,电阻 ,电感 ,电 容 。电路元件初始值:电感电流 ,电容电压 。系统输出量为电容电压 。 连续系统输出响应 的解析解为:
u c (t ) U s (1 e at (cos t sin t a / )) R 其中, a , 2L 1 R LC 2 L
k1 k2 xm 1 ym 1
f (tm , xm ) Ax m Bum h (k k2 ) 2 1 Cxm 1 Dum 1 xm
f (tm h, xm hk1 ) A x m k1h Bum 1
m h 1 Ah xm hBum xm 1 xm x ym 1 Cxm 1 Dum 1
(4-2)
式中, h 为积分步长, 1 为单位矩阵。利用后向欧拉法构建线性系统的仿真 模型为:
1 x m 1 h 1 A h xm hBum 1 m 1 xm x ym 1 Cxm 1 Dum 1
Runge-Kutta 法的.m 函数文件,并存入磁盘中。.m 函数文件要求输入参数为系统 状态方程的系数矩阵、仿真时间及仿真步长。编写.m 命令文件,在该命令文件 中调用已经编写完成的上述.m 函数文件,完成仿真实验; 4) 利用 subplot 和 plot 函数将输出结果画在同一个窗口中,每个子图加
(4-7)
利用显式四阶 Runge-Kutta 法构建线性系统的仿真模型为:
k1 k 2 k 3 k 4 xm 1 ym 1
f (tm , x m ) Ax m Bum h h , x m k1 ) A x m k1h / 2 Bum 1/2 2 2 h h f (tm , x m k2 ) A x m k2 h / 2 Bum 1/2 2 2 f (tm h, x m hk3 ) A x m k3 h Bum 1 f (tm h (k 2k2 2k3 k4 ) 6 1 Cxm 1 Dum 1 xm
八、实验结论
二阶显示 Adams 法精度最高,其次是梯形法。在 h = 5.0e-6 已然如此,当步 长在小的时候反而使运行时间延长,效果不一定好。这就说明方法的选取与精度 和复杂性,以及可行性等密切相关。
九、附录
m 文件源程序:
1、前向欧拉法 function []=RLC(R,L,C,Us,t,h) R=10; L=0.01; C=1.0e-6; Us=1; t=0.01; h = 5.0e-5; NNN = fix(t/h); AA = [-R/L -1/L;1/C 0]; BB = [1/L;0]; CC = [0 1]; Nr = 2; for i=1:1:Nr xx(1:Nr,1) = 0; end for k=1:NNN xx(1:Nr,k+1) = xx(1:Nr,k) + (AA* xx(1:Nr,k)+BB)*h; end 2、后向欧拉法(未声明变量同上 2.1) for i=1:1:Nr xxx(1:Nr,1) = 0; end EE = [1 0;0 1]; AA1 = inv(EE-AA*h); for k=1:NNN xxx(1:Nr,k+1) = AA1*(xxx(1:Nr,k) + BB*h); 3、梯形法(未声明变量同上2.1) for i=1:1:Nr xxxx(1:Nr,1) = 0; end EE = [1 0;0 1]; AA1 = inv(EE-AA*h/2); for k=1:NNN xxxx(1:Nr,k+1) = AA1*( AA*xxxx(1:Nr,k)*h/2);
2
(2-1)
。
三、实验要求
1) 利用欧拉法、梯形法、二阶显式 Adams 法及显式四阶 Runge-Kutta
法构建系统仿真模型,并求出离散系统的输出量响应曲线; 2) 对比分析利用欧拉法、梯形法、二阶显式 Adams 法及显式四阶
Runge-Kutta 法构建系统仿真模型的仿真精度与模型运行的稳定性问题; 3) 分 别 编 写 欧 拉 法 、 梯 形 法 、 二 阶 显 式 Adams 法 及 显 式 四 阶
实验 3 利用数值积分算法的仿真实验
(
一、 实验目的
1) 熟悉 MATLAB 的工作环境;
2) 掌握 MATLAB 的 .M 文件编写规则,并在命令窗口调试和运行程序; 3) 掌握利用欧拉法、梯形法、二阶显式 Adams 法及四阶龙格库塔法构建系 统仿真模型的方法,并对仿真结果进行分析。
二、实验内容
y (t ) y1 (t )
T
是 系 统 的
m
维 输 入 向 量 ,
y 2 (t ) y r (t ) 是系统的 r 维输出向量。A 为 n n 阶参数矩阵,
T
又称动态矩阵,B 为 n m 阶输入矩阵,C 为 r n 阶输出矩阵,D 为 r m 阶交联 矩阵。利用前向欧拉法构建线性系统的仿真模型为:
(t ) Ax(t ) Bu(t ) x y(t ) Cx(t ) Du(t )
x (t 0 ) x 0
T
(4-1)
式 ( 4-1 ) 中 , x x1 (t ) x2 (t ) xn (t ) 是 系 统 的 n 维 状 态 向 量 ,
u(t ) u1 (t ) u 2 (t ) u m (t )
(4-5)
式中:
(4-6)
二阶显式 Adams 法为多步计算方法, 利用多步计算方法对系统进行仿真时, 需要与之具有相同计算精度的单步计算方法辅助计算。二阶显式 Adams 法的计 算精度为二阶, 可以采用梯形法或改进的 Euler 法等辅助计算。 利用改进的 Euler 法构建线性系统的仿真模型为:
上对应的标题。
四、实验原理
在连续系统的数字仿真算法中,较常用的有欧拉法、 梯形法、 二阶显式 Adams 法及显式四阶 Runge-Kutta 法等。欧拉法、梯形法和二阶显式 Adams 法是利用离 散相似原理构造的仿真算法,而显式四阶 Runge-Kutta 法是利用 Taylor 级数匹配 原理构造的仿真算法。 对于线性系统,其状态方程表达式为:
+
=AA1xxxxxx(1:Nr,k) AA1*( xxxxxx(1:Nr,k)
+ +
BB*h+ BB*h +
k1=AA*xxxxxx(1:Nr,k+1); k2=AA*(xxxxxx(1:Nr,k+1)+h*k1/2); k3=AA*(xxxxxx(1:Nr,k+1)+h*k2/2); k4=AA*(xxxxxx(1:Nr,k+1)+h*k3);
xxxx(1:Nr,k)
+
BB*h
+
4、二阶显式Adams法(未声明变量同上2.1) AA1 = (EE-AA*h/2); for i=1:1:Nr xxxxx(1:Nr,1) = 0; end EE = [1 0;0 1]; for k=1:2 xxxxx(1:Nr,k+1) = AA1*(xxxxx(1:Nr,k) + BB*h AA*xxxxx(1:Nr,k)*h/2); end for k=3:NNN Fk = 23*(AA*xxxxx(1:Nr,k)+ BB); Fk1 = -16*(AA*xxxxx(1:Nr,k-1)+ BB); Fk2 = 5*(AA*xxxxx(1:Nr,k-2)+ BB); xxxxx(1:Nr,k+1) = xxxxx(1:Nr,k)+(Fk+Fk1+Fk2)*h/12; End 5、显式四阶Runge-Kutta法 >> for i=1:1:Nr xxxxxx(1:Nr,1) = 0; end EE = [1 0;0 1]; AA1 = inv(EE-AA*h/2); for k=1:NNN % xxxxxx(1:Nr,k+1) AA*xxxxxx(1:Nr,k)*h/2; xxxxxx(1:Nr,k+1) = AA*xxxxxx(1:Nr,k)*h/2); % XX0 = xxxx(1:Nr,k); end for k=1:1:NNN