Matlab:将多输入匿名函数转换为单个输入

时间:2014-07-10 16:55:50

标签: matlab anonymous-function

假设我有一个带有输入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;

现在,让我们说我希望我拥有配置的值,而我只是一个匿名函数。

所以,我会:

obj_fun_2 = @(v)...

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

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

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

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

我不知道这是不是你想要的,但我的回答是:

用于定义为

的匿名函数
test = @(a,v) 2*v

你可以不用a这样打电话给它

test([],3)

但是,如果您有test = @(a,v) a*v,则无效。

答案 2 :(得分:0)

过去,我已完成以下操作,以使用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,它是几个输入的函数,我可以将它传递给{ {1}}。