首页 > 解决方案 > 在 Julia 1.0.5 中结合 ForwardDiff 和 PyPlot 的问题

问题描述

在 Julia 1.0.5 中,我有一个函数f(x::Vector{<:Real}),定义为

f(x::Vector{<:Real}) = (x[1] - 2)^2 + ( x[2] - 1 )^2

签名是这样的,因为我想将它与ForwardDiff包一起使用,并且可以很好地使用它。我将功能赋予ForwardDiff.gradient,一切都像魅力一样。

但是,我也想PyPlot使用相同的函数做一些可视化f。即,我想用 绘制它的轮廓contourf。为此,我构造了两个向量X::Vector{<:Real}Y::Vector{<:Real},并想f用它们调用相同的函数来生成轮廓。

但是,拨打电话f.([X, Y])并没有像我想要的那样广播矢量,因为我得到了错误

LoadError: MethodError: no method matching (::getfield(Main, Symbol("#f#1044")))(::Int64)
Closest candidates are:
  f(!Matched::Array{#s25,1} where #s25<:Real)

这当然会阻止我使用该contourf函数,因为它需要f2D 网格上的值。

我是否需要定义一个完全不同的东西f(x::Vector{<:Real}, y::Vector{<:Real})才能绘制出我想要的轮廓,或者是否有替代方法可以避免这种情况?

标签: functionmatplotlibparametersjuliaarray-broadcasting

解决方案


这个问题可以通过多分派的力量来解决:

f(x::Vector{<:Real}) = (x[1] - 2)^2 + ( x[2] - 1 )^2
f(x::Real,y::Real) = f([x,y])
nx = 10
ny = 20
X = rand(nx) #mesh of x points
Y = rand(ny) #mesh of y points
Z = f.(transpose(X),Y) #nx x ny matrix

对于两个参数梯度:

two_point_gradient(f,x,y) = ForwardDiff.gradient(f,[x,y])
G = two_point_gradient.(f,transpose(X),Y) #returns a vector of gradients, where G[i..] = gradient(f,X[i..],Y[i...])

推荐阅读