前提・実現したいこと
C言語のプログラムで二次元のラプラス方程式の解をファイルに出力するプログラムを作りたいのですが、
うまくいきません。境界条件は、上面だけ100Vで、ほかの面は、0V、そして、上面の角が50Vです。上のようなプログラムを作りました
発生している問題・エラーメッセージ
エラーは、‘v’ undeclared (first use in this function)と、 expected expression before ‘while’ と、 expected ‘;’ before ‘}’ tokenとなります。
該当のソースコード
C
1#include <stdio.h> 2#include <stdlib.h> 3#include <math.h> 4#define EPS 0.001 5#define IMAX 5 6#define JMAX 5 7 8void iteration(double v[][JMAX], int imax , int jmax) 9{ 10 int i,j; 11 v[i][0]=0; 12 v[j][0]=100; 13 v[0][imax]=50; 14 v[imax][jmax]=50; 15 v[0][j]=0; 16 v[imax][j]=0; 17 for(i=1; i<imax-1; i++) 18 { 19 for(j=1; j<jmax-1; j++) 20 { 21 v[i][j]=(v[i][j-1]+v[i-1][j]+v[i][j+1]+v[i+1][j])/4.0; 22 } 23 } 24} 25int check(double a[][JMAX], int imax, int jmax) 26{ 27 double c,b[IMAX][JMAX]; 28 int i,j,flag; 29 for(i=1; i<imax-1; i++) 30 { 31 for(j=1; j<imax-1; j++) 32 { 33 c=(a[i][j-1]+a[i-1][j]+a[i][j+1]+a[i+1][j])/4.0; 34 b[i][j]=a[i][j]-c; 35 if((fabs(b[i][j])-EPS)>0.0) 36 { 37 flag=1; 38 return flag; 39 } 40 else flag=0; 41 } 42 } 43 return flag; 44} 45int main(void) 46{ 47 int *p; 48 p=(int *)malloc(sizeof(int)*290); 49 if(p==NULL) 50 { 51 printf("メモリ確保失敗\n"); 52 exit(-1); 53 } 54 do{ 55 *p=iteration(v,IMAX,JMAX); 56 } while(while(check(a,IMAX,JMAX)); 57 FILE *fp; 58 if((fp=fopen("output.dat","w")) == NULL) 59 { 60 printf("ファイルが作れません。\n"); 61 exit(-1); 62 } 63 fprintf(fp,"%d\n",*p); 64 fclose(fp); 65 free(p); 66 } 67 return 0; 68} 69
試したこと
上のエラーをもとに、whileの部分あたりをいろいろ変えたり、したのですが、うまくいきません。動的メモリやファイル出力に関して、よく分かっていなかったので調べながらしました。また、ラプラス方程式についても知らなかったので調べながら行いました。
このコードの改良すべき点やヒントを教えていただきたいです。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
下記のコードを参考にしてみるとか
http://www2.kaiyodai.ac.jp/~yoshioka/lecture/simulation/sample/sample.html