[ 前へ | 目次 | 次へ ]
Now Loading...
ダウンロード
PC (※スマートフォンでは動きません) でダウンロードし、ZIPファイルを右クリックメニューから展開して、できたフォルダ内の「 VCSSL.bat(バッチファイル) 」をダブルクリックすると起動します。 Linux等では「 VCSSL.jar 」をコマンド実行してください。
» 詳しい使用方法や、エラーで展開できない際の対応方法などはこちら

波の干渉(線上の正弦波)のアニメーション表示

線上の(1次元の)正弦波が干渉する様子を再現する、VCSSL製の簡易シミュレーターです。

前回は単純な正弦波のアニメーションを扱いましたが、今回はその続きです。 そもそも正弦波とは? という場合は、まずは前回の内容をご参照ください。 今回は前回の続きとして、正弦波を2つ重ね合わせて、干渉する様子をアニメーション表示してみましょう。

[ 関連記事 ]

使用方法

ダウンロードと展開(解凍)

まず、PC(スマホは未対応)で上の画面の「 ダウンロード 」ボタンを押してください。 するとZIP形式で圧縮されたファイルがダウンロードされるので、そのZIPファイルを右クリックして「すべて展開」や「ここに展開」などで展開(解凍)してください。 展開が成功すると、ZIPファイルと同じ名前のフォルダができ、その中にZIPファイルの中身が入っています。

» 展開がエラーで止まってしまう場合は…

なお、Linux® 等をご使用で、右クリックメニューから展開するとファイル名が文字化けしてしまう場合は、 コマンドライン端末でZIPファイルのある場所まで cd した上で「 unzip -O cp932 ZIPファイル名 」で展開してみてください。

プログラムの起動

Microsoft® Windows® をご使用の場合

上記の通りにZIPファイルを展開したフォルダ内にある、 「 VCSSL.bat(種類はバッチファイル) 」をダブルクリック実行してください。 もしプログラムの内容を書き変えながら使いたい場合は、代わりに「 VCSSL_Editor.bat 」を実行してください。

実行すると、最初にメモリー使用量や、(必要な場合のみ)Java®実行環境を自動で入手するか 等を尋ねられるので、適時答えると、プログラムが起動します。2回目以降はすぐに起動します。

※ ここで入手したJava®実行環境は、ZIPファイルを展開した中の「 jre 」フォルダ内にダウンロードされ、このプログラムの実行のみに使用されます。PC全体に影響する形でインストールされる事はありません。

Linux® 等やその他のOSをご使用の場合

ZIPファイルを展開したフォルダ内へコマンドライン端末で cd して、以下の通り入力して実行してください:

java -jar VCSSL.jar
(プログラムの内容を書き変えながら使いたい場合は、代わりに VCSSL_Editor.jar を実行)

» javaコマンドが使用できない等のエラーが表示される場合は…

起動後の画面

起動すると、まず波のパラメータを数値入力するか尋ねられます。 特に「ぴったりこの値の波長にしたい」などの必要が無ければ、「いいえ」でスキップして構いません。

その後、グラフ画面とパラメータ設定画面が立ち上がります。

起動後の画面

グラフ画面では、正弦波がアニメーション表示されます。 赤色と青色の線が、重ね合わせる2つの波(波Aと波B)です。緑色 の線は、重ねあわされた結果の合成波です。 パラメータ設定画面では、波長や振幅、周期などの値を、波Aと波Bでそれぞれ独立にスライダーで操作できます。

ウィンドウを閉じると、プログラムの実行が終了します。

※ 赤色と緑色が見分けづらい方へ

