Spec-Zone.ru › Ruby 2.5

модуль Newton

Включенные модули:
LUSolve, Jacobian

newton.rb

Решает систему нелинейных алгебраических уравнений f = 0 методом Ньютона. Эта программа не зависит от BigDecimal.

Для вызова:

  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.

Она должна предоставлять следующие методы:

f.values(x)

возвращает значения всех функций в точке x

f.zero

возвращает 0.0

f.one

возвращает 1.0

f.two

возвращает 2.0

f.ten

возвращает 10.0

f.eps

возвращает критерий сходимости (значение эпсилон), используемый для определения того, считаются ли два значения равными. Если |a-b| < эпсилон, два значения считаются равными.

По завершении x является вектором решения.

Публичные методы экземпляра

nlsolve(f,x) Показать исходный код
# File ext/bigdecimal/lib/bigdecimal/newton.rb, line 43
def nlsolve(f,x)
  nRetry = 0
  n = x.size

  f0 = f.values(x)
  zero = f.zero
  one  = f.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
    begin
      fact *= p5
      if fact < minfact then
        raise "Failed to reduce function values."
      end
      for i in 0...n do
        x[i] = xs[i] - dx[i]*fact
      end
      f0 = f.values(x)
      dn = norm(f0,zero)
    end while(dn>=d)
    d = dn
  end
  nRetry
end

См. также Newton

Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API