使用`Plots.jl`在3D空间中绘制二维函数作为表面。

4

使用Plots.jl绘图时,我遇到了以下问题。我想要绘制Rosenbrock函数。

rosenbrock(x) = (1.0 - x[1])^2 + 100.0 * (x[2] - x[1]^2)^2

作为表面,期望输入一个2D Tuple{Float64,Float64}

我能想到的是以下内容:

using Plots
gr()

rosenbrock(x) = (1.0 - x[1])^2 + 100.0 * (x[2] - x[1]^2)^2

ts = linspace(-1.0, 1.0, 100)
x = ts
y = map(rosenbrock, [(x, z) for (x,z) in zip(ts,ts)])
z = map(rosenbrock, [(x, y) for (x,y) in zip(ts,ts)])
# plot(x, x, z)
plot(x, y, z, st = [:surface, :contourf])

这会产生这样的图表: wrong rosenbrock surface

我认为我弄错了一些维度,但我不知道哪里出了问题。

我是否需要嵌套计算 yx 的映射才能得到结果?


我建议你尝试更清晰地阐述问题,我不知道你想做什么,也不知道问题是什么。 - isebarn
@isebarn 我已经更新了问题。我想将函数绘制成一个曲面,但是我不确定该如何实现。 - swiesend
1个回答

7

对Rosenbrock函数进行了快速调查后,我发现,如果我没记错的话,你需要指定y向量,而不是将其嵌套在z中或类似的地方。

别人也尝试过同样的事情,可以参见这里,但是使用的是Plots库。

解决方法如下,由Patrick Kofod Mogensen完成:

using Plots

function rosenbrock(x::Vector)
  return (1.0 - x[1])^2 + 100.0 * (x[2] - x[1]^2)^2
end

default(size=(600,600), fc=:heat)
x, y = -1.5:0.1:1.5, -1.5:0.1:1.5
z = Surface((x,y)->rosenbrock([x,y]), x, y)
surface(x,y,z, linealpha = 0.3)

这会导致网页上出现enter image description here这张图片。顺便提一下,我很高兴搜索到这个内容,因为我一直在寻找Julia的三维绘图器,除了PyPlot(因为它对我的程序用户来说设置有点麻烦),这个看起来甚至更好,图片可以旋转。

非常感谢!Surface(), surface() 语法使事情变得更加容易。 - swiesend
你使用了哪些后端和颜色属性? - swiesend
1
这看起来(从字体上)像是PyPlot后端。 - David P. Sanders

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