Как построить векторное поле, где направление в каждой точке (x, y) задается tangent(alpha) = f(x, y)
?
Векторное поле с использованием gnuplot
Ответы:
Насколько я могу судить, gnuplot может отображать векторные поля только при чтении данных из файла. В вашем файле должно быть 4 столбца: x, y, deltax и delta y, а затем gnuplot построит вектор от (x, y) до (x+deltax, y+deltay) для каждой строки в файле:
plot "file.dat" using 1:2:3:4 with vectors head filled lt 2
Если вы не настаиваете на использовании gnuplot, есть другие инструменты, которые могут сделать это лучше или, по крайней мере, проще. Лично я использую asymptote. Пример векторного поля в асимптоте приведен здесь.
Кажется, этот вопрос / ответ немного устарел, и, поскольку я считаю, что gnuplot немного изменился в последних версиях, возможно, ответ следует обновить.
Я нашел хорошее и компактное решение здесь: http://gnuplot.10905.n7.nabble.com/Vector-Fields-td3627.html
который я сообщу для удобства:
set xrange [-5:5]
set yrange [-5:5]
# only integer x-cordinates
set samples 11
# only integer y-cordinates
set isosamples 11
# we need data, so we use the special filename "++", which
# produces x,y-pairs
plot "++" using 1:2:1:(2.*$2) with vectors
Здесь исходный вопрос заключался в том, как построить векторное поле F(x,y) = <x, 2y>
. Хитрость заключается в графике "++", который представляет собой специальное имя файла, позволяющее использовать функции в спецификаторе using
.
Итак, как сказал @Jan в своем ответе, gnuplot требуется 4 поля в файле данных для построения векторного поля, но здесь поля являются синтетическими и создаются с помощью двух функций.
Эквивалентная формулировка с использованием определенных функций может быть следующей:
set xrange [-5:5]
set yrange [-5:5]
dx(x) = x
dy(x) = 2*x
plot "++" using 1:2:(dx($1)):(dy($2)) w vec
Подробнее см. help special-filenames
.
HIH