Реализация метода многомерного Ньютона в Юлии - PullRequest
1 голос
/ 18 апреля 2019

Я пытаюсь реализовать многомерный метод Ньютона в Джулии, но столкнулся с ошибкой "нет соответствия методу". Ниже моя реализация и код, который я использую для его вызова.

function newton(f::Vector, J::Matrix, x::Vector)
   h = Inf64
   tolerance = 10^(-10)
   while (norm(h) > tolerance)
      h = J(x)\f(x)
      x = x - h
   end
   return x
end

Попытка вызова 1

f(x::Vector) = [(93-x[1])^2 + (63-x[2])^2 - 55.1^2, 
         (6-x[1])^2 + (16-x[2])^2 - 46.2^2]
J(x::Vector) = [-2*(93-x[1]) -2*(63-x[2]); -2*(6-x[1]) -2*(16-x[2])]
x = [35, 50]
newton(f, J, x)

При запуске вышеуказанного кода выдается следующая ошибка:

ERROR: LoadError: MethodError: no method matching newton(::typeof(f), ::typeof(J), ::Array{Int64,1})
Closest candidates are:
  newton(::Array{T,1} where T, ::Array{T,2} where T, ::Array{Int64,1})
  newton(::Array{T,1} where T, ::Array{T,2} where T, ::Array{T,1} where T)
  newton(::Array{T,1} where T, ::Array{T,2} where T, ::Array)

Попытка вызова 2

f(x::Vector) = [(93-x[1])^2 + (63-x[2])^2 - 55.1^2, 
         (6-x[1])^2 + (16-x[2])^2 - 46.2^2]
J(x::Vector) = [-2*(93-x[1]) -2*(63-x[2]); -2*(6-x[1]) -2*(16-x[2])]
x = [35, 50]
newton(f(x), J(x), x) # passing x into f and J

При попытке вызвать метод, как при попытке 2, я не сталкиваюсь с ошибкой, но процесс никогда не завершается. Для справки: соответствующая реализация многомерного метода Ньютона, который я написал в MATLB, решает систему уравнений из примеров примерно за 10 секунд.

Как правильно реализовать и вызвать многомерный метод Ньютона в Джулии?

1 Ответ

4 голосов
/ 18 апреля 2019

Хотя они могут возвращать Vector или Matrix, оба значения f и J являются функциями. Изменение подписи newton s на

function newton(f::Function, J::Function, x)

заставит вашу реализацию работать.

В качестве примечания вы можете не указывать типы, если это не требуется, и использовать возможности динамической типизации и систему типов Джулии. Код должен быть как можно более универсальным. Например, ваша newton функция не будет работать с x как SArray из StaticArrays или с другими типами массивов из других пакетов, поскольку их типы не будут <: Vector. Но если вы опустите тип, ваша функция будет работать с другими типами. Обратите внимание, что после компиляции функции вы ничего не потеряете.

См. Соответствующее обсуждение в документации Юлии. Руководство по стилю .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...