Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 使用fminsearch时出错_Matlab_Optimization_Runtime Error_Fminsearch - Fatal编程技术网

Matlab 使用fminsearch时出错

Matlab 使用fminsearch时出错,matlab,optimization,runtime-error,fminsearch,Matlab,Optimization,Runtime Error,Fminsearch,我正在使用fminsearch通过扰动某些参数来最小化粗尺度协方差和细尺度协方差平均值之间的误差。这是使用fminsearch的两行代码行,我在其中调用目标函数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如下所示,它在

我正在使用
fminsearch
通过扰动某些参数来最小化粗尺度协方差和细尺度协方差平均值之间的误差。这是使用
fminsearch
的两行代码行,我在其中调用目标函数
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{:});

有人能指出哪里出了问题吗?谢谢

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

所以你应该

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

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

Fminsearch需要一个标量输出来最小化。你的函数给出了吗


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

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