59
*AIDA Ver 0.8.08 チュートリアル 平成 26 7 17 1

*AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

*AIDA Ver 0.8.08

チュートリアル

平成 26年 7月 17日

1

Page 2: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

本書の目的

本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。

主に数値計算を例題とし、実行可能な*AIDA のプログラムを簡単なものから

作成していきます。チュートリアルの過程で*AIDA の様々な機能や特徴を知

ることができます。

*AIDA の様々なプログラミング環境の設定方法は、別冊の「環境設定と基

本操作」をご参照ください。

本書で用いる*AIDA のプログラミング環境のリリース情報は以下のページ

からご確認いただけます。

http://aida.u-aizu.ac.jp/aida/release.jsp

2

Page 3: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

目次

1 導入 4

1.1 例題1:Hello World . . . . . . . . . . . . . . . . . . . . . . . . 4

1.2 例題2:四則演算 . . . . . . . . . . . . . . . . . . . . . . . . . 7

1.3 例題3:繰り返し処理 . . . . . . . . . . . . . . . . . . . . . . . 9

1.4 例題4:条件分岐 . . . . . . . . . . . . . . . . . . . . . . . . . 13

2 応用 16

2.1 例題5:応用・ネイピア数 . . . . . . . . . . . . . . . . . . . . 16

2.2 例題6:応用・ニュートン法 . . . . . . . . . . . . . . . . . . . 18

2.3 例題7:応用・ニュートン法 連立方程式 . . . . . . . . . . . 20

2.4 例題8:応用・三重対角行列 . . . . . . . . . . . . . . . . . . . 22

2.5 例題9:応用・共役勾配法 . . . . . . . . . . . . . . . . . . . . 25

2.6 例題10:応用・長方形近似 . . . . . . . . . . . . . . . . . . . 30

2.7 例題11:応用・シンプソン法 . . . . . . . . . . . . . . . . . 32

2.8 例題12:応用・常微分方程式 オイラー法 . . . . . . . . . . 34

2.9 例題13:応用・常微分方程式  4次ルンゲ・クッタ法 . . . 36

2.10 例題14:応用・常微分方程式 アダムス・バシュフォース法 38

2.11 例題15:応用・1次元移流方程式 . . . . . . . . . . . . . . . 40

2.12 例題16:応用・1次元バーガース方程式 . . . . . . . . . . . 43

2.13 例題17:応用・熱伝導方程式 . . . . . . . . . . . . . . . . . 46

2.14 例題18:応用・流体流動方程式 . . . . . . . . . . . . . . . . 49

3

Page 4: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

1 導入

1.1 例題1:Hello World

標準出力に「Hello World!」と出力するプログラムを作ります。メニュー左

端の ボタンまたはエクスプローラから新しいプログラムを作成します。ダ

イアログが現れるので、プロジェクトパスとプログラム名を設定します。こ

こでは、それぞれ「/project/CaseStudy」と「HelloWorld」とします。

ヘッダとボディが空のプログラムが作成され、メインビューにロードされ

ます。*AIDA ではヘッダに構造を定義し、ボディにそれらの構造における計

算を定義します。

このプログラムにキャラクタを挿入していきます。キャラクタを挿入する

ためのエディタはクリックした場所によって自動的に起動します。例えば、

ヘッダをクリックすると、次のようなストラクチャ(構造)を挿入するための

エディタが起動します。

*AIDA では、一般的に空間構造(メッシュ、ツリー、パーティクルなど)

を定義しモデリングを行います。一方、*AIDA では「オブザーバ」と呼ばれ

る特別な構造を定義し、グローバルな変数を宣言したり、グローバルな視点

で空間内の計算をコントロールすることができます。またオブザーバにより

従来のプログラミングに近いコーディングを行うことができます。

この例では、オブザーバ構造 を定義します。ヘッダをクリックし、エ

ディタを起動しオブザーバ構造を選択してください。

4

Page 5: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

ボディの領域をクリックすると、次のようなシーン(構造に対する計算の

流れ)キャラクタを挿入するためのエディタが起動します。起動したエディ

タから、シーンを選んで追加します。ここでは、オブザーバ上でアクション

を行うためのシーン を選択します。

追加されたシーンの計算式の領域をクリックすると数式エディタが起動す

るので、これを使って計算式を記述します。

図のように displayキャラクタ を用いることで、標準出力に文章や変数を

出力することができます。キーボードから display()と入力するか、エディタ

下部の入出力カテゴリを選択してキャラクタを追加します。

参考� �*AIDA の数式エディタは、emacsにのキーバインドに対応したキーボードでの入力・アイテム選択が可能になっています。詳しくは「環境設定と基本操作」をご参照ください。� �

5

Page 6: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

メニューの Run で作成したプログラムをコンパイル・実行します。コン

ソールに「Hello World!」と出力されればコンパイル・実行が成功しています。

あるいは、コンソールの各タブの内容に実行結果やエラー等が表示されます。

参考� �コンパイル・実行が正常に行われない場合は以下の項目をご確認ください。

• リソースフォルダ群が正しい位置(例えば C:/aida)に配置されているか。

• g++コンパイラへのパスが正しく設定されているか。� �

6

Page 7: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

1.2 例題2:四則演算

四則演算を行うプログラムを作成します。まず、CaseStudyプロジェクトに

新しいプログラムを追加します。プログラムの名前は「ArithmeticOperators」

と指定し、プログラムを作成します。

*AIDA では、各空間構造とオブザーバそれぞれに関連付けられた変数を宣

言し計算に利用します。

ここでも、計算構造としてオブザーバを定義します。次に変数を宣言しま

す。オブザーバアイコン右隣の領域をクリックすると変数エディタが起動す

るので、これを使って変数宣言を記述します。

ここでは、整数型の変数 xと yを宣言します。宣言と同時に初期化を行う

ことができます。ここでは、xと yを 0で初期化します。整数型の変数を宣言

する時は、変数エディタから int型のキャラクタ を追加するか、キーボー

ドから intと入力してからスペースを空けて変数名を入力します。複数の変数

を同時に宣言する時は、「,」で区切って宣言します。初期化に用いる代入演

算 は「=」をタイプして入力します。

続いて、シーンを定義します。ここでは、オブザーバ上でアクションを行

うためのシーン を選択します。まず、xに 10、yに 20を代入する計算式

を記述します。一つのシーンに複数の計算式を記述したい時は、キーボード

から「;」を入力して仕切りを作り、その後に記述するか、Enterキーで改行

7

Page 8: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

を行い領域を増やしてそこに記述します。

次に、四則演算の結果を出力する計算式を記述します。xと yの和、差、積、

商を displayを使って出力します。デバッグ用に、C++の coutを使うことも

できます。

Runでプログラムをコンパイル・実行し、四則演算の結果が表示されるか

を確認してください。

8

Page 9: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

1.3 例題3:繰り返し処理

1からNまでの整数の和を求めるプログラムを作成します。一般的に、*AIDA

では空間構造内におけるアクティビティ(計算の流れ)により、繰り返し処理

を表現します。一方で、このような空間構造におけるアクティビティを(グ

ローバルな視点で)制御するには、オブザーバによる「コントロールストラ

クチャ」を用います。この例題では、まずコントロールストラクチャを用い

たプログラムを作成し、続いて空間構造を用いた繰り返し処理を実装します。

まず、CaseStudyプロジェクトに新しいプログラムを追加します。プログラ

ムの名前は「Loop 1」と指定し、プログラムを作成します。

ここでも、計算構造として、オブザーバを定義します。変数 Nと和を記録

しておく変数 sum、そしてループ変数 i を宣言します。どれも整数型としま

す。sumは 0、i は 1で初期化します。Nは適当な正の値で初期化します。プ

ログラム例では 6としています。

次に、オブザーバを用いたループ構造を定義します。ボディをクリックし

てエディタを起動し、パネル下部にある三つのカテゴリから、中央の「コン

トロールストラクチャ」を選択してください。このカテゴリには、ループや

