Function 函数与曲面图

Function 函数与曲面图,function,plot,julia,surface,Function,Plot,Julia,Surface,我想用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

我想用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
但不幸的是,它不起作用。有人能帮我吗

最好的


丹尼尔

我认为贝诺伊特的评论确实应该是答案,但让我再详细说明一下

首先,内联函数定义与多行函数定义没有任何区别(参见文档中的前两个示例)。因此,

utility(x, y) = x^0.2 * y^0.8
将为您提供一个与

function utility(x, y)
    x^0.2 * y^0.8
end
但是,您的
实用程序
函数实际上与
f
函数不同-您使用参数
x1
x2
定义它,但在函数体中使用的是
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
...
这也是您在
实用程序
函数中引入广播(Benoit指出的两个示例之间的第二个区别)的原因:调用函数时依赖它使用全局变量
y
,如果不进行广播,将立即出错(因为不能对范围进行指数化):


但是,对于广播,这种求幂运算可以工作并返回整个范围,范围中的每个元素都会求幂。因此,您的函数返回一个数组,而不是一个数字(正如我在上面对
u(2.0,0.0)的调用中所看到的)
。这就是Plots抱怨的地方——它不知道如何绘制数组,而它只需要绘制一个数据点。

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

首先,内联函数定义与多行函数定义没有任何区别(参见文档中的前两个示例)

utility(x, y) = x^0.2 * y^0.8
将为您提供一个与

function utility(x, y)
    x^0.2 * y^0.8
end
但是,您的
实用程序
函数实际上与
f
函数不同-您使用参数
x1
x2
定义它,但在函数体中使用的是
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
...
这也是您在
实用程序
函数中引入广播(Benoit指出的两个示例之间的第二个区别)的原因:调用函数时依赖它使用全局变量
y
,如果不进行广播,将立即出错(因为不能对范围进行指数化):


但是,对于广播,这种求幂运算可以工作并返回整个范围,范围中的每个元素都会求幂。因此,您的函数返回一个数组,而不是一个数字(正如我在上面对
u(2.0,0.0)的调用中所看到的)
。这就是Plots抱怨的地方-它不知道如何绘制数组,而它只希望绘制单个数据点。

您的
f(x,y)
是一个合适的函数,只是它适合一行。在
实用程序中
函数(顺便说一句,建议函数使用小写),您的参数是
x1
x2
而不是
x
y
,并且您不应该广播乘法(使用
*
而不是
*
)以使绘图工作。您的
f(x,y)
是一个正确的函数,只是它适合于一行。在
实用程序中
函数(顺便说一句,建议函数使用小写),您的参数是
x1
x2
,而不是
x
y
,并且您不应该广播乘法(使用
*
而不是
*
)为了让你的绘图工作。谢谢,我运行了代码。但是,为了完整起见:为什么这个函数不返回任何输出?
a=0:0.1:4;b=0:0.1:4;f(x,y)=x^0.2*y^0.8;f(a,b)
?为我运行该代码段错误,原因与上面我的
u2
示例中所示的相同-如果
a
是一个范围(即
StepRangeLen
类型的对象),然后您尝试执行
a^0.2
,这将不起作用,因为没有为某个范围定义求幂运算。如果要对该范围内的每个元素求幂,则需要广播
^
运算符:
a.^0.2
谢谢,我已运行了代码。但是,为了完整性起见:为什么此函数不返回任何输出ut?
a=0:0.1:4;b=0:0.1:4;f(x,y)=x^0.2*y^0.8;f(a,b)
?为我运行该代码段错误,原因与上面的
u2
示例中所示的相同-如果
a
是一个范围(即
StepRangeLen
类型的对象),而您尝试执行
a^0.2
,这将不起作用,因为没有为某个范围定义求幂运算。如果要对该范围内的每个元素求幂,则需要广播
^
运算符:
a.^0.2