【问题标题】:Passing additional arguments through function handle to do optimization in Matlab通过函数句柄传递附加参数以在 Matlab 中进行优化
【发布时间】:2014-06-20 21:41:32
【问题描述】:

我有一个优化函数,比如说 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!

【问题讨论】:

    标签: matlab function optimization cell handle


    【解决方案1】:

    恐怕您实际上并没有提出问题,但这里有一个答案:

    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 上定义一个明确的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多