Как построить векторное поле в Юлии?

Я хочу построить векторное поле в Юлии. Я не мог найти пример здесь. Здесь есть несколько примеров использования 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

Окончательный сюжет

Другие вопросы по тегам