在Julia中实施多元牛顿法

时间:2019-04-18 08:39:07

标签: julia newtons-method

我正在尝试在Julia中实现多元牛顿方法,但是遇到了“没有方法匹配”错误。下面是我的实现以及用来调用它的代码。

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秒内解决了示例中的方程组。

如何在Julia中正确实现和调用多元牛顿方法?

1 个答案:

答案 0 :(得分:4)

尽管它们可能返回VectorMatrix,但fJ都是函数。将newton的签名更改为

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

将使您的实施工作正常。

作为旁注,除非有必要,否则您可能要避免指定类型,而应使用动态类型和Julia的类型系统的功能。该代码应尽可能通用。例如,您的newton函数不能与{{1}中的x作为SArray的{​​{1}}或其他包中的其他数组类型一起使用,因为它们的类型将不是StaticArrays 。但是,如果省略类型,则您的函数将与其他类型一起使用。请注意,编译函数后,您将不会损失任何性能。

请参阅Julia文档Style Guide中的相关讨论。