,
を共に 2 階中心差分で近似してできた差分方程式を
「波動方程式に対する差分法」
で説明してあるが、他にも色々な方法がある。
Friedrichs の差分法と呼ばれるものが有名である (藤沼祐一「波動方程式に対する差分法」 を見よ) が、 今日のI君が説明したようにして、 時間について1階の方程式にして解くのも自然である。
ただ、今日のは、 これまで卒研で学んだことの多くを「おいといて」という感じの内容でした。 ツッコミを箇条書きにしておく。
ちょっと遊んでみる。
1 /* fib1.c --- 配列を使う */
2
3 #include <stdio.h>
4
5 #define N (20)
6
7 int main(void)
8 {
9 int i;
10 int a[N+1];
11 a[0] = 1;
12 a[1] = 1;
13 for (i = 2; i <= N; i++)
14 a[i] = a[i - 1] + a[i - 2];
15 for (i = 0; i <= N; i++)
16 printf("a[%2d]=%5d\n", i, a[i]);
17 return 0;
18 }
|
1 /* fib2.c --- 隣接3項の漸化式だから3つメモリーがあれば十分 */
2
3 #include <stdio.h>
4
5 #define N (20)
6
7 int main(void)
8 {
9 int i;
10 int am2, am1, a;
11 am2 = 1;
12 am1 = 1;
13 printf("a[%2d]=%5d\n", 0, am2);
14 printf("a[%2d]=%5d\n", 1, am1);
15 for (i = 2; i <= N; i++) {
16 a = am1 + am2;
17 printf("a[%2d]=%5d\n", i, a);
18 am2 = am1;
19 am1 = a;
20 }
21
22 return 0;
23 }
|
1 /* fib3.c --- ベクトル列になったときはコピーが面倒なので、添字でローテート
2 まあ、リングバッファーみたいなもんです。 */
3
4 #include <stdio.h>
5
6 #define N (20)
7
8 int main(void)
9 {
10 int i;
11 int a[3];
12 a[0] = 1;
13 a[1] = 1;
14 printf("a[%2d]=%5d\n", 0, a[0]);
15 printf("a[%2d]=%5d\n", 1, a[1]);
16 for (i = 2; i <= N; i++) {
17 a[i%3] = a[(i-1)%3] + a[(i-2)%3];
18 printf("a[%2d]=%5d\n", i, a[i%3]);
19 }
20
21 return 0;
22 }
|
1 /* fib4.c --- 割り算 % をやめて */
2
3 #include <stdio.h>
4
5 #define N (20)
6
7 int main(void)
8 {
9 int i,I,Im1,Im2;
10 int a[3];
11 a[0] = 1;
12 a[1] = 1;
13 printf("a[%2d]=%5d\n", 0, a[0]);
14 printf("a[%2d]=%5d\n", 1, a[1]);
15 Im1 = 1; Im2 = 0;
16 for (i = 2; i <= N; i++) {
17 I = Im1 + 1; if (I == 3) I = 0;
18 a[I] = a[Im1] + a[Im2];
19 printf("a[%2d]=%5d\n", i, a[I]);
20 Im2 = Im1;
21 Im1 = I;
22 }
23
24 return 0;
25 }
|