Когда использовать транспозицию для построения контура в Юлии - PullRequest
2 голосов
/ 24 сентября 2019

Таким образом, я попытался построить контур в Джулии, интерполируя 2D-функцию, используя следующий код:

using Interpolations
using Plots
gr()

xs = 1:0.5:5
ys = 1:0.5:8
# The function to be plotted
f(x, y) = (3x + y ^ 2)
g = Float64[f(x,y) for x in xs, y in ys]

# Interpolate the function
g_int = interpolate(g, BSpline(Quadratic(Line(OnCell()))))

# Scale the interpolated function to the correct grid 
gs_int = scale(g_int, xs, ys)

xc = 1:0.1:5
yc = 1:0.1:5

# Compare the real value and the interpolated value of the function at an arbitrary point
println("gs_int(3.2, 3.2) = ", gs_int(3.2, 3.2))
println("f(3.2, 3.2) = ", f(3.2, 3.2))

# Contour of the interpolated plot
p1 = contour(xs, ys, gs_int(xs, ys), fill=true)
# Real contour of the function
p2 = contour(xc, yc, f, fill=true)

plot(p1, p2)

И это, очевидно, не дало правильный контур, хотя интерполяция, казалось бы, была правильной:

a

Проблема была решена путем транспонирования gs_int(xs, ys):

p1 = contour(xs, ys, gs_int(xs, ys)', fill=true)

Затем я случайно сгенерировал некоторые точки в 2D-пространстве,и повторил те же процедуры:

using DelimitedFiles
using Interpolations
using Plots
gr()

data = readdlm("./random_points.txt", Float64)

# Create a dictionary to test different orders of interpolations. 
inter = Dict("constant" => BSpline(Constant()), 
    "linear" => BSpline(Linear()), 
    "quadratic" => BSpline(Quadratic(Line(OnCell()))),
    "cubic" => BSpline(Cubic(Line(OnCell())))
)

x = range(-10, length=64, stop=10)
y = range(-10, length=64, stop=10)

v_unscaled = interpolate(data, inter["cubic"])
v = scale(v_unscaled, x, y)

# The contour of the data points
p0 = contour(x, y, data, fill=true)
display(p0)

# The contour of the interpolated function
p_int = contour(x, y, v(x,y)', fill=true)
display(p_int)

Однако два контурных графика не выглядят одинаково.

b

Когда я удалил апостроф после v(x,y), это сработало:

p_int = contour(x, y, v(x,y), fill=true)

c

Теперь я не понимаю.Когда мне следует применять транспонирование, а когда - нет?

1 Ответ

4 голосов
/ 24 сентября 2019

Это потому, что в первом примере вы строите функцию, а во втором - два массива.Два массива не нужно транспонировать, поскольку они ориентированы одинаково.Но в первом примере способ, которым вы генерируете массив, транспонируется относительно способа, которым Plots генерирует массив из передаваемой вами 2-й функции.

Когда вы строите график функции, Plots вычисляет результат как g = Float64[f(x,y) for y in ys, x in xs], а не наоборот, как вы делали в своем коде.Для хорошего обсуждения транспонирования в заговоре, снова обратитесь к https://github.com/JuliaPlots/Makie.jl/issues/205

...