好奇两列横波叠加产生驻波现象后的波形是怎样的,于是搜索有没有相关的模拟动画之类的,没找到现成的。就这么一个问题从零开始编程解决好像又小题大做了,我也没有类似经验,学习成本比较高。

突然想到电脑上安装了 GeoGebra,都没怎么用过。上手后发现用它来实现这个需求是可行的,简单折腾一下之后,全过程的动画就有了。

驻波现象动图

为什么使用 GeoGebra ?

在写这篇文章之前,我以为 GeoGebra 就是几何画板(GSP)的别名。后者是教学演示常用的一款软件,更加有知名度,不过比较古老并且是收费的,现代化的界面和跨平台这些特性也就没有了。我当初应该是搜索几何画板,然后下载了 GeoGebra 吧...

打开应用可以注意到界面简洁直观,基础使用不需要刻意学习。还有简单的几何作图和三维图象功能,本文就不涉及了。与 MatlabMathematica 等软件比较,在专业性和强大功能方面自然不及。但是 GeoGebra 对于新手更友好,对编程方面的要求更低,可以说更面向大众吧。

还有,它是一款开源、非商业用途免费的应用,这点对于喜爱开源软件并且没钱购买正版软件的我是很有吸引力的。

过程

获取应用

可以在其官网获取,源代码托管在 GitHub。它是 Web 应用,可以在线使用,也可以下载本地的 Electron 应用。我使用的是版本为 6.0。

创建变量

由于我们要绘制动态的波形,函数表达式中不能用常数表示了。于是使用 工具 -> 滑动条 创建变量。

创建完成后的截图

这里我创建了两个变量 phi 和 lambda,分别用于控制相位(不知道这样表达是否合适)和波长。滑动条右边的播放键,可以控制变量值随时间线性变化,这样我们便可以作出动态的图象。

创建函数

在输入框内直接输入函数表达式即可。要用分段函数来表示波,需要用到它的 if 语法。基本语法是这样的,和 Excel 很像:

if(<condition>, <then-expression>, <else-expression>)

else 表达式可以省略。因此,左边波的表达式是这样的:

f(x) = if(phi - lambda < x < phi, sin(x - phi))

a < x < b 也可以用 x > a && x < b 代替。右边的波同理。这样就得到了两列原始的波。

最终的波形呢,不是简单将两个函数相加。它也需要分段考虑。这里用 if 的另一个用法可以是表达式更加简洁,相当于很多编程语言中的 switch

if(<condition-1>, <then-expression>, <condition-2>, <then-expression>, ..., <else-expression>)

最终波形的表达式:

p(x) = if(
	phi < lambda / 2,
	if(
		x < -phi, f(x),
		x > phi, g(x),
		f(x) + g(x)
	),
	if(
		x < phi - lambda, g(x),
		x > lambda - phi, f(x),
		f(x) + g(x)
	)
)

点击 phi 变量上的播放键,就能产生动态的波形了。