• Tidak ada hasil yang ditemukan

3 Cプログラムを用いた微分方程式実習

N/A
N/A
Protected

Academic year: 2025

Membagikan "3 Cプログラムを用いた微分方程式実習"

Copied!
3
0
0

Teks penuh

(1)

【微分方程式】(真貝) 7

3 C プログラムを用いた微分方程式実習

3.1 ファイルのダウンロードと展開

次の手順に従って,サンプルプログラム2つをダウンロードして,自分のディレクトリに準備する. 演習室での授業の初回に行 1. ターミナルソフトウェアで,この授業専用のディレクトリを作成する. う

cd ~ mkdir DE cd DE

2. Firefoxなど,WWWブラウザを起動し,本授業のwebページを開く.

ポータルサイトから「学習支援サイト(Learning Support Sites)」へ,情報科学部「情報システ ム学科」へ,そして「真貝」へ,「担当授業に関するページ」をクリックして進む.

あるいは以下のURLを指定する.

http://www.oit.ac.jp/is/shinkai/lecture/

さらに「微分方程式」を開き,DE1.cDE2.cのファイルを2つダウンロードする.(それぞれ ファイル名を右クリックして「名前をつけててリンク先を保存」する).

ダウンロードしたファイルは,先ほど作成したDEディレクトリに入れる.

3. ターミナルで,lsして,2つのファイル(DE1.cとDE2.c)があることを確認しよう.この2つ のプログラムファイルは,何度も書き換えるので,不用意に破壊しないように,はじめにコピー をとっておくとよい.

cp DE1.c DE1_original.c cp DE2.c DE2_original.c

3.2 基本的な利用方法

いくつかの課題に対して,次のことを行う.

1. プログラムファイル(DE1.c,DE2.c)を必要に応じて編集する.

DE1.c 1階の微分方程式をEuler法で解くプログラム.解析解もプロットできる.

DE2.c 2階の微分方程式をEuler法で解くプログラム.解析解もプロットできる.

2. プログラムをコンパイルする.

DE1.cのプログラムをコンパイルするときには,

gcc -o DE1.exe DE1.c -lm

-lmは,math.hをインクルードするためのオプションである.-oの直後は生成される実行ファ

イルの名前になる.

3. プログラムを実行する.

上記のコマンドを用いてコンパイルすると,実行ファイルは,DE1.exeになるので,

./DE1.exe

4. プログラムは,2つのファイル(output.numerical,output.analytic)を結果として生成する.

output.numerical Euler法で解いた結果ファイル.式の入力,初期条件の設定が正しければ,それな

りの正しい結果になるはず.

output.analytic  解析解ファイル.自分で解いた答えを関数として入力しておき,その数値を出力

する.自分の解と入力が正しければ,数値解と一致するはず.

両者をgnuplotでグラフにして,一致しているかどうかを確かめる.gnuplotを開き,

gnuplot

gnuplot> plot "output.numerical", "output.analytic"

図を点ではなく,線で描くときには

gnuplot> plot "output.numerical" with line, "output.analytic" with line あるいは

gnuplot> plot "output.numerical" w l, "output.analytic" w l gnuplotを終了するときは

gnuplot> quit

(2)

【微分方程式】(真貝) 8

3.3 DE1.c

プログラムファイルDE1.cである.解読せよ. どこを書き換えたら良い

か,を理解すること.

#include <stdio.h>

#include <math.h>

#define Y0 2.0 /* Initial Value y(0) */

#define X0 0.0 /* starting coord x0 */

#define XMAX 10.0 /* ending coord xmax */

int main(void) {

char filename1[] = "output.numerical";

char filename2[] = "output.analytic";

FILE *fp1, *fp2;

double x=0.0, dx=0.01;

double y=0.0;

double z=0.0;

double dydx=0.0;

// open files

fp1 = fopen(filename1, "w");

fp2 = fopen(filename2, "w");

// x-Loop x = X0;

y = Y0;

while(x < XMAX){

// *** Set your problem below

// dydx = right-hand side of the 1st order DE dydx = -0.5 * cos(x) * y;

dydx = -0.5 * y + exp(-0.2 * x);

dydx = -0.5 * y + sin(x);

dydx = -0.5 * y + 1.0;

dydx = -0.2 * x * y;

dydx = -0.2 * y;

// Set your problem ... end

// *** Write your analytic solution below z = exp(x) * Y0;

z = exp(-0.2 * x) * Y0;

// Analytic solution ... end // output

printf("%10.3f %11.5f %11.5f %12.8f \n", x,y,z,y-z);

fprintf(fp1,"%12.5f %12.5f\n", x,y);

fprintf(fp2,"%12.5f %12.5f\n", x,z);

// Forward Difference y += dydx * dx;

// next x x += dx;

} // end of x-loop // close files fclose(fp1);

fclose(fp2);

return 0;

}

おまじない  Y0 は初期値.

 X0 は始めのxの値.

 XMAX は始めのxの値.

ここに問題となる微分方程式を 書き加える.いくつ書いても,

いちばん下の行のものが有効に なる.

ここに自分の解いた答えを書き 加える.いちばん下の行が有効 に.

(3)

【微分方程式】(真貝) 9

3.4 微分方程式の計算【 1 階の微分方程式】

C.1 プログラムDE1.cDE2.cで用いているのは,微分方程式を解く手段としては,最も基本的な

前進Euler法と呼ばれるものである.教科書を読んで,原理を理解せよ. 教科書§7.1.3と§7.1.4.

