Question

I am using fminsearch to minimize the error between the covariance at coarse scale and the average of covariance at fine scale by perturbing certain parameters. These are 2 lines of code lines using fminsearch in which I am calling the objective function minimize_me with three arguments which I intend to perturb:

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

The function minimize_me is shown following and it uses couple of more functions inside its body:

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

However, on running the first two lines of code shown earlier, I get this error:

??? Subscripted assignment dimension mismatch.

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

Can someone point what's wrong? Thanks!

Was it helpful?

Solution

The problem is, you don't provide enough for anyone to test your code.

So you should...

  • Learn to use the debugger! A good idea in any circumstance. This will help you discover what you have done wrong, but also teach you to use a valuable tool.

  • Test your function once with the starting values. What does it return? Have you tried this? Always do this test. Verify that your objective does what you expect it to do.

Fminsearch needs a scalar output to minimize. Does your function give that?

Oh, by the way, it is a terrible idea to define a variable named diff, or anything that already exists as a useful tool in MATLAB. Otherwise, you are just pleading to create difficult to find bugs in your code.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top