1

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!

Stewie Griffin
  • 14,889
  • 11
  • 39
  • 70

1 Answers1

3

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.

  • I missed the criterion for `fminsearch` where it says `fminsearch` **finds the minimum of a scalar function**. That helped in running the code. Thanks! –  Nov 18 '12 at 19:36
  • @S_H - non-scalar functions are difficult to "minimize". These are often called multi-criteria optimizations, but I'm not positive that is what you are trying to do anyway. If you do have more than one output that you wanted to minimize, then you need to turn it into a scalar function. A sum of squares of the terms is often used, or you can take a linear combination of the terms, minimizing the sum. –  Nov 18 '12 at 22:05
  • @ woodchips: Indeed, I took `norm` of the matrix I wanted to minimize. However, I am not getting the optimized solution to the degree which is satisfying. Ironically, `min f(x) = 0.282556` which I get with L-2 norm gives a prediction which is closer to the data than with `min f(x) = 0.257489` which I get with L-1 norm. –  Nov 18 '12 at 22:30
  • I think your problem is that you are trying to minimize the norm of a matrix, but your real goal is distinct from that, and you know when it fails. This means you have not provided the correct objective function that will capture what you want to do. I'm not sure what matrix is that you are minimizing. If this is a set of residuals that you are taking the norm of, that may just mean a problem with a need for unequal weights. Or you may need to transform the problem, perhaps taking the log of the data (useful for proportional errors.) –  Nov 19 '12 at 00:10
  • I tried both techniques: weighted matrix and the log of the data, however, neither of them seemed to improve the results any bit. –  Nov 19 '12 at 02:46