条件分岐など、プログラムの動作を制御するコントロールストラクチャが含

まれています。ここでは、指定された回数ループする「for control」 を定

義します。

9

Page 10: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

このコントロールでは、白いひし形のアイコンの右隣、「n」と書かれた領

域にループ回数を入力します。黒い四角のアイコンの右隣にシーンのリスト

を定義します。例えば、ループ回数を「5」と入力し、コントロールを定義す

ると、定義されたシーンのリストが 5回繰り返されす。今回は図のように「n」

の領域に Nを指定します。ここでは sumに i を追加する計算式と、i を 1つ

増やす計算式を含む 1つのシーンを定義しています。

最後に displayを用いて変数 sumの値を出力します。

Runでプログラムをコンパイル・実行し、1から Nまでの和が出力される

かを確認してください。

次に*AIDA の空間構造を活かしたプログラムを作成します。まず、CaseStudy

プロジェクトに新しいプログラムを追加します。プログラムの名前は「Loop 2」

と指定し、プログラムを作成します。

今回は空間構造として、オブザーバではなく 1Dグリッド を定義しま

す。パラメタ Nを設定して 1Dグリッドのサイズを指定します。ここでは、

N=6を指定しています。これは、空間構造が 6つのノードを持つことを意味

します。

変数は整数型の Aという変数を定義します。この変数は配列であり、各要

10

Page 11: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

素が空間構造の各ノードにそれぞれ対応します。

続いて、1Dグリッドの全要素を最初から最後にかけて走査するシーン

を定義します。

次に、Aの各要素にそれぞれ値を代入する計算式を定義します。 は計算

対象のノード(つまり Aの要素)を参照します。内部では 0オリジンのイン

デックスを表しており、例えば 2番目の要素なら 1、4番目の要素なら 3とな

ります。Aにインデックス+ 1を代入することで、Aの各要素に 1から Nま

での整数が代入されます。

最後に 1Dグリッドの全要素を同時に走査するシーン を定義します。こ

こで を使うことで各要素がもつ Aの値の和を求めることができます。この

ような数学関数はエディタのカテゴリ「数学関数」から選択することができ

ます。

各要素には 1から Nまでの整数が代入されているので、これを出力するこ

とで Nまでの整数の和が求められます。

Runでプログラムをコンパイル・実行し、1から Nまでの和が出力される

11

Page 12: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

か確認してください。

12

Page 13: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

1.4 例題4:条件分岐

変数 nの値が正なら「n is positive.」、負なら「n is negative.」、ゼロなら「n

is zero.」と出力する、正負判定のプログラムを作成します。

*AIDA では、空間構造、シーン、マスク、計算式パタンを積極的に用いて

条件分岐の使用を避けることを推奨しています。一方、繰り返し処理と同様

にオブザーバによるコントロールストラクチャで分岐処理を行うことができ

ます。ここではまず、コントロールストラクチャによるシーンの分岐処理、続

いて計算パタンによる分岐処理を確認します。まず CaseStudyプロジェクト

に「Branch1」の名前で新しいプログラムを作ります。

ここでも、空間計算構造として、オブザーバを追加します。また変数とし

て、nを宣言し、適当な値で初期化します。ここでは、3で初期化しています。

次に、nの値によって処理を変えるコントロールを定義します。エディタ下

部にある三つのカテゴリから中央のコントロールストラクチャを選択し、条

件で処理を分岐させる「if-else-do」 を定義します。

「if」と表示されている部分の下の領域に条件式を記述します。この条件が

満たされる時、黒い四角が表す領域のシーンリストが実行され、そうでない時

は白い四角が表す領域のシーンリストが実行されます。条件の領域に「n!=0」

と記述します。このとき条件を満たさなければ nは 0なので、白い四角の領

域に「n is zero.」と出力するシーンを定義します。条件を満たした場合の、黒

い四角の領域でさらに条件分岐のシーンを定義します。今回は条件を「n>0」

13

Page 14: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

と指定します。この条件を満たす時 nは正の整数なので、黒い四角の領域に

「n is positive.」と出力するシーンを定義します。条件を満たさない場合 nは

負の整数なので、白い四角の領域に「n is negative.」と出力するシーンを定義

します。

Runでプログラムをコンパイル・実行し、正しく正負判定の結果が表示さ

れるかを確認してください。

次に計算式パタンを用いたプログラムを作成します。CaseStudyプロジェク

トに「Branch2」の名前で新しいプログラムを作ります。

上記の例と同様に、空間計算構造としてオブザーバを追加し、変数 nを宣

言・初期化します。

続いてシーンを定義します。ここでは、オブザーバ上でアクションを行う

ためのシーンを選択し、計算式を記述します。*AIDA では条件によって異な

る式を評価する計算式パタンキャラクタを使うことができます。計算式パタ

ンキャラクタは計算式エディタから代入します。

計算式パタンキャラクタ は、いくつかの条件とそれらの条件が満たさ

れた時に返す値、またどの条件も満たさなかった場合に返す値を記述します。

図の計算式キャラクタは、1の領域に記述された条件式「n>0」が満たされる

時、2の領域に記述された「n is positive.」を返し、3の領域の条件「n<0」が

満たされる時 4の領域の「n is negative.」を返し、1と 3どちらの条件も満た

14

Page 15: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

さなかった場合に「n is zero.」を返すように定義されています。

Runでプログラムをコンパイル・実行し、正しく正負判定の結果が表示さ

れるかを確認してください。また nの値をいろいろ変えて試してみてくださ

い。

15

Page 16: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

2 応用

2.1 例題5:応用・ネイピア数

ネイピア数

e=∞∑

n=1

1n!

を求めるプログラムを作成します。まず CaseStudyプロジェクトに「Napier-

sConstant」の名前で新しいプログラムを作ります。

空間構造として、オブザーバを追加します。変数として、adder、 n、 ε、

napierを宣言します。*AIDA では変数名に ε等のギリシャ文字を使用するこ

とができます。ギリシャ文字を入力する時は、変数エディタ下部のカテゴリ

からギリシャ文字を選択し、一覧から入力したい文字をクリックします。

今回は全て実数型 です。adderは 1.0、nは 0.0、εは 0.000001、napier

は 1.0で初期化します。

続いてシーンを定義します。シーンを定義する際、パネル下部にある三つ

のカテゴリから中央のコントロールストラクチャを選択し、条件を満たす間

処理を繰り返すシーン を定義します。

16

Page 17: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

「if」と表示されている部分の下の領域に条件を記述します。この条件が満

たされている間、黒い四角が表す領域のシーンリストが繰り返し実行されま

す。条件には「adder> ε」を指定します。次に繰り返すシーンを定義します。

ここでは、オブザーバ上でアクションを行うためのシーンを選択します。こ

のシーンでは、nを 1ずつ増やす計算式、adderを nで割る計算式、napierに

adderの値を加える計算式の三つを定義します。

最後に displayを用いて napierの値を出力します。Runでプログラムをコン

パイル・実行し、正しい結果が表示されるかを確認してください。

17

Page 18: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

2.2 例題6:応用・ニュートン法

ニュートン法とは、方程式の解を数値計算で求める手法です。最初に適当

な値 x0を設定します。x = x0で曲線に接する接線をとると、接線と x軸との

交点は x0よりも真の解に近いものとなります。その交点を新たな値として繰

り返し、真の解の近似を求めていきます。

(1)初期値を x0として、xk+1 = xk −f (xk)

f ′(xk)を繰り返し求める。

(2)|xk+1 − xk|が閾値よりも小さくなったら計算を終了する。

二次方程式 f (x) = x2 − 2をニュートン法で解くプログラムを作成します。

まず CaseStudyプロジェクトに「Newton」の名前で新しいプログラムを作り

ます。

今回は、構造として、オブザーバを定義します。また、実数型の変数 x new、

x、δ、critを宣言します。初期値として、xは 100、critは 0.1で初期化してお

きます。

