- ベストアンサー
差分法でFitzhugh-Nagumo方程式を解くプログラムについての質問
- 差分法を用いてFitzhugh-Nagumo方程式を解くプログラムを作成しましたが、解と一致しない結果となっています。
- プログラムの間違いを教えていただきたいです。
- プログラムの初期条件や境界条件に問題があるのかもしれません。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#1です。 あとから見直したら //結果の出力 if((i%5000)==0){ fprintf(fp,"%5.1f,",i*dt); for(j=0;j<nx;j+=20){ fprintf(fp,"%2.4e,",u[j]); } fprintf(fp,"\n"); } は for(i=0;i<nt-1;i++){ の直後にすべきでしたね。 あなたの書いたプログラムをもとに細かく変更していますので,コードを確認してください。
その他の回答 (2)
- f272
- ベストアンサー率46% (8467/18129)
> どのように設定したらいいんでしょうか? 答えの図から類推すると以下のような境界条件になっていたのではないですか? #include <stdio.h> #include <stdlib.h> //exsit()で必要 int main(){ double a,b,g,e; double dt,dx,tmax,xmax; double *u,*v,*u1,*v1; int nx,nt,i,j; a=0.1;b=0.5;g=1.0;e=0.01; dt=0.001;dx=0.1; tmax=500.;xmax=200; nt=tmax/dt;nx=xmax/dx; FILE *fp; if((fp = fopen("ResultNagumo.txt","w"))==NULL){ printf("Can't open file\n"); exit(2); } u = (double*)malloc(sizeof(double)*nx); v = (double*)malloc(sizeof(double)*nx); u1 = (double*)malloc(sizeof(double)*nx); v1 = (double*)malloc(sizeof(double)*nx); //初期値 u[0]=1.; v[0]=0.; for(i=1;i<nx;i++) u[i]=v[i]=0.0; //差分計算 for(i=0;i<nt-1;i++){ if (i*dt>tmax) break; for(j=1;j<nx-1;j++){ u1[j] = u[j] + dt*((u[j+1]-2*u[j]+u[j-1])/(dx*dx)+(a-u[j])*(u[j]-1.)*u[j]-v[j]); v1[j] = v[j] + dt*(e*(b*u[j]-g*v[j])); } //境界条件 if(i*dt<=50.) { u1[0]=1.; v1[0]=0.; } else { u1[0]=u[1]; v1[0]=v[1]; } u1[nx-1]=u[nx-2]; v1[nx-1]=v[nx-2]; //結果の出力 if((i%5000)==0){ fprintf(fp,"%5.1f,",i*dt); for(j=0;j<nx;j+=20){ fprintf(fp,"%2.4e,",u[j]); } fprintf(fp,"\n"); } for(j=0;j<nx;j++){ u[j] = u1[j]; v[j] = v1[j]; } } free(u);free(v); free(u1);free(v1); fclose(fp); return 0; }
お礼
回答ありがとうございます。境界条件を見直すと自分で書いたプログラムでも同じ結果を出力することが分かりました。遊び心で境界条件を調整してみればよかったです。境界条件の理解が甘いことが分かったので、拡散方程式と波動方程式も解いて理解に努めています。 uとvを二次元配列で確保したのも下手くそでした。時間の刻み幅を小さくすると1次元目の次元が大きすぎてプログラムが途中で止まりました…。上記のように、データを時間刻み毎に出力してu,vを上書きするように使えば1次元の確保だけで済みますね。プログラムの書き方まで勉強になりました。ありがとうございます。
- f272
- ベストアンサー率46% (8467/18129)
あなたの書いているような境界条件では,答えのようにはなりません。 なにか間違っていませんか? それからプログラムは,計算範囲がxについて0から10,tについて0から5になっていることに気がついていますか?
補足
> あなたの書いているような境界条件 問題設定で与えられたままなのですが、古い問題のため正しい境界条件を質問する相手がいません。その境界条件で解けるのかなと考えながら、拡散方程式に関数が付いたような式なので簡単に答えがでるものと思って手をだしました。恐れながらどのように設定したらいいんでしょうか? >プログラムは,計算範囲がxについて0から10,tについて0から5 この点は質問を投書した後に気が付きました。
お礼
時間と共にパルスが伝播していく様子をgifにすることができました。添付したいのですが添付する欄が無いためコメントのみ。