C.2 以下の問題を解き,その答えを得た後,プログラムDE1.cで問題となる微分方程式と解答となる 解析解を入力し,両者が一致することを確かめよ.

(1) y!=−2y, y(x= 0) = 2 (2) y!= 3y, y(x= 0) = 0.1 (3) y!=y(y−2), y(x= 0) = 1 (4) y!=y(y−2), y(x= 0) =−1 (5) y y!+x= 0, y(x= 0) = 2

(6) y!+y= 2x2+ 4x−1, y(x= 0) = 2 (7) y!+y= 2ex, y(x= 0) = 1

(8) y!−y= 2ex, y(x= 0) = 0 (9) y!+ 2y=e−2x, y(x= 0) =−2

(10) y!+ 3y= 5 sinx−5 cosx, y(x= 0) = 2

C.3 積分の部分を,前進Euler法ではなく,台形公式やシンプソン公式を用いて改良してみよう. 余裕のある人のみ.

3.5 微分方程式の計算【 2 階の微分方程式】

C.4 プログラムDE2.cでは,2階微分方程式を解いているが,どのように解いているか,解読せよ.

C.5 関数y(t)について以下の微分方程式を解け.プログラムDE2.c で問題となる微分方程式と解答 となる解析解を入力し,両者が一致することを確かめよ.

(1) y!!+ 4y= 0, y(t= 0) = 2, y!(t= 0) = 0 (2) y!!+ 4y= 0, y(t= 0) = 0, y!(t= 0) = 2 (3) y!!−4y= 0, y(t= 0) = 1, y!(t= 0) = 0 (4) y!!−4y= 0, y(t= 0) = 1, y!(t= 0) =−1

C.6 関数y(t)について以下の微分方程式を解け.プログラムDE2.c で問題となる微分方程式と解答 となる解析解を入力し,両者が一致することを確かめよ.

(6),(7)x = [0,30] plotせよ.

(1) y!!−y!−6y= 0, y(t= 0) = 1, y!(t= 0) =−1 (2) y!!−y!−6y= 0, y(t= 0) = 1, y!(t= 0) =−2 (3) y!!+ 4y!+ 4y= 0, y(t= 0) = 2, y!(t= 0) = 6 (4) y!!+ 2y!+ 10y= 0, y(t= 0) = 3, y!(t= 0) = 0 (5) y!!+ 2y!−8y= 18et, y(t= 0) =−2, y!(t= 0) = 1 (6) y!!+ 5y!+ 6y= 5 sint, y(t= 0) = 3, y!(t= 0) = 0 (7) y!!+ 4y= sin 2t, y(t= 0) = 1, y!(t= 0) = 0

C.7 Runge-Kutta法を用いて積分できるように,プログラムを改良せよ. 教科書§7.1.5 参照.余裕

のある人のみ.

Referensi

Dokumen terkait

RIMS研究集会 保存則をもつ偏微分方程式に対する 解の正則性・特異性の研究 京都大学数理解析研究所の共同研究事業の一環として,標記の研究集会を以下の要領

1 地球物理学実験(気象学分野) 予習課題1 表計算ソフトの利用 これは、地球物理学実験を行なうにあたって、表計算ソフトの使用法を復習しておくた めの課題です。必要に応じて、解説(添付ファイルの中の「guide.ppt」)を参照しながら 解答してください。 添付ファイルの中の「data.xls」は、200人の生徒の国語、社会、数学、理科、英語の試

http://www.gfd-dennou.org DCPAM 並列化の概要  DCPAM は, 用いているスペクトル変換ライブラリ ispack1 の MPI 並列化に基づいて並列化されて いる... 長時間積分してみよう  設定ファイル, conf/dcpam_E_T21L26.conf

2 より一般の 2 階線形常微分方程式の境界値問題の Green 関数 ここに書いてある話は良く知られていることではあるが、初学者は探すのが一苦労であろ うから 参考書をあげれば、例えば藤田 [1]。桂田 [2] というノートがある。[2] で書いたまと めを引用しておく。... この証明を見れば分かるように、「形式的自己共役」というときは、境界条件も込めて考える

非線型方程式の場合、問題の自由度が低くても反復計算になる。 a 有限回の四則では exact 厳密 に解けない問題がほとんどである。 b 「反復法」で多くの問題が解ける。 すなわち、真の解 x∗ をある列 {xn} の極限としてとらえ lim n→∞xn = x∗、 十分大 きなn に対して xn をx∗ の近似として採用する。近似解ではあるが、コンピュー

ただしK > 1のとき, 解は1ステップ毎に符号が変わってしまう*2 ため, 物理的要請からK... ただし2≤Kのとき, 解は1ステップ毎に 符号が変わってしまうため,

…高校までに学んだ数学をおろそかにしていると、大学の数学で まともな成績を取ることはかなり難しいので; 数学的議論をすることが難しい、真剣に高 校数学の復習をするべきである。 それから Z du 1−u = log|1−u|+C Cは積分定数 とした人が多かったのだが、正しくは Z du 1−u =− Z du u−1 =−log|u−1|+C

注意 ex を expx と記すこともある。特に x のところに複雑な式が入る場合はそ うする。 定理 n 階微分方程式を満たす関数が,n 個の(独立な)任意定数を含んでいれば, それは一般解である。 微分方程式の解き方(一般解の求め方) 1 一般解を教えてもらう 微分方程式を解くことは工学部の大学生にとって最も難しい