In Files

  • bigdecimal/lib/bigdecimal/newton.rb


Included Modules

Class/Module Index [+]




Solves the nonlinear algebraic equation system f = 0 by Newton’s method. This program is not dependent on BigDecimal.

To call:

  n = nlsolve(f,x)
where n is the number of iterations required,
      x is the initial value vector
      f is an Object which is used to compute the values of the equations to be solved.

It must provide the following methods:


returns the values of all functions at x

returns 0.0

returns 1.0


returns 2.0


returns 10.0


returns the convergence criterion (epsilon value) used to determine whether two values are considered equal. If |a-b| < epsilon, the two values are considered equal.

On exit, x is the solution vector.

Public Instance Methods

nlsolve(f,x) click to toggle source

See also Newton

               # File bigdecimal/lib/bigdecimal/newton.rb, line 43
def nlsolve(f,x)
  nRetry = 0
  n = x.size

  f0 = f.values(x)
  zero =
  one  =
  two  = f.two
  p5 = one/two
  d  = norm(f0,zero)
  minfact = f.ten*f.ten*f.ten
  minfact = one/minfact
  e = f.eps
  while d >= e do
    nRetry += 1
    # Not yet converged. => Compute Jacobian matrix
    dfdx = jacobian(f,f0,x)
    # Solve dfdx*dx = -f0 to estimate dx
    dx = lusolve(dfdx,f0,ludecomp(dfdx,n,zero,one),zero)
    fact = two
    xs = x.dup
      fact *= p5
      if fact < minfact then
        raise "Failed to reduce function values."
      for i in 0...n do
        x[i] = xs[i] - dx[i]*fact
      f0 = f.values(x)
      dn = norm(f0,zero)
    end while(dn>=d)
    d = dn

Commenting is here to help enhance the documentation. For example, code samples, or clarification of the documentation.

If you have questions about Ruby or the documentation, please post to one of the Ruby mailing lists. You will get better, faster, help that way.

If you wish to post a correction of the docs, please do so, but also file bug report so that it can be corrected for the next release. Thank you.

If you want to help improve the Ruby documentation, please visit