次に、x、critに値を入力するシーンを定義します。ここでは、オブザーバ

上でアクションを行うためのシーンを選択します。input()キャラクタ を用

いることで、ファイルから値を入力することができます。input()キャラクタ

はエディタ下部の入出力アイコンを選択して追加します。使い方は、数値を

代入する時のように input()キャラクタを代入する形で用います。()の中には

入力ファイルの名前を”で囲んで記述します。入力ファイルは、このプログ

ラムがあるプロジェクト下の inputフォルダに入れておく必要があります。複

数の変数に代入する時は、,で変数を区切り、それらを{}で囲みます。

続いてオブザーバを用いたループ構造を定義します。今回は do-whileコン

トロール を用います。例題 3で定義したループコントロールと似ていま

18

Page 19: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

すが、一度処理を行ってから条件を満たすかの判定を行うというところが異

なっています。条件は「δ > crit」とします。

次に黒い四角が表わす領域にオブザーバ上でアクションを行うシーンを定

義し、その中で各計算式を定義します。絶対値を求めるとき、absキャラクタ

を用います。計算式エディタの数式カテゴリから追加するか、キーボード

から abs()と入力して使用します。

最後に x newの値を出力するシーンを定義します。

Runでプログラムをコンパイル・実行し、x newの値を確認してください。

19

Page 20: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

2.3 例題7:応用・ニュートン法 連立方程式

連立非線形方程式 f (x, y) = 0,g(x, y) = 0の場合には、xy

k+1

=

xy

k

− fx fygx gy

−1 f (xk, yk)

g(xk, yk)

を繰り返すことで解の近似が得られます。

このニュートン法で連立方程式を解くプログラムを作成します。まず Cas-

eStudyプロジェクトに「NewtonEquations」の名前で新しいプログラムを作り

ます。

今回は、構造としてオブザーバを定義します。変数は全て実数型で、x、y、

x new、y new、δ、fx、fy、gx、gy、f、g、critを宣言します。初期値として、

critは 0.01で初期化します。

次に、x、y、critに値を代入するシーンを定義します。ここでは、オブザー

バ上でアクションを行うシーンを定義します。例題 6と同様に、値を入力し

ます。

続いてオブザーバを用いたループ構造 を定義します。今回も条件は「δ

> crit」とします。

次に黒い四角が表わす領域にオブザーバ上でアクションを行うシーンを定

義し、その中で各計算式を定義します。

20

Page 21: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

最後に x newと y newを出力するシーンを定義します。

Runでプログラムをコンパイル・実行し、x newと y newの値を確認して

ください。

21

Page 22: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

2.4 例題8:応用・三重対角行列

次のような線形代数方程式を考えます。行列の形が3重対角になっている

ことから、3重対角行列方程式(Tri-Diagonal Matrix Equation)と呼ばれるこ

ともあります。

a1 −b1 0 0

−c2 a2 −b2. . .

0 −c3 a3 −b3 0. . .

. . .. . .

0 0 −cc an

x1

x2

xn

=

f1f2

fn

この式に対して、xi−1 = Pi−1xi + Qi−1という漸化式を考えます。

第 1行めから、x1 = (1/a1)(b1x2 + f1)となるので、P1 = b1/a1,Q1 = f1/a1

となることがわかります。同様にして第 i 行目を考えると、

ai xi = bi xi+1 + ci xi−1 + fi = bi xi+1 + ci(Pi−1xi + Qi−1) + fi

となるので、

xi =bi

ai − ciPi−1xi+1 +

ciQi−1 + fi

ai − ciPi−1

となり、

Pi =bi

ai − ciPi−1,Qi =

ciQi−1 + fi

ai − ciPi−1

となります。

また、第 n行目は bn = 0なので Pn = 0, xn = Qnとなることがわかります。

以上のことから、下記のように解が得られます。

(1)初期値を P1 = b1/a1,Q1 = f1/a1として、

Pi =bi

ai − ciPi−1,Qi =

ciQi−1 + fi

ai − ciPi−1

を Pn,Qnまで計算する

(2)xn = Qnとして、逆向きに xi−1 = Pi−1xi + Qi−1に代入し、x1まで求める。

三重対角行列の解を求めるプログラムを作成します。まず CaseStudyプロ

ジェクトに「TriDiagonalMES1D」の名前で新しいプログラムを作ります。

22

Page 23: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

//メモ、●の数を減らす

今回は、空間構造として、1Dグリッドを定義し、その中に実数型の変数 a、

b、c、f、x、P、Qを宣言します。さらに、オブザーバを定義し実数型の変数

bunboを宣言します。

次に、各変数に値を代入するシーンを定義します。ここでは、1Dグリッド

の各要素を最初から順に走査するシーン を定義します。各要素の aに 1.0、

bに 0.2、cに 0.5、xに 0を代入します。

fにはインデックス+ 1に 0.2を掛けたものを代入します。PとQの初期化

にはマスクを使います。マスクは空間構造における計算の対象を限定するも

のでマスクキャラクタの「色が付いている部分」を対象とし、「白い部分」を

スキップします。Pには bを aで割ったもの、Qには fを aで割ったものを代

入しますが、最初の要素のみ代入する必要があるため、マスク を用いて

最初の要素のみに代入します。計算式にマスクを適用する場合、計算式の始

めにマスクを追加します。計算式エディタ下部のアイコンからマスクカテゴ

リを選択して入力します。

次に、再度 1Dグリッド各要素を最初から順に走査するシーン を定義

し、各計算式を定義します。これらの計算式はひとつ前の要素を参照してい

るため、最初の要素では行うことができないのでマスク を定義して処理

を行う要素を限定します。シーン全体にマスクを適用する場合、シーンアイ

コン右隣り、シーンに対応するストラクチャ名が入力された領域でマスクを

定義します。ストラクチャ名の領域をクリックするとエディタが起動するの

で、エディタ下部のアイコンからマスクカテゴリを選択し、ストラクチャ名

の直後に追加します。このシーンでは最初の要素以外処理を行うマスクを適

23

Page 24: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

用します。

続いて、1Dグリッドの各要素を最後から逆に走査するシーン を定義し、

各計算式を定義します。このシーンでの計算式も最初の要素では処理を行わ

ないようマスク を適用します。

最後に xの値を出力するシーンを定義します。ここでは、オブザーバ上で

アクションを行うためのシーンを選択します。display()キャラクタ を用い

ることで、xのように空間構造に定義されている変数を全て出力することが

できます。キーボードから display()と入力するか、エディタ下部の入出力カ

テゴリを選択してキャラクタを追加します。

Runでプログラムをコンパイル・実行し、xの値を確認してください。

24

Page 25: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

2.5 例題9:応用・共役勾配法

Conjugate Gradient Method(共役勾配法)は、線形代数方程式 Ax= bの解

を求める手法の一つです。行列 Aが対称行列である時、スカラー関数

F(x) =1

2xT Ax− xTb

を最小にするベクトル xは Ax= bを満たします。これを利用して、線形代数

方程式の解を極値(最小値)問題として解く手法です。

(1)適当な x0を選び、r0 = b− Ax0, p0 = r0とする。

(2) αk =(pk, rk)

(pk,Apk)ここで、(x, y)はベクトル x, yの内積を表す。

xk+1 = xk + αkpk

rk+1 = b− Axk+1 = b− A(xk + αkpk) = rk − αkApk

(3)ここで、‖rk+1‖ ≤ ε‖b‖ならば収束したとみなしてストップ

そうでないならば、βk =(rk+1, rk+1)

(rk, rk), pk+1 + βkpkとして (2)を収束するまで繰

り返す。

この例題では、オブザーバベース、空間構造ベースそれぞれの共役勾配法

のプログラムを作成します。まず CaseStudyプロジェクトに「ConjugateGra-

dientMethodObserverBase」の名前で新しいプログラムを作ります。

25

Page 26: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

今回は 3つのストラクチャを定義します。まず一つ目は 2Dグリッド

