函数和曲面图 Julia

Function and surface plot Julia

我想在 Julia 中使用曲面绘制一个函数。我设法绘制了所需的函数:

x = 0:0.1:4
y = 0:0.1:4
f(x,y) = x^0.2 * y^0.8
surface(x, y, f, camera=(10,30),linealpha=0.3, fc=:heat)

但是,我希望 f(*) 是一个适当的函数,我也可以对其进行优化(例如经济学中的效用最大化)。这是我的尝试:

function Utility(x1, x2)
    u= x.^0.2 .* y.^0.8
    return u
end

但不幸的是,它不起作用。有人可以帮助我吗?

最佳

丹尼尔

我认为 Benoit 的评论确实应该是答案,但让我稍微扩展一下。

首先,内联函数定义与 multi-line 函数定义没有任何区别(请参阅文档 here 中的前两个示例)。因此,做

utility(x, y) = x^0.2 * y^0.8

将为您提供与

完全相同的功能
function utility(x, y)
    x^0.2 * y^0.8
end

但是,您的 Utility 函数实际上不同于您的 f 函数 - 您使用参数 x1x2 定义它,但在函数体中您使用的是 y 而不是 x2.

这通常会引发未定义的变量错误,除了在您发布的代码片段中,y 已经在全局范围内定义为范围 0:0.1:4,因此该函数将使用此:

julia> y = 0:0.1:4
0.0:0.1:4.0

julia> u(x1, x2) = x1 .^ 0.2 * y .^ 0.8
u (generic function with 1 method)

julia> u(2.0, 0.0)
41-element Array{Float64,1}:
 0.0
 0.18205642030260805
 0.3169786384922227
...

这也是您在 Utility 函数中引入广播的地方(正如 Benoit 指出的,您的两个示例之间的第二个区别)再次困扰您:调用该函数,同时依赖它来使用全局变量 y 会在没有广播的情况下立即出错(因为你不能对范围取幂):

julia> u2(x1, x2) = x1^0.2 * y^0.8
u2 (generic function with 1 method)

julia> u2(2.0, 0.0)
ERROR: MethodError: no method matching ^(::StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}}, ::Float64)

然而,对于广播,这种取幂有效并且 returns 整个范围,范围中的每个元素都被取幂。因此,你的函数 returns 是一个数组而不是一个数字(正如你在上面我对 u(2.0, 0.0) 的调用中看到的那样)。这就是 Plots 所抱怨的——它不知道如何绘制一个数组,当它期望只绘制一个数据点时。