#include #include #include /************ 図6.2,図6.3(表6.1)の数値解を求めるプログラム ************ ・実行すると,xの区間分割数Nの入力を求めます. ・コマンドラインの第一引数にNを与えることでも 即時に数値解を出力することができます. 例) >aeuler 20 ************************************************************************/ /******************************/ /********** 初期条件 **********/ /******************************/ /****** x=[x0, xN] ******/ #define x0 0 #define xN 6.28 #define y0 1 //y(0) /******************************/ #define true 1.718282 //y(xN)の真値 double h; //差分間隔をグローバル変数とする /******** dy/dx = 右辺 ********/ double Uhen(double x, double y){ double uhen; uhen = -sin(x); return uhen; } /******************************/ /******* 前進オイラー法を適用する関数 *******/ void aEuler(int i, double *xi, double *yi){ yi[i+1] = yi[i]+h*Uhen(xi[i], yi[i]); } /********************************************/ void frame(){ int ix,nx,iy,ny,ixx,iyy; double x,y,dx,dy; linewidth(1.0); rect1(0.0, -1.0, 2.0, 1.0); line1(0.0,0.0,2.0,0.0); texty(0.0,0.0,1,"y"); text(1.0,-1.1,1,"x"); texty(0.0,1.0,3,"1.0"); texty(0.0,-1.0,4,"-1.0"); texty(0.0,0.5,3,"0.5"); texty(0.0,-0.5,4,"-0.5"); textx(0.785,0.00,4,"pi/4"); textx(1.57,0.00,4,"pi/2"); line1(0.785,-0.02,0.785,0.02); line1(1.57,-0.02,1.57,0.02); line1(0.0,0.5,0.02,0.5); line1(0.0,-0.5,0.02,-0.5); return; } int main(int argc, char **argv){ int i, N, ip; 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