偏微分方程式の差分解法・周期境界条件について
Posted: 2010年9月07日(火) 15:00
初めまして。大学の課題で行き詰まったので、投稿させていただきました。
課題の内容は、∂u/∂t = ∂^2u/∂x^2 + u(1-u)(u-a)
という偏微分方程式を差分法で解くというものです。
初期条件は u(x,0) = 0.1
周期境界条件は u(0,t) = u(l,t),(∂u/∂x)(0,t) = (∂u/∂x)(l,t) (0≦x≦l)
0≦a≦1.0
となっています。
場合分けをしたりして考えているのですが、結果は全ての位置で値が同じ状態になったりしてうまくいきません。
正解?というか正しくできた場合は時間が経つにつれて波が発生するようなグラフができあがるらしいです。
以下にソースを載せます。本来はgnuplotに出力もしているのですが、その部分は省略しました。
#include <stdio.h>
#include <stdlib.h>
#define N 100
#define M 100
#define a 0.5
#define t 0
#define DT 0.00001 /* delta t*/
#define DX 0.01 /* delta x*/
int main( void )
{
/* θu/θt = θ^2u/θx^2+u(1-u) */
int i,j;
double u[M+1][N+1]; /* u(x,t) */
double x[M];
/* 初期条件 */
for(i=0; i<=M; i++)
u[0] = 0.1;
/* integ. */
for(j=0; j<=N-1; j++){
i=0;
u[j+1]=(u[M][j])+(DT/(DX*DX))*(u[i+1][j]-2*u[M][j]+u[M-1][j])+DT*(u[M][j])*(1-u[M][j])*(u[M][j]-a);
for(i=1; i<=M-2; i++){
u[j+1]=(u[j])+(DT/(DX*DX))*(u[i+1][j]-2*u[j]+u[i-1][j])+DT*(u[j])*(1-u[j])*(u[j]-a);
}
i=M-1;
u[j+1]=(u[j])+(DT/(DX*DX))*(u[0][j]-2*u[i][j]+u[i-1][j])+DT*(u[i][j])*(1-u[i][j])*(u[i][j]-a);
u[M][j+1]=u[0][j+1];
}
}
コンパイルなどは問題なく行えているので、純粋に式の組み立て方だと思うのですが…
Cも差分法もほぼ初心者レベルなので、基本的な見落としがあるかもしれません。
どなたかわかる方がいらっしゃれば、教えていただければ幸いです。
質問内容に不備等ありましたら、ご指摘お願いします。
課題の内容は、∂u/∂t = ∂^2u/∂x^2 + u(1-u)(u-a)
という偏微分方程式を差分法で解くというものです。
初期条件は u(x,0) = 0.1
周期境界条件は u(0,t) = u(l,t),(∂u/∂x)(0,t) = (∂u/∂x)(l,t) (0≦x≦l)
0≦a≦1.0
となっています。
場合分けをしたりして考えているのですが、結果は全ての位置で値が同じ状態になったりしてうまくいきません。
正解?というか正しくできた場合は時間が経つにつれて波が発生するようなグラフができあがるらしいです。
以下にソースを載せます。本来はgnuplotに出力もしているのですが、その部分は省略しました。
#include <stdio.h>
#include <stdlib.h>
#define N 100
#define M 100
#define a 0.5
#define t 0
#define DT 0.00001 /* delta t*/
#define DX 0.01 /* delta x*/
int main( void )
{
/* θu/θt = θ^2u/θx^2+u(1-u) */
int i,j;
double u[M+1][N+1]; /* u(x,t) */
double x[M];
/* 初期条件 */
for(i=0; i<=M; i++)
u[0] = 0.1;
/* integ. */
for(j=0; j<=N-1; j++){
i=0;
u[j+1]=(u[M][j])+(DT/(DX*DX))*(u[i+1][j]-2*u[M][j]+u[M-1][j])+DT*(u[M][j])*(1-u[M][j])*(u[M][j]-a);
for(i=1; i<=M-2; i++){
u[j+1]=(u[j])+(DT/(DX*DX))*(u[i+1][j]-2*u[j]+u[i-1][j])+DT*(u[j])*(1-u[j])*(u[j]-a);
}
i=M-1;
u[j+1]=(u[j])+(DT/(DX*DX))*(u[0][j]-2*u[i][j]+u[i-1][j])+DT*(u[i][j])*(1-u[i][j])*(u[i][j]-a);
u[M][j+1]=u[0][j+1];
}
}
コンパイルなどは問題なく行えているので、純粋に式の組み立て方だと思うのですが…
Cも差分法もほぼ初心者レベルなので、基本的な見落としがあるかもしれません。
どなたかわかる方がいらっしゃれば、教えていただければ幸いです。
質問内容に不備等ありましたら、ご指摘お願いします。