です。1Dグリッド同様、パラメタを入力する必要があります。ここではNと

M 両方を 4とします。また実数型の変数 A を宣言します。

二つ目は 1Dグリッドストラクチャです。パラメタ Nは 4とします。また

実数型の変数 b、x、p、q、rを宣言します。

最後はオブザーバです。ここでは、実数型の変数α,β,bnorm,rnorm1,rnorm2,ε

を宣言します。ε は 0.0000001で初期化します。複数の構造を定義した場合

は、それらを区別するため、各構造の「名前」に留意する必要があります。

次に各変数に値を入力するシーンを定義します。ここではオブザーバ上で

アクションを行うシーンを定義し、各計算式を定義します。

ここでは、2Dグリッド (行列)と 1Dグリッド (ベクトル)の掛け算、およ

びベクトル同士の演算を行っていますが、オブザーバ上ではベクトル・行列

の演算子を直接利用することができます。また、bnormに bと bの内積の平

方根を代入する計算式、rnorm1に rと rの内積を代入する計算式を定義しま

す。内積は dotキャラクタを用います。計算式エディタ下部のアルゴリズム

関数カテゴリから追加するか、キーボードから dot()と入力することで使用で

きます。平方根は sqrtキャラクタ で求めることができます。

続いてオブザーバを用いたループ構造 を定義します。今回の条件は「rnorm1

の平方根 > ε× bnorm」とします。

次に黒い四角が表わす領域にオブザーバ上でアクションを行うシーンを定

義し、その中で各計算式を定義します。

最後に xを出力するシーンを定義します。xは空間構造の変数なので、dis-

play()キャラクタを用います。

Runでコンパイル・実行して、xの値を確認してください。

次に*AIDA の特徴を活かした空間構造を用いたプログラムを作成します。

CaseStudyプロジェクトに「ConjugateGradientMethodSpaceBase」の名前で新

しいプログラムを作ります。

26

Page 27: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

今回は 4つのストラクチャを定義します。最初の 3つは 2Dグリッド、1D

グリッド、1Dグリッドの空間構造で、それぞれ名前をm1、v1、v2として定

義します。各空間構造のパラメタ N、M と変数 A、x、b、p、q、rを定義し

ます。

最後はオブザーバです。ストラクチャ名はデフォルトの obのままとしま

す。ここでは、実数型の変数 α、β、bnorm、rnorm1、rnorm2、ε を宣言しま

す。ε は 0.0000001で初期化します。

次に各変数に値を入力するシーンを定義し、各計算式を定義します。

続いてオブザーバを用いたループ構造 を定義します。今回の条件は「rnorm1

の平方根 > ε× bnorm」とします。

次に黒い四角が表わす領域に三つのシーンを定義します。まず、1Dグリッ

ドの要素を最初から最後まで順に走査するシーン を定義します。ここで

は 1Dグリッド v2に対して計算を行うので、シーンに対応するストラクチャ

名を v2に設定します。ここでは、各要素で宣言されている変数 qに 0を代入

します。

続いて、2Dグリッドと 1Dグリッドの計算を行うシーン を定義します。

これは先の q=A×xを空間構造を用いて表したものです。このシーンでは対応

するストラクチャを三つ設定する必要があります。今回は、上からm1、v1、

27

Page 28: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

v2と設定します。このシーンでは、ストラクチャm1に宣言された A の各行

にベクトル pを掛けたベクトルを qに加える処理を行います。qのインデッ

クスは完全に赤い丸 、Aのインデックスは中心が青い丸 、pのインデック

スは中央が赤い丸 を指定します。このように、処理が複雑で分かりづらい

シーンでは、スケルトンビューが理解の助けとなります。

スケルトンビューはシーンアイコンをダブルクリックすることで起動しま

す。初期状態では、一連の処理が並べて表示されていますが、ウィンドウ左

上の「Anim」をクリックすることで、一連の処理をアニメーションで見るこ

とができます。アニメーションはウィンドウ下部のコントローラで操作しま

す。

28

Page 29: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

最後に、オブザーバ上でアクションを行うシーンを定義し、各計算式を定

義します。

最後に xを出力するシーンを定義します。

Runでコンパイル・実行して、xの値を確認してください。

29

Page 30: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

2.6 例題10:応用・長方形近似

区間を長方形で近似する

→ S �n∑

i=1

yi−1(xi − xi) = hn∑

i=0

yi−1

オイラー法を用いて区間の面積を求めるプログラムを作成します。

CaseStudyプロジェクトに「NumericalIntergralEuler」の名前で新しいプログ

ラムを作ります。

今回はストラクチャを二つ定義します。まず 1Dグリッドを定義します。パ

ラメタ Nは 50とし、実数型の変数 A を宣言します。次にオブザーバを定義

します。ここでは、実数型の変数 a、b、h、x、y、areaを宣言します。areaは

0で初期化しておきます。

続いて、変数に値を代入するシーンを定義します。ここでは、オブザーバ上

でアクションを行うシーンを定義します。次に、aに 10を代入する計算式、b

に 100を代入する計算式、bから aを引いた値をストラクチャst1のパラメタ

Nで割ったものを hに代入する計算式を定義します。ストラクチャのパラメ

タは、ストラクチャ名.パラメタ名で参照することが出来ます。今回は st1.N

と記述します。

次に、各長方形の面積を 1Dグリッドの各要素に格納するシーンを定義し

ます。ここでは、1Dグリッドの要素を最初から最後まで順に走査するシーン

30

Page 31: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

を定義し、各計算式を定義します。

最後に面積を出力するシーンを定義します。1Dグリッドの全要素を同時に

走査するシーン を定義します。ここで sumキャラクタ を使うことで各

要素がもつ Aの値の和を求めることができます。各要素には近似された長方

形の面積が代入されているので、これを出力することで面積が求められます。

Runでコンパイル・実行して、面積の値を確認してください。

31

Page 32: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

2.7 例題11:応用・シンプソン法

区間(2つ分)を2次曲線で近似する

→ S �h

3

m∑i=1

(y2i−2 + 4y2i−1 + y2i),h =b− a

2m

シンプソン法を用いて区間の面積を求めるプログラムを作成します。

CaseStudyプロジェクトに「NumericalIntegralSimpson」の名前で新しいプロ

グラムを作ります。

今回はストラクチャを二つ定義します。まず 1Dグリッドを定義します。パ

ラメタ Nは 50とし、実数型の変数 A を宣言します。次にオブザーバを定義

します。ここでは、実数型の変数 a、b、h、x1、x2、x3、y、areaを宣言しま

す。areaは 0で初期化しておきます。

続いて、変数に値を代入するシーンを定義します。ここでは、オブザーバ

上でアクションを行うシーンを定義し、各計算式を定義します。

次に、二次曲線の面積を 1Dグリッドの各要素に格納するシーンを定義し

ます。ここでは、1Dグリッドの要素を最初から最後まで順に走査するシーン

を定義し、各計算式を定義します。myfunc1は自分で定義した関数です。関

32

Page 33: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

数キャラクタと同様に使用することができます。関数を自分で定義するには、

現在のプロジェクトの下に「lib」というフォルダを作り、その中に関数を記

述した.hフォーマットのファイルを入れておきます。今回は「tutorial lib.h」

という名前のファイルを作成し、「lib」フォルダに保存します。このファイル

の中身は以下のように記述します。

double myfunc1(double x){return 2.0+ exp(-0.5*x);

}

最後に面積を出力するシーンを定義します。1Dグリッドの全要素を同時に

走査するシーン を定義します。ここで sumキャラクタ を使うことで各

要素がもつ Aの値の和を求めることができます。各要素には近似された長方

形の面積が代入されているので、これを出力することで面積が求められます。

Runでコンパイル・実行して、面積の値を確認してください。

33

Page 34: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

2.8 例題12:応用・常微分方程式 オイラー法

常微分方程式 dy/dt = f (t, y), y(0) = y0を考えます。両辺を区間 [ti , ti+1] で

