Ваш RMSE в порядке (в моей книге).Единственная вещь, которая кажется, возможно, отключена - это meshgrid и griddata.Ваши входные данные для griddata являются векторами, и вы запрашиваете матричный вывод.Это нормально, но вы, возможно, недосэмплируете свое пространство ввода.Другими словами, вы даете n выборок в качестве входных данных, но, возможно, от вас ожидается, что n ^ 2 выборок в качестве входных данных?Вот пример кода для меньшего n, чтобы более наглядно продемонстрировать этот эффект:
rng('default');
% Set up 2,000 random numbers between -1 & +1 as our x & y values
n=100; %Reduced because scatter is slow to plot
x = 2*(rand(n,1)-0.5);
y = 2*(rand(n,1)-0.5);
z = x.^5+y.^3;
S = 100;
subplot(1,2,1)
scatter(x,y,S,z)
%More data, more accurate ...
[x2,y2] = meshgrid(x,y);
z2 = x2.^5+y2.^3;
subplot(1,2,2)
scatter(x2(:),y2(:),S,z2(:))
Второй график должен быть намного чище и, следовательно, вероятно, даст более точную оценку Z_actual позже.
Я также подумал, что вы можете столкнуться с некоторыми проблемами с числами с плавающей запятой и вычислением RMSE, но, похоже, это не так.Вот некоторый альтернативный код, который я бы написал RMSE.
d = Zi_cubic(:) - Z_actual(:);
mask = ~isnan(d);
n_valid = sum(mask);
rmse = sqrt(sum(d(mask).^2)/n_valid);
Обратите внимание, что (:)
линеаризует матрицу.Также полезно попытаться использовать более подходящие имена переменных, чем D1-D7.
В конце концов, это всего лишь предложения, и ваш код выглядит хорошо.
PS - Я предполагаю, что выпредполагается, что используется cubic
интерполяция, поскольку это еще одно место, где вы, возможно, можете отклониться от ожидаемого ...