Проблема с объединением ForwardDiff и PyPlot в Julia 1.0.5 - PullRequest
1 голос
/ 31 января 2020

В 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, так как для нее нужны значения f на 2D-сетке .

Нужно ли мне определять совершенно другое f(x::Vector{<:Real}, y::Vector{<:Real}), чтобы можно было строить контур так, как мне хотелось бы, или есть альтернатива, где я могу избежать этого?

1 Ответ

2 голосов
/ 31 января 2020

эта проблема может быть решена с помощью множественной диспетчеризации:

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...])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...