功能和曲面图Julia

问题描述

我想在Julia中使用Surface绘制函数。我设法绘制了所需的功能

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的评论确实应该是答案,但让我扩大一点。

首先,内联函数定义与多行函数定义没有什么不同(请参阅文档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)

但是,对于广播,此幂运算有效并返回整个范围,并且范围的每个元素都被幂运算。因此,您的函数返回一个数组,而不是一个数字(如您在我对u(2.0,0.0)的调用中所见)。这就是Plots所抱怨的-它不知道如何绘制数组,何时期望只是绘制一个数据点。