MATLAB Answers

## Curve fitting f(x,y) result

Asked by ZazOufUmI

### ZazOufUmI (view profile)

on 19 Apr 2012
Latest activity Commented on by Walter Roberson

### Walter Roberson (view profile)

on 28 Feb 2019
Hi,
I used Curve fitting tool to get the equation of the regression line of my area. So I have some X and Y which give some Z.
The curve fitting tool provide me a linear model like this :
Linear model Poly54:
f(x,y) = p00 + p10*x + p01*y + p20*x^2 + p11*x*y + p02*y^2 + p30*x^3 + p21*x^2*y+ p12*x*y^2 + p03*y^3 + p40*x^4 + p31*x^3*y + p22*x^2*y^2+ p13*x*y^3 + p04*y^4 + p50*x^5 + p41*x^4*y + p32*x^3*y^2+ p23*x^2*y^3 + p14*x*y^4
But when I try to obtain a Z value from this equation it's not good at all. For example with X = 60 and Y = 60 , Z = 300 but with the formula I have a result like xxxE+14
Actually, I'm looking for an equation which can provide me a Z value whatever X and Y such as f(x,y) = z The area looks like this : http://www.hostingpics.net/viewer.php?id=329914example.jpg
Thank you if you can help

#### 0 Comments

Sign in to comment.

## 7 Answers

Answer by Richard Willey

### Richard Willey (view profile)

on 20 Apr 2012

I'm attaching code that shows a couple different ways to solve your problem.
I prefer the second option. The R^2 is slightly better and the model is simplier. (Note that option 2 as coded uses Statistics Toolbox rather than Curve Fitting Toolbox)
%%Input some data
x = [0 10 20 30 35 40 45 50 55 60];
y = [60 120 180 240 300];
z = [299.8 299.1 296.9 293.4 291.4 289.9 288.5 283.3 276.4 272.1;
299.8 299.1 296.9 293.4 291.4 289.9 288.5 283.3 276.4 272.1;
299.8 299.1 296.9 293.4 291.4 289.9 288.5 283.3 276.4 272.1;
299.8 299.1 296.9 293.4 291.4 289.9 288.5 283.3 276.4 272.1;
299.8 299.1 296.9 293.4 291.4 289.9 288.5 283.3 276.4 272.1];
% Observe that the data is constant in one dimension.
% The variable Y has no predictive power
% This means we can treat this as a curve fitting problem rather
% than a surface fitting problem
x = x';
z = mean(z, 1)';
% Visualize our data
scatter(x,z)
%%Generate a fit
% Option one
[foo, GoF] = fit(x,z, 'poly2')
hold on
plot(foo)
%%Option two: Fit a piecewise linear model
% Looking at the data, it appears as if we might generate a better fit by
% assuming a piecewise linear model with a "kink" at the 7th data point
% Start by centering the data such that the 7th data point is equal to zero
New_x = x - 45;
% Create a dummy variable that flags whether we are before or after the 7th
% data point
dummy = New_x > 0
% Create an interaction term
interaction = New_x .* dummy
% Generate our regression model
X = [ones(size(x)), New_x, interaction];
b = regress(z, X)
plot(x, X*b)

#### 2 Comments

Ibrahim Maassarani

### Ibrahim Maassarani (view profile)

on 28 Feb 2019
Is b the function?
I got:
b =
1.0e+03 *
7.6023
0.0043
-0.0144
How should I read this?!
Walter Roberson

### Walter Roberson (view profile)

on 28 Feb 2019
You should give the command
format long g
and then you should display b again.

Sign in to comment.

Answer by ZazOufUmI

### ZazOufUmI (view profile)

on 20 Apr 2012

Should I use fittype for my problem ?

#### 0 Comments

Sign in to comment.

Answer by Richard Willey

### Richard Willey (view profile)

on 20 Apr 2012

Hi there
The "Poly54" fit type is specifying a 5th order polynomial in one direction and a 4th order polynomial in the other.
From the looks of things, you have roughly 40 data points. Your model has 20 terms (many of which are high order). I suspect that you're overfitting like crazy, which means that your model can perform very poorly if used to generate a prediction for out of sample data.
Based on the chart that you provided, you can probably cobble together a simple custom equation with a linear model in one direction and a cubic in the other. Something like
Y = b0 + b1*X1 + b2*X2^3

#### 0 Comments

Sign in to comment.

Answer by ZazOufUmI

### ZazOufUmI (view profile)

on 20 Apr 2012

Thank you for your help.
I tried with a Poly31 and here is the result : http://www.hostingpics.net/viewer.php?id=453193result.jpg
For example with a X = 60 and Y = 60 I have a Z = 272 but with this formula I obtain Z = -2.54517e+05
I don't know what is wrong.

#### 0 Comments

Sign in to comment.

Answer by Richard Willey

### Richard Willey (view profile)

on 20 Apr 2012

Hi ZazOufUMl
A "Poly31" model is different than the one that I suggested. (Poly31 will contain a number of cross terms).
Any chance that you can post your raw X, Y, and Z data?

Walter Roberson

### Walter Roberson (view profile)

on 20 Apr 2012
http://www.mathworks.com/matlabcentral/answers/7924-where-can-i-upload-images-and-files-for-use-on-matlab-answers

Sign in to comment.

Answer by ZazOufUmI

### ZazOufUmI (view profile)

on 20 Apr 2012

I'm sorry if I didn't understand your answer. Here is my data :
%%%%%%%%%%%%%%%Data%%%%%%%%%%%%%%%
x = [0 10 20 30 35 40 45 50 55 60];
y = [60 120 180 240 300];
z = [299.8 299.1 296.9 293.4 291.4 289.9 288.5 283.3 276.4 272.1;
299.8 299.1 296.9 293.4 291.4 289.9 288.5 283.3 276.4 272.1;
299.8 299.1 296.9 293.4 291.4 289.9 288.5 283.3 276.4 272.1;
299.8 299.1 296.9 293.4 291.4 289.9 288.5 283.3 276.4 272.1;
299.8 299.1 296.9 293.4 291.4 289.9 288.5 283.3 276.4 272.1];
Thank you

#### 0 Comments

Sign in to comment.

Answer by ZazOufUmI

### ZazOufUmI (view profile)

on 23 Apr 2012

Hi Richard,
Thank you, your solution works well but I have a last question. Unfortunately as you said, we lost the Y parameter, but how can I do to consider it ? Because my raw data looks like this : http://www.hostingpics.net/viewer.php?id=629034table.jpg
As you can see my Y data are differents depending X and Z. Maybe I grabbed my data in a wrong way ? Do you think it's possible to consider this parameter ?
If not I will just use your method instead.
Thank you

#### 0 Comments

Sign in to comment.