#include #include #include /******************* 図6.4の数値解を求めるプログラム ******************* ・実行すると,xの区間分割数Nの入力を求めます. ・コマンドラインの第一引数にNを与えることでも 即時に数値解を出力することができます. 例) >aeuler 20 ************************************************************************/ /******************************/ /********** 初期条件 **********/ /******************************/ /****** x=[x0, xN] ******/ #define x0 0 #define xN 20 #define y0 0.1 //y(0) /******************************/ double h; //差分間隔をグローバル変数とする /******** dy/dx = 右辺 ********/ double Uhen(double x, double y){ double z; z = y-y*y; return z; } /******************************/ /******* 前進オイラー法を適用する関数 *******/ void aEuler(int i, double *xi, double *yi){ yi[i+1] = yi[i]+h*Uhen(xi[i], yi[i]); } /********************************************/ int main(int argc, char **argv){ int i, N; double *xi, *yi; /***************** 入力処理(始) *********************/ if(!(argc==1 || argc==2)){ printf("引数のエラーです\n"); return 1; } if(argc == 1){ printf("Nを入力してください.\n N = "); scanf("%d",&N); }else{ argv++; N = atoi(*argv); } /******************* 入力処理(終) *******************/ xi = malloc(sizeof(double)*(N+1)); //xi[N+1] yi = malloc(sizeof(double)*(N+1)); //yi[N+1] if(xi==NULL || yi==NULL){ printf("can't malloc!!\n"); return 2; } h = fabs(xN-x0)/(double)N; //差分間隔 /******* 初期条件を代入 *******/ xi[0] = x0; xi[N] = xN; for(i=1; i