9.7 数值计算方面的考虑
9.7.1 微分方程解算器Solver
9.7.1.4 不同解算器处理Stiff系统时表现
【 * 例 9.7.1 .4-1 】求微分方程 在 时的解。本例演示:对于 Stiff 方程,如果解算方法选择不当将产生严重后果。
(1)用符号计算求此方程解析解 和它的导函数 
xsym=dsolve('D2x+100*Dx+0.9999*x=0','x(0)=1,Dx(0)=0','t')
dxsym=diff(xsym,'t')
xsym =
9999/9998*exp(-1/100*t)-1/9998*exp(-9999/100*t)
dxsym =
-9999/999800*exp(-1/100*t)+9999/999800*exp(-9999/100*t)
(2)构作 SIMULINK 模型 exm9714_1.mdl (如图 9.7.1 . 4-1-1 所示)

图 9.7.1 . 4-1-1 Stiff 系统仿真模型
(3)运行以下指令画出三种计算结果的局部放大图
t=(0:5000)/10;x=eval(char(dxsym)); % 产生绘解析解图形的数据
Tspan=500;
opts=simset('Solver','ode45');
[tt1,xx1,s]=sim('exm9714_1',Tspan,opts);%ODE45 解 Exm9714_1 模型
opts=simset('Solver','ode15s');
[tt2,xx2,s]=sim('exm9714_1',Tspan,opts);%ODE15S 解 Exm9714_1 模型
plot(t,x,'k',tt1,xx1(:,2),'b:',tt2,xx2(:,2),'r-.') % 绘比较图
axis([246 247 -8.55e-4 -8.35e-4]) % 局部放大
legend('Symbolic','ODE45','ODE15S',0)
ns1=length(xx1) %ODE45 解点数
ns2=length(xx2) %ODE15S 解点数
ns1 =
15072
ns2 =
101

图 9.7.1 . 4-1-2 不同方法解 Stiff 方程的结果比较
9.7.2 积分步长和容差
9.7.2.1 积分步长的选择
【例 9.7.2 .1-1 】以例 9.5.2-1 的多采样模型 exm952_1.mdl 为基础。试验解算器、工作模式、采样转移模块的影响。
(1)在例 9.5.2 -1 中,采用变步长 ode45 解算器 ,工作正常。
(2)采用任何一种定步长解算器,比如 ode5 ,如果工作模式选 MultiTasking ,那么运行仿真后,将显示“出错”信息,指出存在速率冲突。
(3)如果定步长解算器 ode5 时,采用 SingleTasking 工作模式,那么仿真正常运行。
(4)如果定步长解算器 ode5 时,采用 Auto 工作模式,仿真后,将显示与多任务模式下相同的“出错”信息。
9.7.2.2 计算容差的选择
9.7.3 代数环问题
9.7.3.1 代数环的形成
【例 9.7.3 .1-1 】研究方程组 的解算问题。
(1)用 SIMULINK 对方程组建立如图 9.7.3 .1-1 所示的模型(带代数环)

图 9.7.3 .1-1 按原始方程所建的模型 exm9731_1.mdl
9.7.3.2 代数环的处理
【例 9.7.3 .2-1 】本例以例 9.7.3.1-1 为基础。演示:通过重组模型,直接消除代数环,建立等价模型。
(1)对式( 9.7.3 .1-1 )两边的 项进行合并,得 。
(2)据以上两个方程建立等价模型 exm9732_2.mdl (见图 9.7.3 .2-1 )

图 9.7.3 .2-1 消除了代数环的等价模型
【 * 例 9.7.3 .2-2 】本例以例 9.7.3.1-1 为基础。演示:
(A)利用“记忆”模块中断代数环。
(B)“记忆”模块的副作用。
(C)与前两个模型做性能比较。
(1)利用 exm9731_1.mdl ,制作采用“记忆”模块切断代数环的新模型 exm9732_2.mdl 。

图 9.7.3 . 2-2-1 用“记忆”模块切断代数环的模型 exm9732_2.mdl
(2)运行以下指令,观察不同模型的仿真性能
clear all
tic;[t1,x1,y1]=sim('exm9731_1',5);T1=toc;
tic;[t2,x2,y2]=sim('exm9732_1',5);T2=toc;
tic;[t3,x3,y3]=sim('exm9732_2',5);T3=toc;
disp([blanks(4),' 有代数环 ',blanks(3),' 无代数环 ',blanks(3),' 带记忆块 '])
disp([T1,T2,T3])
plot(t1,y1,'g','LineWidth',6),hold on
plot(t2,y2,'r','LineWidth',2)
plot(t3,y3,'b'),hold off
legend('with loop','without loop','memory',4)
Warning: Block diagram 'exm9731_1' contains 1 algebraic loop(s).
Found algebraic loop containing block(s):
'exm9731_1/k3'
'exm9731_1/Sum'
'exm9731_1/k2'
'exm9731_1/Sum1' (algebraic variable)
有代数环 无代数环 带记忆块
3.0800 0.1100 0.2700

图 9.7.3 . 2-2-2 不同模型的仿真性能比较
|