赤色と緑色が見分けづらく、波Aと合成波がまぎらわしい場合は、グラフ画面上部のメニューバーから、[ 編集 」> 「 色の設定 」メニューを選択すると、 それぞれの波の色を自由に変更する事ができます。

色の設定画面において、系列の No.1 が波A、No.2 が波B、No.3 が合成波です。たとえば、No.3 を「 BLACK 」に設定すると、合成波が、緑色の代わりに黒色で表示されるようになります。

No.3を「 BLACK 」に設定した結果

題材解説

複数の異なる波を重ね合わせると、元のどちらの波とも違った形(と動き)をする波ができます。これを干渉といいます。

例えば、正弦波は sin 関数の形をしていますが、波長のみが微妙に異なる正弦波を重ね合わせて干渉させると、 x 軸上で振幅が大きい所と小さい所(ほぼゼロの点も)が交互に出現する、歪んだ正弦波のような独特のパターンが表れます(下図の緑色の線)。

波長のみが微妙に異なる場合における干渉のアニメーション
( 波A: 振幅=1.0, 波長=0.35, 周期=1.0     波B: 振幅=1.0, 波長=0.4, 周期=1.0 )

また、周期のみが異なる場合は、同じ x の位置でも、振幅が時間によって大きくなったり小さくなったりします(下図の緑色の線)。いわゆる「うなり」です。

周期のみが異なる場合における干渉のアニメーション
( 波A: 振幅=1.0, 波長=0.4, 周期=2.0     波B: 振幅=1.0, 波長=0.4, 周期=1.0 )

波長も振動数も違う波を重ね合わせた場合は、x 軸上の独特のパターンが、時間経過によって移動していく様子を見る事ができます(下図の緑色の線)。

周期も振動数も異なる場合における干渉のアニメーション
( 波A: 振幅=1.0, 波長=0.35, 周期=1.0     波B: 振幅=1.0, 波長=0.4, 周期=0.5 )

面白いのは、振幅の大小のパターンが移動していく向きや速さと、その中にある(歪んだ)正弦波の波が移動していく向きや速さが、一般には全然違うという点です。 前者の速度は群速度、後者の速度は位相速度と呼ばれます。

位相速度は、単体の正弦波にもあって、その場合は要するに波の速さそのものです。近い波長と周期の波を重ね合わせた合成波の位相速度は、ほぼ元の波の位相速度のままです。

一方で群速度は、重ね合わせる2つの正弦波の、「波長の差」と「周期の差」(または波数の差と角振動数の差)の比率によって決まります。 なお、波長や周期が連続的に違う波を無数に重ね合わせる場合は、差の比率の代わりに微分になります。

コード解説

このプログラムのコードはVCSSLで記述されています。 ここではそのコード内容について簡単に解説します。 VCSSLはC系の単純な文法の言語なので、C言語などに触れた事のある方なら簡単に読めると思います。

グラフの範囲などを変えたり、色々と改造したいといった場合などは、 プログラムのコード「 SineWave.vcssl 」をテキストエディタで開いて改造してください。 スクリプト言語なので、コンパイラなどの別ソフトは不要で、コードを書き換えるだけでOKです。

コード全体

まずは、コード全体を見てみましょう。

以上です。大体300行ちょっとの規模の短いコードですね。 各部で行っている処理はコード内のコメントの通りですが、 以下では先頭から順を追って、もう少し詳しく説明します。

基本的には、前回の「 正弦波のアニメーション表示 」のコードと非常によく似ていて、 波の数が増えたので少し拡張されているだけです。 なので、コードの基本的な流れについては、まず前回のコードをご参照ください。

以下では、前回から変わっている部分を中心に、ピックアップして解説していきます。

変数の宣言

先頭から続く変数の宣言部では、基本的には前回と同じで、 そこから波のパラメータや操作用スライダーなどの変数が、 波Aと波Bの2通りぶん用意されるようになっただけです。

ただし、波のデータをグラフソフトに渡すための、座標値を格納する配列については、 1次元だったのが2次元配列になっています:

これは、今回は複数系列のデータをグラフに渡してプロットする必要があるためで、 左端の次元が、系列を区分する次元になります。 今回は波A、波B、合成波の3つの系列に分けてデータをプロットするため、左端次元の要素数は 3 になっています。

右端の次元は前回と同様、座標点についての次元です。1系列あたり N 個の点を線で結ぶので、要素数は N になっています。

main 関数内、波のデータを座標値配列に格納してグラフに渡す部分

続いて main 関数のアニメーションループ内で、波のデータを座標値配列に格納してグラフに渡す部分です。

ここはアニメーションループの内側なので、ある時刻(時刻変数 t )の瞬間におけるグラフを1枚描く処理だと思ってください。 これがパラパラ漫画の要領で、t を小刻みに増やしながら繰り返し実行され、その結果としてグラフがアニメーションします。

さて、波Aと波Bについては前回と同じ事をそのまま2つぶんやってるだけです。 おさらいすると、X 軸方向に小刻みに刻んだ各地点において、正弦波の式:

\[ y = A \sin 2 \pi \bigg( \frac{t}{T} - \frac{x}{\lambda} \bigg) \]

に基づいて Y 座標を求め、各点のX/Y座標値をそれぞれ配列に格納しています。 すると、グラフソフトがその各点を線で結んでくれるのでしたね。

それに続くのが合成波の部分で、同様に小刻みに刻んだ各点のX/Y座標値を配列に格納しています。 その際、各点の Y 座標の値を求めるのに、波Aと波Bにおける各点のY座標を単純に足しているだけです。 こんな単純な計算で合成波の形が求まるのは、 波について学ぶ際に例に挙げられるような普通の波においては、 波の重ね合わせの原理 ―― まさに波の値を単純に足したものが合成波の値になるという原理 ―― が日常スケールで精度よく成り立つおかげです。

逆に言うとこのプログラムでは、波の重ね合わせの原理が完璧に成り立つ、理想的な場合を前提としています

※ もちろん、成り立たない場合もあって、その場合はこんな単純な計算にはなりません。 そういう場合は、各時刻で波Aと波Bの形から合成波を求めるというよりも、 合成波の形を最初に決めた上で、時間発展の微分方程式を数値的に解いて、その後の動きをシミュレーションする事になるでしょう。

その他の部分

その他の部分については、前回のコードの単純な拡張で、 画面上のスライダーなどが波2本ぶんに増えたりしているだけです。 特に引っかかりそうな改変を行っている部分は無いと思います。

コード内容は以上です。

詳しいVCSSLのプログラミングガイド(無料)はこちらへ!

上記のコードはプログラミング言語VCSSLで記述されており、VCSSLのプログラミングガイドは下記で無料公開しています。 上記のコードを改造したい方や、新しいコードを書いてみたい方はぜひご活用ください!

ブラウザで読めるWeb版だけでなく、PDF版も無料で配布しています!

スタートアップガイド( プログラミングがはじめての方向け )
プログラミングの入門書に相当する内容です。プログラミングが初めての方はこちらがおすすめです。
即席ガイド( C系言語ユーザー向け )
C言語や C++ などのC系の言語を扱われている方が、即席でVCSSLを扱うための簡易ガイドです。
文法ガイド
VCSSLの文法や基本的な機能を淡々とまとめた、リファレンスマニュアル的な位置づけのガイドです。
GUI開発ガイド
ボタンや入力項目などのGUI部品が並ぶ、画面を備えたVCSSLプログラムを開発するためのガイドです。
2DCG開発ガイド
画面上や画像ファイルなどに、2次元的な描画を行うVCSSLプログラムを開発するためのガイドです。
3DCG開発ガイド
画面上や画像ファイルなどに、3次元的な描画を行うVCSSLプログラムを開発するためのガイドです。
標準ライブラリ 仕様書
コード内で呼び出される関数は、大半が標準ライブラリのものです。その詳細仕様を掲載しています。

ライセンス

このVCSSLコード( 拡張子が「.vcssl」のファイル )は実質的な著作権フリー(パブリックドメイン) である CC0 の状態で公開しています。 そのままでのご利用はもちろん、言語の種類を問わず、改造や流用などもご自由に行ってください。

※ ただし、このVCSSLコードの配布フォルダ内には、ダウンロード後すぐに実行できるように、 VCSSLの実行環境も同梱されており、そのライセンス文書は「 License 」フォルダ内に同梱されています (要約すると、商用・非商用問わず自由に使用できますが、使用の結果に対して開発元は一切の責任を負いません、といった具合の内容です)。 配布フォルダ内の各構成物の一覧やライセンスについては「 ReadMe_使用方法_必ずお読みください.txt 」をご参照ください。

この記事中の商標などについて

  • OracleとJavaは、Oracle Corporation 及びその子会社、関連会社の米国及びその他の国における登録商標です。文中の社名、商品名等は各社の商標または登録商標である場合があります。
  • Windows は、米国 Microsoft Corporation の米国およびその他の国における登録商標です。この記事は独立著作物であり、Microsoft Corporation と関連のある、もしくはスポンサーを受けるものではありません。
  • Linux は、Linus Torvalds 氏の米国およびその他の国における商標または登録商標です。
  • その他、文中に使用されている商標は、その商標を保持する各社の各国における商標または登録商標です。

[ 前へ | 目次 | 次へ ]
波の干渉(面上の円形波)のアニメーション表示

面上の円形波が干渉する様子を、パラメータを操作しながらアニメーションで見られるプログラムです。
円形波のアニメーション表示

振幅・波長・周期をスライダ―で操作しながら、円形波のグラフをアニメーションで見られるプログラムです。
波の干渉(線上の正弦波)のアニメーション表示

線上(1次元の)の正弦波が干渉する様子を、パラメータを操作しながらアニメーションで見られるプログラムです。
正弦波のアニメーション表示

振幅・波長・周期をスライダ―で操作しながら、正弦波のグラフをアニメーションで見られるプログラムです。
凹レンズを通過する波のシミュレーション

凹レンズ形状の高密度媒質を通過する、波のシミュレーションです。
凸レンズを通過する波のシミュレーション

凸レンズ形状の高密度媒質を通過する、波のシミュレーションです。
乱雑な密度分布における波のシミュレーション

密度分布が乱雑な媒質中における、波の伝播のシミュレーションです。
ローレンツアトラクタ(ファイル出力版)

4次精度ルンゲ=クッタ法により、ローレンツアトラクタを求めるプログラムです。
波の屈折のシミュレーション

密度の異なる領域を、波が屈折しながら通過するシミュレーションです。
力学アルゴリズムによる波のシミュレーション(面上の波)

媒質をバネと格子点で近似し、力学的なアルゴリズムで動かす事による、波のシミュレーションです。
手動で波を発生させるシミュレーション

スライダーをマウスで動かす事により、波を発生させるシミュレーションです。
力学アルゴリズムによる波のシミュレーション(線上の波)

媒質をバネと格子点で近似し、力学的なアルゴリズムで動かす事による、波のシミュレーションです。
二重振り子のシミュレーション

ラグランジュ方程式を用いた、二重振り子のシミュレーションです。
ローレンツアトラクタ(GUI版)

4次精度ルンゲ=クッタ法により、ローレンツアトラクタを求めるプログラムです。
この階層の目次
[ 前へ | 目次 | 次へ ]
お知らせ

Vnanoの公式サイトがオープン、チュートリアルやAPI仕様書等も掲載
2019年08月07日 - オープンソースのアプリケーション組み込み用スクリプトエンジン「 Vnano 」の公式サイトを開設しました。チュートリアルや、スクリプトエンジンのAPI仕様書などが参照できます。その概要をお知らせします。

リニアングラフ3D/2Dが連番ファイルのアニメーションに標準で対応
2019年07月17日 - リニアングラフ3D/2Dでは、7月17日公開の最新版より、連番ファイルを連続的に読み込みながらアニメーション描画するプログラムを同梱し、メニューから標準で使用可能になりました。その概要をお知らせします。

Vnanoのスクリプトエンジンアーキテクチャ解説2: コンパイラ
2019年07月03日 - オープンソースで開発中のスクリプトエンジン「 Vnano 」のアーキテクチャを解説する連載の第2回です。今回は、スクリプトを中間コードへと変換する、コンパイラ部分の内部をクローズアップして解説します。

新着
[公式ガイドサンプル] ユーザーのGUI操作に対して処理を行う

「VCSSL GUI開発ガイド」内のサンプルコードです。ユーザーがGUIを操作した際に行う処理を実装します。
2019年07月28日
[公式ガイドサンプル] 各種GUIコンポーネントを画面上に配置する

「VCSSL GUI開発ガイド」内のサンプルコードです。色々な種類のGUI部品を画面上に配置します。
2019年07月28日
連番ファイルから3Dグラフをアニメーション描画するツール

フォルダ内の連番データファイルを読み込み、3Dグラフを高速で連続描画して、アニメーションさせるツールです。グラフを連番の画像ファイルに保存する事もできます。
2019年06月03日
連番ファイルから2Dグラフをアニメーション描画するツール

フォルダ内の連番データファイルを読み込み、2Dグラフを高速で連続描画して、アニメーションさせるツールです。グラフを連番の画像ファイルに保存する事もできます。
2019年05月24日
[公式ガイドサンプル] 立体モデルを生成して3D空間に配置する

「VCSSL 3DCG開発ガイド」内のサンプルコードです。立体モデルを生成し、3D空間に配置します。
2019年05月21日
開発元Twitterアカウント