gpt4 book ai didi

julia - 在 Julia 中将公式作为函数参数传递

转载 作者:行者123 更新时间:2023-12-04 16:33:20 25 4
gpt4 key购买 nike

我正在尝试创建一个允许更改 Julia 中的公式和系数的函数。我 80% 确定我应该为此使用匿名函数?

这篇使用 python 的 SO 帖子是我试图完成的一个更离散的例子(特别是 chepner 的基本 python 示例,而不是使用库)。 Pass a formula as a function parameter in python

我还使用 Julia 发现了这篇 SO 帖子,它使用一种类型来存储所需的参数,然后将它们传递给一个函数。 How to pass parameter list to a function in Julia

使用这些作为基础,这是我迄今为止创建的内容:

   #Create composite type
type Params
formula
b1::Float64
b2::Float64
end

#create instance of type and load
foo=Params((b1,b2,X)-> X^b1+X+b2,0.004,0.005)

#create function
function DoMath(X,p::Params)
p.formula(X,varargs...) #??
end
  • 关于如何使用复合类型和/或 lambda 来构建它,我是否走在正确的轨道上?我没有接受过任何 CS 培训,并且在尝试学习 Julia 的过程中,我在许多概念上混为一谈。
  • 允许用户更改公式和任何系数的函数的正确语法是什么。对于给定的 X?最终,我正在想象具有以下功能的东西:
    DoMath(4) #some default formula with changing X
    DoMath(4, X*b1 +X*b2) #change X and change formula
    DoMath(4, (X,b1,b2,b3)->X*b1+X*b2+x*b3) # change x, change formula to a 3 parameter function

  • 谢谢

    更新:
    我按照@Chris 的语法让它工作。我不得不修补的一件事是使用
       (p::Params)(x) = p.formula(x,p.b) #p.b, not just b otherwise error

    我不得不在调用之前将 2.0 和 3.0 包装在一个数组中
       p = Params((x,b)->x*b[1]+b[2],[2.0,3.0])

    最佳答案

    这个想法是构建一个可调用的类型。可调用类型是具有“调用”的任何类型。一个函数f是一个可调用类型,因为你可以调用它:f(x)例如。然而,函数并不是唯一可以像函数一样工作的东西。事实上,在 Julia 中,函数基本上是可调用类型,<: Function .

    因此,让我们为您的示例构建一个。使您的类型包含您想要的数据:

    type Params
    b1::Float64
    b2::Float64
    end

    现在让我们添加一个对 Params 的调用.假设我们想做 x*b1 + b2 .我们可以通过以下方式进行调用:
    (p::Params)(x) = x*p.b1 + p.b2

    让我们看看这是如何工作的。做一个参数:
    p = Params(2.0,3.0)

    现在我们可以使用它的调用来计算公式:
    p(4) # 4*2+3 = 11

    现在看到 p充当使用内部数据的函数。就是这个。

    其余的都是建立在同一个基础上的。您需要尊重 Julia 类型不是动态的这一事实。这是有充分理由的。但是,假设您不知道您想要多少个 b。然后你可以让一个字段是 b 的数组的:
    type Params
    b::Vector{Float64}
    end
    (p::Params)(x) = x*b[1] + b[2]

    现在假设您希望能够修改公式。然后你可以有一个公式字段:
    type Params
    formula
    b::Vector{Float64}
    end

    并使调用将值抛出:
    (p::Params)(x) = p.formula(x,b)

    现在,如果用户做了:
    p = Params((x,b)->x*b[1]+b[2],2.0,3.0)

    然后,和以前一样:
    p(4) # 4*2+3 = 11

    是的,它的行为相同,并且仍然使用内部数据。

    但由于 p只是任何 ol' 类型,我们可以修改字段。所以这里我们可以修改:
    p.formula = (x,b)-> x*b[1]+x*b[2]+b[3]
    push!(p.b,2.0) # p.b == [2.0,3.0,2.0]

    并再次调用,现在使用更新的字段:
    p(4) # 4*2 + 4*3 + 2 = 22

    事实上,正如@LyndonWhite 指出的那样, ParameterizedFunctions.jl 实现了这样的东西。这样做的策略是可调用类型。

    额外的细节

    某些库的构建(错误地)要求用户传入一个函数。所以这里我们有一个 p这“就像一个函数”,但有些图书馆不会接受它。

    但是,有一个快速解决方法。做它 <:Function .例子:
    type Params <: Function
    b1::Float64
    b2::Float64
    end

    现在需要函数的东西会占用你的 p因为它是 <:Function .这只是在 Julia 中指出的一种方式, Function是一个抽象类型,每个 function只是一个子类型 Function 的可调用类型.

    关于julia - 在 Julia 中将公式作为函数参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43012194/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com