program 11 .................. /* とりあえず、関数の使い方を見るだけのために、 解説に使ったプログラムの完全版を*/ #include #include double func(double); main() { double x; x = 0.1; printf("x=%f f=%f\n",x,func(x)); x = 0.2; printf("x=%f f=%f\n",x,func(x)); } double func(double x) { return pow(x,3) + 5 * x*x - 3*x - 5; } .................. program 12 .................. #include #include #define NMAX 30 /* 関数サブプログラムの利用の続き ニュートン法による非線形方程式の解 */ double func(double); double dfunc(double); main() { double x,xtemp; int irepeat; /* 解探索の初期値 */ scanf("%lf",&x); /* Newton法を最大nmax回くりかえす */ for(irepeat=1; irepeat<=NMAX; ++irepeat){ /* 導関数の値が小さすぎるときは、精度が出ないので計算終了 */ if(fabs(dfunc(x)) < 1e-10){ printf("too small derivative at x=%17.12f\n",x); return; } /* 導関数の値が大丈夫なら解の候補を計算 */ else { xtemp = x - func(x)/dfunc(x); } /* xとxtempの差が与えた精度以内なら終了 */ if(fabs((xtemp-x)/x) <= 1e-10){ printf("converged: x= %17.12f\n",xtemp); return; } else { x=xtemp; printf("%d step x=%17.12f\n",irepeat,xtemp); } } /* nmax回のくりかえしで解に収束しなかったときは終了 */ printf("not converged after %d steps\n",NMAX); printf("current value of x is %17.12f\n",xtemp); } /* 解を得たい関数 */ double func(double x) { return x+cos(x); } /* 解を得たい関数の導関数 */ double dfunc(double x) { return 1-sin(x); }