Как построить векторное поле в Юлии?
Я хочу построить векторное поле в Юлии. Я не мог найти пример здесь. Здесь есть несколько примеров использования plotly
Однако они не работают для меня. Я хотел бы построить векторное поле plotlyjs
или же plotly
,
Вот пример кода в Юлии:
using Plots
pyplot()
x = collect(linspace(0,10,100));
X = repmat(x,1,length(x));
Y = repmat(x',length(x),1);
U = cos.(X.*Y);
V = sin.(X.*Y);
streamplot(X,Y,U,V)
Вот пример Matlab:
[x,y] = meshgrid(0:0.2:2,0:0.2:2);
u = cos(x).*y;
v = sin(x).*y;
figure
quiver(x,y,u,v)
1 ответ
Краткий ответ: используйте quiver
с Plots.jl.
quiver(x, y, quiver=(u, v))
Далее я попытаюсь полностью воссоздать пример, который вы показали в Matlab.
Сначала мы импортируем Plots
и включить plotly
бэкенд.
using Plots
plotly()
Нам нужно определить функцию, аналогичную Matlab's meshgrid
, Поскольку графики будут работать с нашими массивами точек независимо от их размерности, я решил просто использовать repeat
и использовать "сплющенные" выходы.
meshgrid(x, y) = (repeat(x, outer=length(y)), repeat(y, inner=length(x)))
Теперь мы можем создать x
, y
, u
, а также v
используя ту же логику, что и код Matlab. Для краткости мы можем использовать @.
макрос для векторизации всех вызовов в данном выражении.
x, y = meshgrid(0:0.2:2, 0:0.2:2)
u = @. cos(x) * y
v = @. sin(x) * y
Отсюда мы можем просто использовать quiver
функция из участков, проходящих u
а также v
как 2-кортеж к аргументу ключевого слова quiver
,
quiver(x, y, quiver=(u, v))
Результат близок к выводу Matlab, но кажется, что Plots.jl масштабирует стрелки так, чтобы они были длиннее, чем в Matlab. Это легко исправить, хотя; мы можем просто транслировать-умножать u
а также v
по постоянной шкалы.
scale = 0.2
u = @. scale * cos(x) * y
v = @. scale * sin(x) * y