【问题标题】:Matlab: Turning a multiple input anonymous function into a single inputMatlab:将多输入匿名函数转换为单输入
【发布时间】:2014-07-10 16:55:49
【问题描述】:

假设我有一个匿名函数,输入为 v 和 config:

obj_fun = @(v, config) config.dt*(config.e_w*(v(1)^2 + v(2)^2 + config.e_s))*config.m + 2*sqrt((config.G(1)^2 - config.p(1) - config.dt*v(1))^2 + (config.G(2) - config.p(2) -config.dt*v(2))^2)*sqrt(config.e_w*config.e_s)*config.m;

现在,假设我想拥有 config 的值,而我只是一个关于 v 的匿名函数。

所以,我会:

obj_fun_2 = @(v)...

我该怎么做。这背后的主要动机是我想使用函数 fmincon,但似乎 fmincon 仅在您的匿名函数只有一个输入时才有效。我该如何解决这个问题?我记得以前看过这个。我该如何解决这个问题。

所以,我想要类似的东西,

fmincon(obj_fun(..., config),guess, A,B).

其中guess 是算法最初开始的位置,A 和B 是约束的参数。我只是想要这个的一些变体。

【问题讨论】:

    标签: matlab anonymous-function


    【解决方案1】:

    如果你有一个匿名函数obj_fun = @(v, config),它有两个参数和一个名为config_value 的已知值,你可以编写一个只有第一个值的新匿名函数:

    obj_fun2 = @(v) obj_fun(v, config_value);
    

    【讨论】:

    • 我想我尝试过这样做,但它会导致一些错误。我的匿名函数不会读取 config_value 的字段之一。我确实设法解决了这个问题,我会尽快向您展示。
    【解决方案2】:

    我不知道这是否是你想要的,但这里是我的答案:

    对于定义为的匿名函数

    test = @(a,v) 2*v
    

    你可以像这样不a调用它

    test([],3)
    

    但是,如果你有test = @(a,v) a*v,它就不起作用了。

    【讨论】:

      【解决方案3】:

      过去,我使用ode45 的函数进行了以下操作,这些函数需要超过允许的xt 输入。我不知道相同的方法是否适用于匿名函数,但我希望如果您将函数保存在新文件中它会起作用。我会根据你的例子调整这里的方法。

      首先,将您的函数保存在一个新文件 myfunc.m 中,并带有顶行:

      function val = myfunc(v, config);
      % your function here, returning "val"
      

      接下来,在您的调用 m 文件中,将您的函数包装在一个句柄中,该句柄基本上将其伪装成 v 的函数:

      h = @(v)myfunc(v, config);  % you might need to put "guess" in place of "v" here
      

      config 在调用 m 文件中定义。最后,将这个句柄代替函数传递给fmincon

      fmincon(h, guess, A, B);
      

      我不认为你提供了我测试它所需的一切,但正如我所说,我过去曾使用这种方法来包装一个 ODE,它是多个输入的函数,我可以将它传递给 @ 987654331@.

      【讨论】:

        猜你喜欢
        • 2018-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-12
        • 2018-06-21
        相关资源
        最近更新 更多