, を共に 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 } |