What would be the equation of the following surface?

1 view (last 30 days)
I have the raw data of X, Y, Z, where X and Y are inputs and Z is the output. Plotting the surface gives the red curve in the below picture:
The surface seems to be a simple function involving trigonometric functions. For example, plotting the equation cos(X)^2 + cos(Y)^2 gives the blue surface and it looks similar to the red graph (but the RMS error is very large).
I have tried introducing variables (a1*cos(X)^2 + a2*cos(Y)^2), where a1 and a2 vary from 0 to 1) but the RMS error is still large.
I also tried the surface fitting functions (MATLAB's fit function) but it's models are limited (unlike the curve fitting models which include Fourier series, sin series, etc).
How can I find the equation which gives the red surface?
Edit for clarity: I am able to use the lsqcurvefit (or any other curve fitting toolbox functions) to find which coefficients to use, but I am not sure what the equation should be. cos(X)^2 + cos(Y)^2, for example, is not the right equation but it does have a similar shape.
If this seems improbabilistic, how can I vary cos(X)^2 + cos(Y)^2 to align the end curves of the surface (where there seems to be highest misalignment)?

Accepted Answer

Sam Chak
Sam Chak on 21 Feb 2024
Edited: Sam Chak on 21 Feb 2024
You can probably try this quadratic function , where is a constant, and , .
Update 1: Another candidate function for the surface is hyperbolic function, .
Update 2: If you insist on using the periodic trigonometric function on a non-oscillatory surface, then modify the fitting model to become so that it fits the local data.
Update 3: Added some surface plots.
[X, Y] = meshgrid(-1:0.05:1);
%% Polynomial function
c = 1;
b = 1/2;
a = b;
Z = c - b*Y.^2 - a*X.^2; % can try higher-order polynomial functions
surf(X, Y, Z), grid on
title('Quadratic function'), xlabel x, ylabel y, zlabel f(x,y)
%% Hyperbolic function
c = 1/(1 - sech(1));
b = [1, (c*sech(1))/2];
a = b;
Z = c - b(2)*cosh(b(1)*Y) - a(2)*cosh(a(1)*X);
surf(X, Y, Z), grid on
title('Hyperbolic function'), xlabel x, ylabel y, zlabel f(x,y)
%% Trigonometric function (local)
c = 0;
b = [pi/2, 1/2];
a = b;
Z = c + b(2)*cos(b(1)*Y).^2 + a(2)*cos(a(1)*X).^2;
surf(X, Y, Z), grid on
title('Trigonometric function'), xlabel x, ylabel y, zlabel f(x,y)
%% Gaussian function (local)
c = 1/(1 - exp(1));
b = exp(1)/(2*(exp(1) - 1));
a = b;
Z = c + b*exp(-Y.^2) + a*exp(-X.^2); % can sech(x) if you like single-hump functions
surf(X, Y, Z), grid on
title('Gaussian function'), xlabel x, ylabel y, zlabel f(x,y)
  1 Comment
Aravind Varma Dantuluri
Aravind Varma Dantuluri on 22 Feb 2024
@Sam Chak, Thanks for your help. I have tried these functions and the gaussian gives the best match

Sign in to comment.

More Answers (1)

Matt J
Matt J on 21 Feb 2024
You could try fitting a 2D Gaussian surface to it, e.g., with this FEX download,




Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!