1

以下代码不起作用,但这是我试图达到的想法。

        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));

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

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

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

4

1 回答 1

2

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

看来这里的匿名函数可能有些混淆。首先,该行:

c = @(x)constraints;

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

c = constraints(x);

然后我们得到总和,我不知道你想要作为一个向量还是一个单一的总和。首先,我们不要将其命名为“sum”,因为这是内置 MATLAB 函数的名称。让我们称之为“sumval”。如果它只是一个值,那么很容易(两种方式都很容易,但让我们这样做。)在 for 循环之前开始sumval=0;初始化它,那么循环将是:

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自己的函数交互),和这可能不应该声明一个新的函数句柄。

于 2015-04-14T01:33:04.510 回答