8.5 求解双层显式差分格式的方法
例8.2 在一维波动方程(8.16)中,求解域为[0,L],初始条件为u(x,0)=
=x(L-x),左边界条件为u(0,t)=u(L,t)=0,它的解析解为

下面介绍动态模板的制作。
第一步,设计迭代计算。在“文件”菜单下选择“选项”,在“选项”对话框中选择“公式”副对话框。选择启用迭代计算,最多迭代计算次数设为1,最大误差设为0.001并单击“确定”按钮。
第二步,输入已知数据。在单元格A2、B2和C2中分别输入区间的系数a、求解区域长度L和计算停止时间T(这里输入“1”“1”和“0.5”);在单元格D2、E2、F2和G2中分别输入空间步长、时间步长、常数λ=
和计算总计算次数的公式(这里输入“0.1”“0.001”“=E2/D2”和“=C2/E2”);在空单元格H2中输入实现循环的表达式“=IF(H2<G2/3,H2+1,1)”;在单元格I2中输入计算正在计算时刻的表达式“=(3*H2+1)*E2”,如图8.7所示。

图8.7 输入参数和循环迭代控制语句
第三步,输入初始条件和边界条件。在单元格B4中输入区间的左边界“=0”,在单元格C4中输入“=B4+$D$2”;在单元格区域A5:A10中输入显示计算步数的表达式“="k=0"”“="k=1"”“="k-3="&3*H2-2”“="k-2="&3*H2-1”“="k-1="&3*H2”和“="k="&3*H2+1”;在单元格区域B5:B10和L5:L10中输入左右边界条件(这里都为0);在单元格C5中用初始条件输入“=SIN(3*PI()*C4/$B$2)”;在单元格C6中用式(8.21)输入“=0.5*($A$2*$F$2)^2*(B5+D5)+(1-($A$2*$F$2)^2)*C5+$E$2*C4*($B$2-C4)”。选中单元格区域C4:C6,把鼠标指针移到单元格C6的右下角,当其变成“
”符号时,按住左键向右拖动到单元格K6,完成在区间[0,L]内在每一个节点处初始值的计算。
第四步,计算前四步的数值解。在单元格C7中用差分格式(8.18)输入“2*C6-C5+($A$2*$F$2)^2*(B6-2*C6+D6)”。选中单元格C7,把鼠标指针移动到单元格C7的右下角,当其变成“
”符号时,按住左键向右拖动到单元格K7,就得到第二步的数值解;选中单元格区域C7:K7,把鼠标指针移动到单元格K7的右下角,当其变成“
”符号时,按住左键向下拖动三列,就得到前四步的数值解。(https://www.daowen.com)
第五步,实现循环计算。为了实现循环计算,将单元格C7和C8中的计算公式分别改为“IF($H$2=1,2*C6-C5+($A$2*$F$2)^2*(B6-2*C6+D6),2*C9-C8+($A$2*$F$2)^2*(B9-2*C9+D9))”和“=IF($H$2=1,2*C7-C6+($A$2*$F$2)^2*(B7-2*C7+D7),2*C10-C9+($A$2*$F$2)^2*(B10-2*C10+D10))”。选中单元格区域C7:C8,把鼠标指针移动到单元格C8的右下角,当其变成“
”符号时,按住左键向右拖动到单元格K8。此时,如果我们按功能键F9,则在单元格H2的值每一次增加1,循环在1~167之间,就这样在单元格区域B10:L10内得到单元格I2的值在对应时刻的数值解,如图8.8所示。

图8.8 动态数值解
第六步,计算解析解。如图8.9所示,单元格区域B12:L12对应的是x∈[0,L];单元格区域B13:L13对应的是式(8.22)中表达式
的计算值;单元格区域B14:L14对应的是式(8.22)中表达式
在n=1时的计算值;单元格区域B24:L2对应的是式(8.22)对应的计算值;单元格区域B25:L25对应的是解析解与数值解的绝对误差。
第七步,绘制图像。在一个坐标系内同时绘制解析解与数值解图像,在另一个坐标系内绘制误差图,图8.10(a)是当t=0.337(即第k=337)时解析解与数值解的比较图,图8.10(b)是误差图。

图8.9 解析解与误差

图8.10 当t=0.337时解析解与数值解的比较图和误差图