積分すると、y(ti+1) − y(ti) =∫ ti+1

ti

f (t, y)dtとなるので、この右辺を数値積分

によって近似すれば y(ti)を既知として y(ti+1)を求めることができます。オイ

ラー法は、応用 6に示した数値積分を適用する方法で、1次精度の常微分方

程式解法です。すなわち、

y(ti+1) − y(ti) =∫ ti+1

ti

f (t, y)dt � f (ti , yi)(ti+1 − ti) = f (ti , yi)∆t

∴ y(ti+1) = y(ti) + f (ti , yi)∆t

このオイラー法で常微分方程式を解くプログラムを作成します。CaseStudy

プロジェクトに「ODE Euler」の名前で新しいプログラムを作ります。

今回はストラクチャを二つ定義します。まず 1Dグリッドを定義します。パ

ラメタ Nは 10とし、実数型の変数 yを宣言します。次にオブザーバを定義

します。ここでは、実数型の変数 t0、y0、δ、tを宣言します。

続いて、変数に値を代入するシーンを定義します。ここでは、オブザーバ

上でアクションを行うシーンを定義し、各計算式を定義します。

次に、計算を行うシーンを定義します。ここでは、1Dグリッドの各要素を

最初から順に走査するシーン を定義し、各計算式を定義します。fは例題

12でも用いた、自分で定義した関数です。関数の中身は以下のように記述し

ます。

double f(double t, double y){return -0.5*y;

}

34

Page 35: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

この計算式では、次の要素を参照する必要があるので、最後の要素では処

理を行わないようにする必要があります。よって、最後の要素以外は処理を

行うマスク を適用します。

最後に yを出力するシーンを定義します。

Runでコンパイル・実行して、yの値を確認してください。

35

Page 36: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

2.9 例題13:応用・常微分方程式  4次ルンゲ・クッタ法

右辺の数値積分をSimpson法で行う方法を考えます。すなわち、区間 [ti , ti+1]

の中央にもう一点 ti+1/2を取って、この 3点を通る f (t, x)を 2次曲線で近似

すれば、

y(ti+1)− y(ti) =∫ ti+1

ti

f (t, y)dt =(∆t/2)

3(f (ti , yi) + 4 f

(ti+1/2, yi+1/2

)+ f (ti+1, fi+1)

)となります。

ただし、ti+1/2における関数値 f (ti+1/2, yi+1/2)と、ti+1における関数値 f (ti+1, yi+1)

は未知なので、何らかの手段によって近似値を推定するしかありません。4次

ルンゲ・クッタ法では、yi+1/2の値を 2種の推定法、P1,P2で近似します。す

なわち、

yP1i+1/2 � yi + (∆t/2)・ f (ti , y1)、yP2

i+1/2 � yi + (∆t/2)・ f (ti1/2, yP1i1/2)

とします。

また、最後の値も yPi+1 � yi + ∆t・ f (ti+1/2, yP2

i+1/2)のように近似できるので、

結局

y(ti+1) = y(ti)+(∆t/2)

3

(f (ti , yi) + 2 f (ti+1/2, y

P1i+1/2) + 2 f (ti+1/2, y

P2i+1/2) + f (ti+1, y

Pi+1))

となります。

この 4次ルンゲ・クッタ法で常微分方程式を解くプログラムを作成します。

CaseStudyプロジェクトに「ODE RungeKutta」の名前で新しいプログラムを

作ります。

36

Page 37: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

今回はストラクチャを二つ定義します。まず 1Dグリッドを定義します。パ

ラメタNは 20とし、実数型の変数 y、yp1、yp2を宣言します。次にオブザー

バを定義します。ここでは、実数型の変数 t0、y0、δ、t、t1、t2、t3、f1、f21、

f22、f3を宣言します。

続いて、変数に値を代入するシーンを定義します。ここでは、オブザーバ

上でアクションを行うシーンを定義し、各計算式を定義します。

次に、計算を行うシーンを定義します。ここでは、1Dグリッドの各要素を

最初から順に走査するシーン を定義し、各計算式を定義します。

Runでコンパイル・実行して、t3と yの値を確認してください。

37

Page 38: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

2.10 例題14:応用・常微分方程式 アダムス・バシュフォース法

オイラー法もルンゲクッタ法も、yi の値だけに基づいて yi+1を求める方法

なので 1段法と呼ばれています。これに対し、yi−1, yi−2...など既に計算した値

も用いて yi+1を求める方法を多段法といいます。y(ti+1)を y(ti)の周りでテイ

ラー級数展開すると、

y(ti+1) = y(ti) + ∆t · dy(ti)/dt+ (∆t2/2!) · d2y(ti)/dt2 + (∆t3/3!) · d3y(ti)/dt3 + · · ·= y(ti) + ∆t · f (ti , yi) + (∆t2/2!) · d f(ti , yi)/dt+ (∆t3/3!) · d2 f (ti , yi)/dt2 · · ·

ここで、 f (t, y)の 2階微分以降の項は無視し、1階微分を差分で近似すると

y(ti+1) � y(ti) + ∆t · f (ti , yi) + (∆t2/2!) ·f (ti , yi) − f (ti−1, yi−1)

∆t

従って、

y(ti+1) � y(ti) +∆t

2(3 f (ti , yi) − f (ti−1, yi−1))

となります。この方法を 2次アダムス・バシュフォース法といい、極めて簡

単であるにも拘わらず高精度の計算ができるので広く利用されています。

このアダムス・バシュフォース法で常微分方程式を解くプログラムを作成

します。CaseStudyプロジェクトに「ODE AdamsBashforth」の名前で新しい

プログラムを作ります。

今回はストラクチャを二つ定義します。まず 1Dグリッドを定義します。パ

ラメタ Nは 10とし、実数型の変数 yを宣言します。次にオブザーバを定義

38

Page 39: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

します。ここでは、実数型の変数 t0、y0、δ、t、toldを宣言します。

続いて、変数に値を代入するシーンを定義します。ここでは、オブザーバ

上でアクションを行うシーンを定義し、各計算式を定義します。

次に、最初の yだけオイラー法で計算するシーンを定義します。ここでは、

1Dグリッドストラクチャの各要素を最初から順に走査するシーン を定義

し、各計算式を定義します。

続いて、残りの yを計算するシーンを定義します。ここでも、1Dグリッド

ストラクチャの各要素を最初から順に走査するシーン を定義し、各計算

式を定義します。図に表されるように、マスクキャラクタを複数追加するこ

とで、複数のマスクを重ねて適用することができます。

最後に yを出力するシーンを定義します。

Runでコンパイル・実行して、yの値を確認してください。

39

Page 40: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

2.11 例題15:応用・1次元移流方程式

1次元移流方程式∂q

∂t+ u∂q

∂x= 0

を考えます。この理論解は、移流速度 uが定数の場合、qの初期分布が形を

変えないまま一定速度 uで x軸上を移動する、という極単純な方程式です。

いまこれを、初期条件

q(0, x) =

1 (1≤ x ≤ 2)

0 (0≤ x < 1,1 < x ≤ 5)

境界条件

q(t,0) = q(t, 5) = 0,u = 1.0,∆x = 0.1,∆t = 0.02

のもとで解くことを考えます。

移流項に後進差分を適用すると、

qn+1i − qn

i

∆t+ u

qni − qn

i−1

∆x= 0

∴ qn+1i = qn

i −

u∆t

∆x

· (qni − qn

i−1

)となります。

この 1次元移流方程式を解くプログラムを作成します。CaseStudyプロジェ

クトに「D1AdvectionEquation」の名前で新しいプログラムを作ります。

40

Page 41: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

今回はストラクチャを二つ定義します。まず 1Dグリッドを定義します。パ

ラメタ Nは 51とし、実数型の変数 q、qnewを宣言します。次にオブザーバ

を定義します。ここでは、実数型の変数 δt、δx、u、c、timerを宣言します。

続いて、変数に値を代入するシーンを定義します。ここでは、オブザーバ

