【问题标题】:Error while using fminsearch使用 fminsearch 时出错
【发布时间】:2014-05-12 20:18:48
【问题描述】:

我正在使用fminsearch 通过扰动某些参数来最小化粗尺度协方差与细尺度协方差平均值之间的误差。这些是使用 fminsearch 的 2 行代码行,我在其中调用目标函数 minimize_me 并带有三个我打算扰乱的参数:

opts = optimset('display', 'iter');
[x,fval,exitflag] = fminsearch( @(x) minimize_me(x(1), x(2), x(3)), [2, 5, 90], opts);

minimize_me 函数如下所示,它在其体内使用了更多函数:

function diff = minimize_me(a_minor, a_major, theta)

%# Grid and model parameters
nModel=50;
nModel_want=1;
nI_grid1=5;
Nth=1;
nRow.Scale1=5;
nCol.Scale1=5;
nRow.Scale2=5^2;
nCol.Scale2=5^2;
nCell.Scale1=nRow.Scale1*nCol.Scale1;

%% Covariance computation, averaging and difference of coarse and fine scale averaged covariances

% Reading files by using the function 'general_gslib_file_to_mat.mat'
[Deff_matrix_NthModel,~,~]=general_gslib_file_to_mat(nModel,nCell.Scale1,nModel_want,nI_grid1,Nth,'effective_dispersivity_coarsegrid5x5_gslib_format');

%# Maximum value of covariance/variogram at coarse scale
sill = var(reshape(Deff_matrix_NthModel,nCell.Scale1,1)); % variance of the coarse data matrix of size (nRow.Scale1 X nCol.Scale1)

%% Compute the covariance at different lags using the function general_CovModel.m

for ihRow = 1:nRow.Scale1
    for ihCol = 1:nCol.Scale1
        [cov.Scale1(ihRow,ihCol),heff.Scale1(ihRow,ihCol)] = general_CovModel(theta, ihCol, ihRow, a_minor, a_major, sill, 'Exp');
    end
end

for ihRow = 1:nRow.Scale2
    for ihCol = 1:nCol.Scale2
        [cov.Scale2(ihRow,ihCol),heff.Scale2(ihRow,ihCol)] = general_CovModel(theta, ihCol/(nCol.Scale2/nCol.Scale1), ihRow/(nRow.Scale2/nRow.Scale1), a_minor, a_major,...
            sill/(nRow.Scale2*nCol.Scale2), 'Exp');
    end
end

%# Scale-up of fine scale values by averaging which is done using the function general_AverageProperty.m
[covAvg.Scale2,var_covAvg.Scale2,varNorm_covAvg.Scale2] = general_AverageProperty(nRow.Scale2/nRow.Scale1,nCol.Scale2/nCol.Scale1,1,nRow.Scale1,nCol.Scale1,1,cov.Scale2,1);

%# Difference between the coarse scaled covariance and average of fine scale covariance
diff = (covAvg.Scale2 - cov.Scale1)^2;
end

但是,在运行前面显示的前两行代码时,我收到了这个错误:

??? Subscripted assignment dimension mismatch.

Error in ==> fminsearch at 195
fv(:,1) = funfcn(x,varargin{:});

有人能指出什么问题吗?谢谢!

【问题讨论】:

    标签: matlab optimization runtime-error fminsearch


    【解决方案1】:

    问题是,您没有提供足够的资源让任何人测试您的代码。

    所以你应该...

    • 学习使用调试器!在任何情况下都是一个好主意。这将帮助您发现自己做错了什么,同时也教您使用有价值的工具。

    • 使用起始值测试您的函数一次。它返回什么?你试过这个吗?总是做这个测试。验证您的目标是否符合您的预期。

    Fminsearch 需要一个标量输出来最小化。你的函数能做到吗?

    哦,顺便说一句,定义一个名为 diff 的变量或任何作为 MATLAB 中已经存在的有用工具的变量是一个糟糕的主意。否则,您只是恳求在您的代码中创建难以发现的错误。

    【讨论】:

    • 我错过了fminsearch 的标准,上面写着fminsearch 找到标量函数的最小值。这有助于运行代码。谢谢!
    • @S_H - 非标量函数很难“最小化”。这些通常被称为多标准优化,但我并不肯定这就是你正在尝试做的事情。如果您确实有多个要最小化的输出,则需要将其转换为标量函数。通常使用项的平方和,或者您可以对项进行线性组合,使总和最小化。
    • @woodchips:确实,我采用了我想要最小化的矩阵的norm。但是,我没有得到令人满意的优化解决方案。具有讽刺意味的是,我使用 L-2 范数得到的 min f(x) = 0.282556 给出的预测比使用 L-1 范数得到的 min f(x) = 0.257489 更接近数据。
    • 我认为你的问题是你试图最小化矩阵的范数,但你的真正目标与此不同,你知道它何时失败。这意味着您没有提供正确的目标函数来捕获您想要做的事情。我不确定您要最小化的矩阵是什么。如果这是一组您正在接受规范的残差,那可能只是意味着需要不等权重的问题。或者您可能需要转换问题,可能需要记录数据(对于比例误差很有用。)
    • 我尝试了两种技术:加权矩阵和数据的对数,但是,它们似乎都没有改善结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多