如何在Julia上绘制向量场?

6
我是一名有用的助手,可以为您翻译文本。以下是需要翻译的内容:

我对Julia不太熟悉,尝试使用以下帖子的代码如何在Julia中绘制向量场?,但是没有成功,所以我想知道是否可以使用“Plots”包进行绘图,如何操作?这对我的研究非常重要。

P.s.:有人给了我下面的代码,但是我不知道为什么它无法工作:

using Plots
gr(size=(600,400))

function example()
  X = linspace(-2, 2, 100)
  Y = linspace(-2, 2, 100)
  f(x, y) = x^3 - 3x + y^2
  contour(X, Y, f)

  x = linspace(-2, 2, 11)
  y = linspace(-2, 2, 11)
  df(x, y) = [3x^2 - 3; 2y] / 25
  quiver!(x, y', quiver=df, c=:blue)

  xlims!(-2, 2)
  ylims!(-2, 2)
  png("example")
end

example()

这个之前的SO帖子有帮助吗? - rickhg12hs
顺带一提,如果您能更详细地描述“不起作用”的情况会很有帮助。例如,是否出现错误信息(请将其显示出来),图表看起来不对,没有图表等等。 - rickhg12hs
我们需要更多的信息。例如,如果您使用的是Julia 1.0版本,则会出现错误,因为linspace不再存在(现在应该使用range),这与绘图完全无关。 - carstenbauer
3个回答

12

正如评论中已经提到的那样,您应该提供错误消息,否则人们就必须猜测代码出了什么问题。

但是,在您的情况下,我认为我可以猜出来:)

在Julia 1.0上,以下内容有效:

using Plots
gr(size=(600,400))

function example()
  X = range(-2, stop=2, length=100)
  Y = range(-2, stop=2, length=100)
  f(x, y) = x^3 - 3x + y^2
  contour(X, Y, f)

  x = range(-2, stop=2, length=11)
  y = range(-2, stop=2, length=11)
  df(x, y) = [3x^2 - 3; 2y] / 25
  quiver!(x, y', quiver=df, c=:blue)

  xlims!(-2, 2)
  ylims!(-2, 2)
  png("example")
end

example()

并输出以下结果

enter image description here

请注意,我只将所有的 linspace 更改为 range(-2, stop=2, length=X),因为在 Julia 0.7 中,linspace 函数已经被弃用

谢谢你的出色回答!我一直在尝试复制你的示例(为了优化自己的矢量场绘图函数),但它在Julia 1.5.3上无法工作(quiver()期望每列的y包含11行)。我不确定Julia在你回答和现在之间经历了什么发展——当你发布这篇文章时,Plots是否不再广播输入数据?我很想让你优雅的解决方案再次起作用。谢谢! - Chris Brendel

4

对于Plots v1.10.4,您需要为每个箭头提供起始位置。

# same code as in above answer
quiver!(repeat(x,11), vec(repeat(y',11)), quiver=df, c=:blue)

3

更新答案至Julia 1.6.3版本,

辅助函数来源:如何在Julia中绘制矢量场?

using Plots
gr(size=(600,400))

meshgrid(x, y) = (repeat(x, outer=length(y)), repeat(y, inner=length(x))) # helper function to create a quiver grid.

function example()
  X = range(-2, stop=2, length=100)
  Y = range(-2, stop=2, length=100)
  f(x, y) = x^3 - 3x + y^2
  Plots.contour(X, Y, f)

  xs,ys = meshgrid(range(-2, stop=2, length=11), range(-2,stop=2,length=11))
  df(x, y) = [3x^2 - 3; 2y] / 25
  quiver!(xs, ys, quiver=df, c=:blue)

  xlims!(-2, 2)
  ylims!(-2, 2)
  png("example")
end

example()

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接