通过函数句柄传递其他参数以在Matlab中进行优化

时间:2014-06-20 21:41:33

标签: matlab function optimization cell handle

我有一个优化的函数,比如f,在matlab中,函数依赖于我想要优化的变量x =(x(1),x(2))和两个不需要的参数n和c要优化,换句话说,我有一个n和c的值矩阵,我想找到每个n和c的最佳x值。 这是我的代码:

clear all;
clc;
close all;
f=@(x,n,c)n*x(1)+(x(2)+3*c)/(x(1)+c);
for n=1:10
    for c=1:20
        x=zeros(length(n),length(c));
        fun{n,c}=@(x)f(x,n,c);
        options=optimset('Algorithm','interior-point')
        x(n,c)=fmincon(fun{n,c},[0;0],[1 0;-1 0;0 1;0 -1],[40;0;40;0],[],[],[],[],[],options);
    end
end

??? Subscripted assignment dimension mismatch.

Error in ==> forloop2 at 10
        x(n,c)=fmincon(fun{n,c},[0;0],[1 0;-1 0;0 1;0
        -1],[40;0;40;0],[],[],[],[],[],options); 
Any helps? Thank you so much!

1 个答案:

答案 0 :(得分:0)

我担心你实际上没有提出问题,但这是一个答案:

function myOptimization
clear all;
clc;
close all;

results=cell(10,20);
for n=1:10
    for c=1:20
        options=optimset('Algorithm','interior-point');
        fmincon(@(x)fun(x,n,c),[0;0],[1 0;-1 0;0 1;0 -1],[40;0;40;0],[],[],[],[],[],options);
        resultingCoordinates=fmincon(@(x)fun(x,n,c),[0;0],[1 0;-1 0;0 1;0 -1],[40;0;40;0],[],[],[],[],[],options);
        results{n,c}=resultingCoordinates;
    end
end
results
end

function f=fun(x,n,c)
f=n*x(1)+(x(2)+3*c)/(x(1)+c);
end

您在原始代码中至少犯了3个错误。

首先,x(n,c)= fmincon ...不起作用,因为fmincon返回一个以最佳坐标作为第一个输出参数的向量。因此,您试图将矢量分配给矩阵中的单个位置" x",这是您的错误的来源。我将最佳坐标放在单元格数组中,以便我可以存储所有输出坐标。如果你想要最佳的" f值"要作为矩阵分配给您的结果,您可以使用[〜,f(n,c)] = fmincon ...。

第二," x"即使您想保存坐标,输出矩阵也是一个非常糟糕的名称。它甚至可能会导致错误,因为它用于表示目标函数的输入,而不是最佳坐标。使用不同的名称来表示最佳坐标或最佳函数值,这反映出这些是结果。

第三,每次更改参数时,都不需要不断重新分配输出矩阵/单元阵列。你基本上试图清除每次迭代的结果,如果你想保存它们就行不通。

我还将你的目标函数拆分为一个函数,并将该函数的优化分解为另一个函数。

我希望这会有所帮助。将来,请尝试在Stack Overflow上定义一个明确的问题。