【问题标题】:Function and surface plot Julia函数和曲面图 Julia
【发布时间】:2020-10-23 13:20:49
【问题描述】:

我想在 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

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

最好的

丹尼尔

【问题讨论】:

  • 您的f(x,y) 是一个合适的功能,只是它适合一行。在您的Utility 函数中(顺便说一句,建议对函数使用小写字母),您的参数是x1x2 而不是xy,并且您不应该广播乘法(使用@ 987654329@ 而不是 .*) 让你的阴谋工作。

标签: function plot julia surface


【解决方案1】:

我认为 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 而不是 @987654329 @。

这通常会引发未定义变量错误,除了在您发布的代码 sn-p 中,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 指出的两个示例之间的第二个区别)再次困扰您:调用该函数同时依赖它使用全局变量 @987654334 @ 会在不广播的情况下立即出错(因为你不能对范围求幂):

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 抱怨的 - 它不知道如何绘制一个数组,而它期望只是绘制单个数据点。

【讨论】:

  • 谢谢,我让代码运行起来了。但是,为了完整起见:为什么这个函数不返回任何输出? a = 0:0.1:4; b = 0:0.1:4; f(x,y) = x^0.2 * y^0.8; f(a,b) ?
  • 为我运行 sn-p 错误,原因与上面的 u2 示例中所示的相同 - 如果 a 是一个范围(即 StepRangeLen 类型的对象),并且你尝试做a^0.2,这将不起作用,因为没有为范围定义求幂。如果要对范围内的每个元素求幂,则需要广播 ^ 运算符:a .^ 0.2
猜你喜欢
  • 1970-01-01
  • 2021-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-20
  • 1970-01-01
  • 1970-01-01
  • 2017-02-20
相关资源
最近更新 更多