#/*********************************************************** # newt1.rb -- Newton (ニュートン) 法 #***********************************************************/ def f( x ) # $f(x) = 0$ を解く関数 $f(x)$ return (($b + x) * x + $c) * x + $d end def f_prime( x ) # $f(x)$ の導関数 return (2 * $b + 3 * x) * x + $c end def newton( x ) # 初期値 $x$ を与えて $f(x) = 0$ の解を返す begin fx = f(x) printf(" x = % -24.16g f(x) = % -.2g\n", x, fx) if ((fp = f_prime(x)) == 0); fp = 1; end # 強引にずらす xprev = x; x -= fx / fp end while (x != xprev) return x end printf("ax^3+bx^2+cx+d=0を解きます.\na b c d ? ") a, $b, $c, $d = gets.split.collect {|data| data.to_f} $b /= a; $c /= a; $d /= a a = $b * $b - 3 * $c if (a > 0) a = (2.0 / 3.0) * Math::sqrt(a) x1 = newton(-a - $b / 3) # 左側から printf("x1 = %g\n", x1) x2 = newton(a - $b / 3) # 右側から if (x2 == x1); exit 0 ; end printf("x2 = %g\n", x2) x3 = newton($b / (-3)) # 変曲点から printf("x3 = %g\n", x3) else x1 = newton(0) # 適当な点から printf("x = %g\n", x1) end exit 0