NMinimize initializes with symbolic values, you want to prevent your functions evaluating with symbolic values.
so I guess making them conditional while only matching numerical inputs it will run.
In[1]:= (*Simulate some data and make a function to reproduce the data*)
n = 4;
data = Flatten[
With[{x = 2, y = 4}, Table[(x i^2 + y j), {i, 1, n}, {j, 1, n}]] +
RandomReal[{-0.5, 0.5}, {n, n}]];
simu[x_, y_] :=
Flatten[Table[(x i^2 + y j), {i, 1, n}, {j, 1, n}]] /; (NumberQ[x] &&
NumberQ[y]);
In[4]:= (*always evaluates*)
RMSDA[A_, B_] := RootMeanSquare[A - B]
(*only evaluates numeric values*)
RMSDN[A_, B_] := RootMeanSquare[A - B] /; (ListQ[A] && ListQ[B] && AllTrue[A, NumericQ] && AllTrue[B, NumericQ])
In[6]:= NMinimize[RMSDA[data, simu[x, y]], {x, y}]
During evaluation of In[6]:= NMinimize::nnum: The function value {26.2704,25.6377,25.0096,24.3863,23.8636,23.2503,22.6432,22.0426,20.0527,19.4886,<<6>>} is not a number at {x,y} = {0.918621,0.716689}.
Out[6]= NMinimize[
1/4 \[Sqrt]((5.52371 - simu[x, y])^2 + (10.3453 -
simu[x, y])^2 + (11.8308 - simu[x, y])^2 + (13.6971 -
simu[x, y])^2 + (15.5564 - simu[x, y])^2 + (18.3346 -
simu[x, y])^2 + (20.0972 - simu[x, y])^2 + (22.0655 -
simu[x, y])^2 + (24.0908 - simu[x, y])^2 + (25.778 -
simu[x, y])^2 + (29.8389 - simu[x, y])^2 + (33.9488 -
simu[x, y])^2 + (35.875 - simu[x, y])^2 + (40.0954 -
simu[x, y])^2 + (43.7572 - simu[x, y])^2 + (47.6609 -
simu[x, y])^2), {x, y}]
In[7]:= NMinimize[RMSDN[data, simu[x, y]], {x, y}]
Out[7]= {0.23916, {x -> 1.9883, y -> 4.00557}}