上でアクションを行うシーンを定義し、各計算式を定義します。

次に、qに値を代入するするシーンを定義します。ここでは、1Dグリッド

ストラクチャの各要素を最初から順に走査するシーン を定義し、各計算式

を定義します。このシーンでは、各ノードが持つ qに 0.0を代入する計算式、

そして 10番目から 20番目までのノードが持つ qにのみ 1.0を代入する計算

式を定義します。マスクを用いることで、このように指定した範囲だけ処理

を行わせることができます。図のように範囲を指定できるマスク を入力

し、直後にパラメタを ()で囲み,で区切って指定します。今回は 10番目から

20番目までのノードのみ処理を行う必要があるので、(10,20)と入力します。

パラメタを指定するマスクは変数宣言領域で変数と同様に名前を付けて宣言

することができます。宣言する際にはエディタからマスクカテゴリを選択し

て追加します。宣言したマスクは、マスクキャラクタの後:(コロン)を挟ん

でマスク名を記述することで適用します。

続いて、qnewに qを代入するシーンを定義します。ここでは、オブザーバ

上でアクションを行うシーンを定義し、計算式を定義します。

次に、計算を行うシーンを定義します。ここでは、指定された回数ループ

するコントロール を定義します。今回は、ループ回数 nを 100に設定し

41

Page 42: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

各シーン、計算式を定義します。

最後に、qを出力するシーンを定義します。

Runでコンパイル・実行して、yの値を確認してください。

42

Page 43: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

2.12 例題16:応用・1次元バーガース方程式

次の式は、数値計算スキームの精度検証などによく用いられているバーガー

ス方程式と呼ばれている非線形偏微分方程式です。

∂u

∂t+∂y

∂x= α∂2u

∂x2

この式を、移流項に風上差分、拡散項には中心差分を適用して解くことを

考えます。風上差分は、速度 uの正負によって前進差分と後進差分をスイッ

チするスキームで、

1次精度風上差分:

u∂u∂x

i

ui

ui − ui−1

∆xui ≥ 0

ui

ui+1 − ui

∆xui < 0

3次精度風上差分:

u∂u∂x

i

ui

2ui+1 + 3ui − 6ui−1 + ui−2

6∆xui ≥ 0

ui

− ui+2 + 6ui+1 − 3ui − 2ui−1

6∆xui < 0

などのように表されます。ここでは、初期条件、境界条件を、

I.C.:u(0, x) = sin(πx), B.C.:u(t,0) = u(t,1) = 0

とし、移流項には 1次精度風上差分を適用して α = 0.01,∆x = 0.05,∆t = 0.02

の条件のもとで計算します。離散化式は、

un+1i − un

i

∆t+ un

i

⟨∆un

∆x

⟩i

= αun

i+1 − 2uni + un

i−1

∆x2

とします。ただし、〈〉は 1次風上差分を意味します。

このバーガース方程式を解くプログラムを作成します。CaseStudyプロジェ

クトに「D1BurgersEquation」の名前で新しいプログラムを作ります。

43

Page 44: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

今回はストラクチャを二つ定義します。まず 1Dグリッドを定義します。パ

ラメタ Nは 21とし、実数型の変数 u、unewを宣言します。次にオブザーバ

を定義します。ここでは、実数型の変数 timer、α、δt、δx、πを宣言します。

続いて、変数に値を代入するシーンを定義します。ここでは、オブザーバ

上でアクションを行うシーンを定義し、各計算式を定義します。アークタン

ジェントを求める時、atanキャラクタ を用います。計算式エディタの数式

カテゴリから追加するか、キーボードから atan()と入力して使用します。

次に、オブザーバを用いたループ構造を定義します。ここでは、指定され

た回数ループするコントロール を定義します。今回は nを 100に設定し、

各計算式を定義します。黒い四角が表す領域内二行めのシーンでは、スーパー

オペレーションが使われています。スーパーオペレーションは数式エディタ

から追加します。

44

Page 45: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

スーパーオペレーションは計算スキーム等の複雑な式をコンパクトにした

もので、キャラクタをクリックすることで内容を展開して閲覧することがで

きます。展開された数式はパラメタによって自動的に生成されます。例えば、

例題の 1次精度風上差分 をクリックすると、次のように展開されます。

最後に、uを出力するシーンを定義します。

Runでコンパイル・実行して、uの値を確認してください。

45

Page 46: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

2.13 例題17:応用・熱伝導方程式

二次元の熱伝導方程式

∂T

∂t=λ

ρcp

∂2T

∂x2+∂2T

∂y2

+ q

ρcp

を考えます。ここで、

T:温度 [K]

t:時間 [s]

x:x方向距離 [m]

y:x方向距離 [m]

λ:熱伝導率 [W/(m · K)]

ρ:密度 [kg/m3]

cp:定圧比熱 [J/(kg · K)]

q:単位体積あたりの発熱量 [W/m3]

です。今、下図に示す条件のもとで均質平板の温度分布を計算します。

この離散化式は、

Tn+1i j − Tn

i j

∆t=λ

ρcp

Tni+1 j − 2Tn

i j + Tni−1 j

∆x2+

Tni j+1 − 2Tn

i j + Tni j−1

∆y2

+ q

ρcp

となります。

スタガード格子で計算領域周辺にダミーセルを 1セル分持たせます。

この熱伝導方程式を解くプログラムを作成します。CaseStudyプロジェク

トに「D2HeatEquation」の名前で新しいプログラムを作ります。

46

Page 47: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

//メモ、ストラクチャに widthの概念を持たせ、ストラクチャ∆x、∆yを保

持させる。

今回はストラクチャを二つ定義します。まず 2Dグリッドを定義します。パ

ラメタ Nは 10、パラメタMは 20とし、実数型の変数 T、Tnew、srcを宣言

します。次にオブザーバを定義します。ここでは、実数型の変数 timer、δt、

δx、δy、σ、λ、cp、q、αを宣言します。timerは 0で初期化します。

続いて、オブザーバの変数に値を代入するシーンを定義します。ここでは、

オブザーバ上でアクションを行うシーンを定義し、各変数に値を代入します。

次に、2Dグリッドの変数に値を代入するシーンを定義します。ここでは、

2Dグリッドの最後の行から最初の行へ、各行を最初のノードから最後のノー

ドへ走査するシーン を定義し、各変数に値を代入します。このシーンの

中では、2Dグリッド上での処理の範囲を指定するマスク が使用されてい

ます。このマスクは処理を行う範囲の左端、上端、右端、下端の順でパラメ

タを指定します。図では (5,15,6,16)と指定されています。これは、5行目と 6

列目の 15行目と 16行目でのみ処理を行うことを意味しています。

次に、オブザーバを用いたループ構造を定義します。ここでは、指定され

た回数ループするコントロール を定義します。今回は nを 1000に設定し、

47

Page 48: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

各シーン、計算式を定義します。

最後に、Tを出力するシーンを定義します。

Runでコンパイル・実行して、Tの値を確認してください。

48

Page 49: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

2.14 例題18:応用・流体流動方程式

1.基礎方程式

非圧縮性流体の 2次元質量保存式および運動量保存式は以下のように記述

されます。

質量保存:∂ρ

∂t+∂

∂x j

(ρu j

)= 0

より ρ=const.であるので、

∂u j

∂x j= 0あるいは、 

∂u

∂x+∂v

∂y= 0 (1)

運動量保存: 上と同様にして

∂u

∂t+ u∂u

∂x+ v∂u

∂y= −

1

ρ

∂p

∂x+ νe f f

∂2u

∂x2+∂2u

∂y2

(2)

∂v

∂t+ u∂v

∂x+ v∂v

∂y= −

1

ρ

∂p

∂y+ νe f f

∂2v

∂x2+∂2v

∂y2

+浮力項 (3)

ここで、浮力項を Boussinesq近似すると、

ρ(T)

ρ(Tre f )gy �

1+ 1

ρ(Tre f )

∂ρ

∂T

