我在创建函数句柄时遇到问题。我想在最小化函数中嵌入最大化函数

时间:2015-04-11 02:27:35

标签: matlab function optimization minimization function-handle

以下代码不起作用,但这是我想要的想法。

        c = @(x)constraints;
        %this is where I would initialize sum as 0 but not sure how...
        for i = 1:length(c)
            sum = @(x)(sum(x) + (min(c(x)(i),0))^2);
        end
        penFunc = @(x)(funcHandle(x) + sig*sum(x));

其中constraints和funcHandle是x的函数。整个代码将迭代一系列sig。

显然c(x)(i)不起作用。我正在尝试编写函数,其中i(c(x)处的c(x)的最小值是一个向量)或者取0然后平方。

我知道我可以计算c(x)然后在每个i处进行分析,但我最终想要将penFunc作为句柄传递给另一个计算penFunc最小值的函数,所以我需要将它作为函数保存。

1 个答案:

答案 0 :(得分:2)

我承认我并不完全理解你想要实现的目标,但是你似乎正在尝试创建一个具有不断变化的值的匿名函数的函数句柄sum你预先计算的。 MATLAB匿名函数允许您这样做。

这里看起来可能与匿名功能有些混淆。首先,行:

c = @(x)constraints;

可能应该是别的东西,除非你真的希望c成为一个函数句柄。当我想你只想调用现有函数@时,行开头的constraints声明了一个新的匿名函数。看来你真的希望c成为来自约束函数的约束数组,在这种情况下我认为你的意思是说

c = constraints(x);

然后我们得到总和,我不能告诉你是否要作为向量或单个总和。首先,我们不要将它命名为“和”,因为它是内置MATLAB函数的名称。我们称之为“总结”。如果它只是一个值,那么它很简单(两种方式都很简单,但是让我们这样做。)在sumval=0;之前的for循环之前启动初始化它,然后循环将是:

sumval = 0;    
for i = 1:length(c)
    sumval = sumval + (min(c(i),0))^2);
end

如果您愿意,可以对所有四行进行矢量化:

c(c>0) = 0; %Replace all positive values with 0
sumval = sum(c.^2);  % Use .^ to do a element by element square.

最后一行显然是你实际处理功能的地方,我还不太清楚这里有什么需要。如果sig是一个函数,那么也许你真的想要:

penFunc = @(x)(funcHandle(x) + sig*sumval);

但我不确定。如果你想将sum作为一个向量,那么我们在这里如何指定它将不起作用。

请注意,让penFunc成为一个带有变量的匿名函数(即sumval)确实很好,但它将继续使用函数句柄声明时存在的sumval值。

所以真正的问题是A)c的创建,我不认为你是一个函数句柄,B)sum的初始化,它应该是sumval(不与MATLAB交互) #39;自己的功能),它可能不应该声明一个新的函数句柄。