edit
´Ø¿ô¤ò¶è´Ö¤ò¹Í¤¨¤¿¤È¤¡¤ ¤È¤ÎÉ乿¤¬°Û¤Ê¤ë¾ì¹ç()¡¤¶è´ÖÆâ¤Ë¾¯¤Ê¤¯¤È¤â1¤Ä¤Î²ò¤¬Â¸ºß¤¹¤ë¡¥ ¶è´Ö¤ÎÃæÅÀ¤Ç¤Î´Ø¿ôÃͤòµá¤á¡¤¤½¤ÎÃͤÎÉ乿¤¬¤ÈƱ¤¸¤Ê¤é¤Ð¡¤ ²ò¤ÏÆâ¤Ë¸ºß¤¹¤ë¡¥ ¤³¤Î¤È¤¡¤²ò¤Î¸ºß¤¹¤ë¶è´Ö¤Ï¤Ë¤Ê¤Ã¤Æ¤¤¤ë¡¥ ƱÍͤˤ·¤Æ¡¤¤ÎÃæÅÀ¤Ç¤Î´Ø¿ôÃͤò»È¤¦¤³¤È¤Ç¡¤²ò¤Î¸ºß¶è´Ö¤Ï¤È¤Ê¤ë¡¥ ¤³¤Îºî¶È¤ò·«¤êÊÖ¤¹¤³¤È¤ÇÊýÄø¼°¤Î²ò¤òµá¤á¤ëÊýË¡¤ò2ʬˡ(bisection method)¤È¸Æ¤Ö¡¥
¿Þ1¤Ï2ʬˡ¤Ç¶á»÷²ò¤òµá¤á¤ë¼ê½ç¤ò¼¨¤·¤Æ¤¤¤ë¡¥ ¸½ºß¤Î²ò¤Î¸ºß¶è´Ö¤ò¤È¤¹¤ë¡¥ ¤Ï¤Ç½é´ü²½¤µ¤ì¤ë¡¥ ÃæÅÀ¤ò¤È¤¹¤ë¡¥ ¿Þ1¤Ç¤Ï¤Ç¤¢¤ë¤Î¤Ç¡¤²ò¤Ï¤Ë¸ºß¤¹¤ë¤Î¤Ç¡¤ ¤È¤¹¤ë¡¥ ¼¡¤ÎÃæÅÀ¤ò¤Ç¤¢¤ê¡¤ ¿Þ1¤Ç¤Ï¤Ç¤¢¤ë¤Î¤Ç¡¤²ò¤Ï¤Ë¸ºß¤¹¤ë¡¥ ¤³¤ì¤òÈ¿Éü¤·¤Æ¡¤¤Èµá¤á¤Æ¤¤¤¯¡¥
2ʬˡ¤Î¼ê½ç¤ò°Ê²¼¤Ë¼¨¤¹¡¥
È¿Éü¤ò½ªÎ»¤¹¤ë¤¿¤á¤Î¼ý«¾ò·ï¤Ï°Ê²¼¤È¤Ê¤ë¡¥
2ʬˡ¤Î¥³¡¼¥ÉÎã¤ò°Ê²¼¤Ë¼¨¤¹¡¥
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
int bisection(double func(const double), double xl, double xr, double &x, int &max_iter, double &eps) { double f = func(xl); double fmid = func(xr); if(f*fmid >= 0.0) return 0.0; int k; double dx = fabs(xr-xl), xmid; for(k = 0; k < max_iter; ++k){ xmid = 0.5*(xl+xr); dx *= 0.5; fmid = func(xmid); if(dx < eps || fmid == 0.0){ x = xmid; max_iter = k; eps = dx; return 1; } if(f*fmid < 0){ xr = xmid; } else{ xl = xmid; f = fmid; } } max_iter = k; eps = dx; return 0; }