(T − Tre f

)gy

となります。

エネルギー保存:非圧縮性 Newton流体で物性値一定の条件のもとで、

∂T

∂t+ u∂T

∂x+ v∂T

∂x= α

∂2T

∂x2+∂2T

∂y2

(4)

となります。

記号の説明:

t:時間

x j :j 方向距離

ρ:流体密度

u j :j 方向速度成分

u:x方向速度

v:y方向速度

p:圧力

49

Page 50: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

νe f f:動粘性係数 (実効値)

T:温度

Tre f :基準温度

gy:y方向重力加速度

α =λ

ρcp:熱拡散係数

2.離散化 (Highly Simplified MAC)

(1)-(3)を解くスキームは多くありますが、ここでは最も簡単なHSMAC(Highly

Simplified MAC)を適用します。HSMACは完全陽解法であるので、(2)(3)は

次のように離散化します。

(2)式 :un+1 − un

∆t+

u∂u∂x+ v∂u

∂y

n

= −1

ρ

∂p∂xn+1

+ νe f f

∂2u

∂x2+∂2u

∂y2

n

(2)′

(3)式 :vn+1 − vn

∆t+

u∂v∂x+ v∂v

∂y

n

= −1

ρ

∂p∂yn+1

+ νe f f

∂2v

∂x2+∂2v

∂y2

n

+浮力項 (3)′

すなわち、圧力項以外はすべて時刻 (n)時点の値を用います。ただし、圧力に

関しては、非圧縮性流体では音速が無限大となるので、新しい時刻 (n+1)時

点の値でなくてはなりません。ただ、pn+1の値が分からないので、このまま

では (2)’、(3)’式の計算をすることができません。そこで既知の圧力 pnを用

いて計算した (仮の)速度を (∼)をつけて表すことにします。すなわち、

u− un

∆t+

u∂u∂x+ v∂u

∂y

n

= −1

ρ

∂p∂xn

+ νe f f

∂2u

∂x2+∂2u

∂y2

n

(2)′′

v− vn

∆t+

u∂v∂x+ v∂v

∂y

n

= −1

ρ

∂p∂yn

+ νe f f

∂2v

∂x2+∂2v

∂y2

n

+浮力項 (3)′′

ここで、δu = un+1 − u, δv = vn+1 − vとすると、(2)’ 式 (3)’ 式から (2)” 式 (3)”

式をそれぞれ引くことにより

δu

∆t= −

1

ρ

∂pn+1

∂x−∂pn

∂x

= −1

ρ

∂δp∂x (5)

同様にしてδv

∆t== −

1

ρ

∂δp∂y (ただしδp = pn+1 − pn) (6)

を得ます。

50

Page 51: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

一方、質量保存式は、 ∂u∂xn+1

+

∂v∂yn+1

= 0

あるいは、少し変形して、∂u∂x+ ∂δu∂x +∂v∂y+ ∂δv∂y

= D +∂δu

∂x+∂δv

∂y= 0

∴∂δu

∂x+∂δv

∂y= −D ただし、

∂u∂x +∂v∂y = D (7)

となります。ここで Dは正しくない圧力で速度場を求めたために生じた誤差

です。

(7)式に、(5)(6)式を代入すると、

∂δu

∂x+∂δv

∂y= −∆t

ρ

∂2δp

∂x2+∂2δp

∂y2

= −D

∴∂2δp

∂x2+∂2δp

∂y2=ρD

∆t(8)

(8)式は補正圧力に対するポアソン式です。この式を解いて δpを求め、これ

を (5)(6)式に代入すれば δu, δvが求まるので、最終的に un+1, vn+1, pn+1も求め

られることになります。

(8)式をそのまま計算すれば SMAC(Simplified MAC)スキームになります

が、HSMACではこれをさらに簡略化します。

(8)式の差分形式は次のようになります。

δpi+1 j − 2δpi j + δpi−1 j

∆x2+δpi j+1 − 2δpi j + δpi j−1

∆y2=ρDi j

∆t(等間隔メッシュの場合)

(9)

ここで対角項のみを残し、その他は無視すると

−2

1

∆x2+

1

∆y2

δpi j ≈ρDi j

∆t

∴ δpi j ≈ −ρ

2∆t

1

∆x2+

1

∆y2

Di j (10)

となります。(10)式はポアソン式を解かなくても良いため、計算がかなり簡

略化されていることが分かります。なお、(9)を SOR法で計算することを考

えた場合、(10)式はその対角項を取り出したものであるので、加速係数 ωを

51

Page 52: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

用いて

δpi j ≈ −ωρ

2∆t

1

∆x2+

1

∆y2

Di j (10)′

と書いてもかまいません。これにより収束を加速することができます。ただ

し、1 < ω < 2です。

次に、δpi j を用いて速度場を修正します。すなわち、

un+1i+1/2 j = ui+1/2 j + δu = ui+1/2 j −

∆t

ρ

∂δp∂xi+1/2 j

= ui+1/2 j −∆t

ρ

δpi+1 j − δpi j

∆x

≈ ui+1/2 j +∆t

ρ∆xδpi j

un+1i−1/2 j = ui−1/2 j + δu = ui−1/2 j −

∆t

ρ

∂δp∂xi−1/2 j

= ui−1/2 j −∆t

ρ

δpi j − δpi−1 j

∆x

≈ ui−1/2 j −∆t

ρ∆xδpi j

vn+1i j+1/2 = vi j+1/2 + δv = vi j+1/2 −

∆t

ρ

∂δp∂yi j+1/2

= vi j+1/2 −∆t

ρ

δpi j+1 − δpi j

∆y

≈ vi j+1/2 +∆t

ρ∆yδpi j

vn+1i j−1/2 = vi j−1/2 + δv = vi j−1/2 −

∆t

ρ

∂δp∂yi j−1/2

= vi j−1/2 −∆t

ρ

δpi j − δpi j−1

∆y

≈ vi j−1/2 −∆t

ρ∆yδpi j

また、pn+1i j = pn

i j + δpi j です。

エネルギー式 (4)は、速度場が定まったあとで計算します。すなわち、

Tn+1i, j − Tn

i, j

∆t+

(un+1)i, j

∂Tn

∂x+(vn+1)i, j

∂Tn

∂y

= α∂2T

∂x2+∂2T

∂y2

n

(11)

ここで、(un+1)i, jおよび

(vn+1)i, jは Tの定義点 (i,j) の位置における uおよび v

の値であり、

(un+1)i, j=

1

2

(un+1

i+1/2, j + un+1i−1/2, j

),(vn+1)i, j=

1

2

(vn+1

i, j+1/2 + vn+1i, j−1/2

)で与えます。

52

Page 53: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

基本変数の定義位置

3.HSMACスキームのまとめ

HSMACでは以下の手順により解を求めます。

1© (n)時刻での既知の値 un, vn, pnをセットする。(t=0では初期値を設定する。)

2© un, vn, pnを用いて運動量保存式 ((2)”,(3)” 式)を解く。得られた結果を、u, v

とする。

3© u, vを質量保存式に代入し、誤差 Dを求める。((6)式)

4©圧力補正式 ((9)’式)を求め、速度補正および圧力補正を行ってun+1, vn+1, pn+1

を求める。ただし、(9)’式で得られる δpの値は近似値に過ぎないので、誤差

が十分に小さくなるまで反復する。

5©新しい速度 un+1, vn+1を用いてエネルギー式 (4)を解き、Tn+1を求める。

このように、HSMAC法では圧力場および速度場を同時に少しずつ修正し

ていくため、収束は遅いが不自然な解 (非物理的な解)になりにくいと言われ

ています。

4.境界条件の処理

プログラムを簡単にするために、Simplified TFLOW2Dでは以下の 2つの

境界条件のみを考慮しています。

53

Page 54: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

(1)外部境界 (outerBC)

外部境界に対し、西側を (1)、東側を (2)、南側を (3)、北側を (4)とナンバ

リングします。各境界には次の 4種類の境界条件を設定します。

0· · · 流入/流出 (速度や圧力が与えられる)

1· · · すべり壁条件 (壁面せんだん応力 0)

2· · · すべりなし壁条件3· · · 自由流入出条件

1©流入/流出 (frag= 0)

この境界では速度や圧力 (ダミーセル)が与えられるので特別な処理はしない

が、プロットでダミーセルと平均処理をするので、見栄え上速度境界の場合

にはダミーの圧力を一致させる。

2©すべり壁条件 (frag= 1)

せん断応力を 0にするために、ダミー側の速度を一致させる。

τw = µ∂u

∂n� µ

udummy− uBC

∆= 0 ∴ udummy= uBC

3©すべりなし壁条件 (frag= 2)

壁面上で速度 0となるようにダミー速度を与える。

uwall =1

2

(udummy+ uBC

)= 0 ∴ udummy= −uBC

4©自由流入出条件 (frag= 3)

流動抵抗なし、圧力反射なし (完全な無反射条件ではない)のため下記のよう

な条件を課す。∂u

∂n= 0,∂2p

∂n2= 0

(2)障害物境界 (obsBC)

障害物領域内では、速度、圧力ともに 0を与える。これにより、流体領域

との境界では近似的にすべりなしのような条件となる。

54

Page 55: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

ただし、壁面せん断応力は

τw = µu

∆y

(参考)Visual言語表示

u− un

∆t+

u∂u∂x+ v∂u

∂y

n

= −1

ρ

∂p∂xn

+ νe f f

∂2u

∂x2+∂2u

∂y2

n

(2)′′

(2)” 式は、次のように書くことができます。

u = un + ∆t ·

−u∂u

∂x− v∂u

∂y−

1

ρ

∂p

∂x+ νe f f

∂2u

∂x2+∂2u

∂y2

従って、

u[ ] = un[ ] + ∆t · (− u ·∂

∂x(u) - v ·

∂y(u) −

1

ρ·∂

∂x(p) +νe f f 52 (u) )と記述

できます。

ここで、 u ·∂

∂x(u) は、一次風上差分 (1st order upwind scheme)の場合には、

ui+1/2, j ·ui+3/2, j − ui−1/2, j

2∆x−|ui+1/2, j |

ui+3/2, j − 2ui+1/2, j + ui−1/2, j

∆xfux

v ·∂

∂y(u) は、

(v)i+1/2, j ·ui+1/2, j+1 − ui+1/2, j−1

2∆y−| (v)i+1/2, j |

ui+1/2, j+1 − 2ui+1/2, j + ui+1/2, j−1

∆yfuy

ただし、(v)i+1/2, j =vi, j+1/2 + vi, j−1/2 + vi+1, j+1/2 + vi+1, j−1/2

4

55

Page 56: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

プログラムでは、下記のように表記しているので

un+1i+1/2, j , ui+1/2, j : ⇒ u(i, j)

uni+1/2, j : ⇒ un(i, j)

vn+1i, j+1/2, vi, j+1/2 : ⇒ v(i, j)

vni, j+1/2 : ⇒ vn(i, j)

従って

f ux(i, j) = un(i, j) ∗un(i + 1, j) − un(i − 1, j)

2∆x−

abs(un(i, j))

2∗

un(i + 1, j) − 2 ∗ un(i, j) + un(i − 1, j)

∆x

f uy(i, j) = vnx(i, j) ∗un(i, j + 1)− un(i, j − 1)

2∆y−

abs(vnx(i, j))

2∗

un(i, j + 1)− 2 ∗ un(i, j) + un(i, j − 1)

∆y

また、∂

∂x(p) は、

p(i + 1, j) − p(i, j)

∆x

52 (u) は、

un(i + 1, j) − 2 ∗ un(i, j) + un(i − 1, j)

∆x2+

un(i, j + 1)− 2 ∗ un(i, j) + un(i, j − 1)

∆y

となります。

同様にして、(3)” 式は次のように記述できます。

v[ ] = vn[ ] + ∆t · (− u ·∂

∂x(v) - v ·

∂y(v) −

1

ρ·∂

∂y(p) +νe f f 52 (v) +Buoy)

ここで、

u ·∂

∂x(v) : ⇒ (u)i, j+1/2 ·

vi+1, j+1/2 − vi−1, j+1/2

2∆x−| (u)i, j+1/2 |

2

vi+1, j+1/2 − 2vi, j+1/2 + vi−1, j+1/2

∆xfvx

ただし、(u)i, j+1/2 =ui+1/2, j+1 + ui+1/2, j + ui−1/2, j+1 + ui−1/2, j

4

v ·∂

∂y(v) : ⇒ vi, j+1/2 ·

vi, j+3/2 − vi, j−1/2

2∆y−|vi, j+1/2|

2

vi, j+3/2 − 2vi, j+1/2 + vi, j−1/2

∆yfvy

56

Page 57: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

Fortran言語的に表記すると、それぞれ

f vx(i, j) ∗vn(i + 1, j) − vn(i − 1, j)

2∆x−

abs( f vx(i, j))

2∗

vn(i + 1, j) − 2 ∗ vn(i, j) + vn(i − 1, j)

∆x

vn(i, j) ∗vn(i, j + 1)− vn(i, j − 1)

2∆y−

abs(vn(i, j))

2∗

vn(i, j + 1)− 2 ∗ vn(i, j) + vn(i, j − 1)

∆y

となります。ただし、

f vx(i, j) =un(i, j + 1)+ un(i, j) + un(i − 1, j + 1)+ un(i − 1, j)

4

また、

∂y(p) : ⇒

p(i, j + 1)− p(i, j)

∆y

52 (v) : ⇒vn(i + 1, j) − 2 ∗ vn(i, j) + vn(i − 1, j)

∆x2+

vn(i, j + 1)− 2 ∗ vn(i, j) + vn(i, j − 1)

∆y2

Buoy : ⇒ {1+ a ·(T − Tre f

)}gyここで、a =

1

ρ(Tre f

) ∂ρ∂T

(Tre f

)、gyは y方向重力加速度 (下向きは負)

HSMACスキーム

5 ·m

(V) = div(u, v) =∂u

∂x+∂v

∂y

なので (9)’ 式は

δpi j ≈ −ωρ

2∆t

1

∆x+

1

∆y2

Di j = −

ωρ

2∆t

1

∆x+

1

∆y2

· div(u, v)

と書くことができます。

エネルギー式 (4)は、次のように記述できます。

T[ ] = Tn[ ] + ∆t · (− (u) ·∂T

∂x- (v) ·

∂T

∂y+α· 52 (T) )

ここで、

57

Page 58: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

(u) ·∂T

∂x: ⇒ (u)i, j ·

Ti+1, j − Ti−1, j

2∆x−| (u)i, j |

2

Ti+1, j − 2Ti, j + Ti−1, j

∆x

(u)i, j =1

2

(ui+1/2, j + ui−1/2, j

)(v) ·∂T

∂y: ⇒ (v)i, j ·

Ti, j+1 − Ti, j−1

2∆y−| (v)i, j |

2

Ti, j+1 − 2Ti, j + Ti, j−1

∆y

(v)i, j =1

2

(vi, j+1/2 + vi, j−1/2

)52 (T) : ⇒

Tn(i + 1, j) − 2 ∗ Tn(i, j) + Tn(i − 1, j)

∆x2+

Tn(i, j + 1)− 2 ∗ Tn(i, j) + Tn(i, j − 1)

∆y2

この流体流動方程式を解くプログラムを作成します。CaseStudyプロジェク

トに「TFLOW2D」の名前で新しいプログラムを作ります。

58

Page 59: *AIDA Ver 0.8.08 チュートリアルaida.u-aizu.ac.jp/aida/release/tutorial_0.8.09.pdf2000/08/09  · 本書の目的 本書は、*AIDA を初めて使用される方を対象としたチュートリアルです。主に数値計算を例題とし、実行可能な*AIDA

59