MATLAB Curve Fitting Toolbox output does not match generated function
A similar question has been given in the past, but my part of their question was not satisfied ( Matlab curve fitting tool, cftool, generate function code does not give the same match ).
I have a set of data points designed to display an "ideal" curve for a machine I'm researching.
When I ask the Curve Fitting Toolbox in Matlab to find a 2-dimensional exponent, I get a great option (R-square: 0.9998, Adjusted R-square: 0.9997). However, when I generate the code for this match, it changes the coefficients a, b, c and d.
The toolbar displays:
Exp2 generic model:
f(x) = a*exp(b*x) + c*exp(d*x)
Coefficients (with 95% confidence limits):
a = 4.698e+04 (-1.477e+13, 1.477e+13) b = 0.4381 (-1200, 1201) c = -4.698e+04 (-1.477e+13, 1.477e+13) d = 0.4381 (-1200, 1201)
Good match:
SSE: 0.002979
R-square: 0.9998
Adjusted R-squared: 0.9997
RMSE: 0.006823
Function generated by the curve fitting toolbox:
function [fitresult, gof] = createFit1(bgSt, testSt)
%CREATEFIT1(BGST,TESTST)
% Create a fit.
%
% Data for 'standard mechanism' fit:
% X Input : bgSt
% Y Output: testSt
% Output:
% fitresult : a fit object representing the fit.
% gof : structure with goodness-of fit info.
%
% See also FIT, CFIT, SFIT.
% Auto-generated by MATLAB on 29-Apr-2015 15:54:07
%% Fit: 'standard mechanism'.
[xData, yData] = prepareCurveData( bgSt, testSt );
% Set up fittype and options.
ft = fittype( 'exp2' );
opts = fitoptions( 'Method', 'NonlinearLeastSquares' );
opts.Display = 'Off';
opts.StartPoint = [0.935605768794225 0.667093185616236 0 0.667093185616236];
% Fit model to data.
[fitresult, gof] = fit( xData, yData, ft, opts );
% Plot fit with data.
figure( 'Name', 'standard mechanism' );
h = plot( fitresult, xData, yData );
legend( h, 'testSt vs. bgSt', 'standard mechanism', 'Location', 'NorthEast' );
% Label axes
xlabel bgSt
ylabel testSt
grid on
Note that the coefficients are completely different, as are the curves generated.
Note that for the coefficients displayed in the curve fitting toolbox, c = -a and d = b, so y must be zero for any value of x, which is ridiculous.
But when I edit the generated function to replace the function coefficients with the coefficients from the toolbox, I get a nice curve.
Edited code:
function [fitresult, gof] = standardFit(bgSt, testSt)
%STANDARDFIT(BGST,TESTST)
% Create a fit.
%
% Data for 'standard mechanism' fit:
% X Input : bgSt
% Y Output: testSt
% Output:
% fitresult : a fit object representing the fit.
% gof : structure with goodness-of fit info.
%
% See also FIT, CFIT, SFIT.
% Auto-generated by MATLAB on 29-Apr-2015 15:54:07
%FROM CURVE FITTING TOOLBOX:
%General model Exp2:
% f(x) = a*exp(b*x) + c*exp(d*x)
%Coefficients (with 95% confidence bounds):
% a = 4.698e+04 (-1.477e+13, 1.477e+13)
% b = 0.4381 (-1200, 1201)
% c = -4.698e+04 (-1.477e+13, 1.477e+13)
% d = 0.4381 (-1200, 1201)
%Goodness of fit:
% SSE: 0.002979
% R-square: 0.9998
% Adjusted R-square: 0.9997
% RMSE: 0.006823
%% Fit: 'standard mechanism'.
[xData, yData] = prepareCurveData( bgSt, testSt );
% Set up fittype and options.
ft = fittype( 'exp2' );
opts = fitoptions( 'Method', 'NonlinearLeastSquares' );
opts.Display = 'Off';
opts.StartPoint = [4.698e+04 0.4381 -4.698e+04 0.4381];
% Fit model to data.
[fitresult, gof] = fit( xData, yData, ft, opts );
% Plot fit with data.
figure( 'Name', 'standard mechanism' );
h = plot( fitresult, xData, yData );
legend( h, 'testSt vs. bgSt', 'standard mechanism', 'Location', 'NorthEast' );
% Label axes
xlabel bgSt
ylabel testSt
grid on
I don't have enough reputation for posting images of curves, but it looks perfect in the dashboard and the function from function looks terrible - translates just like the linked poster.
Here's the bgSt variable:
-2.85 -2.8 -2.75 -2.7 -2.65 -2.6 -2.55 -2.5 -2.45 -2.4 -2.35 -2.3 -2.25 -2.2 -2.15 -2.1 -2.05 -2 -1.95 -1.9 -1.85 -1.8 -1.75 -1.7 -1.65 -1.6 -1.55 -1.5 -1.45 -1.4 -1.35 -1.3 -1.25 -1.2 -1.15 -1.1 -1.05 -1 -0.95 -0.9 -0.85 -0.8 -0.75 -0.7 -0.65 -0.6 -0.55
-0.5 -0.45 -0.4 -0.35 -0.3 -0.25 -0.2 -0.15 -0.1 -0.05 0 0.05 0.1 0.15 0.2 0.25 0.3 0.35 0.4 0.45 0.5
Here's the testSt variable:
0 0.01 0.01 0.02 0.02 0.02 0.03 0.04 0.04 0.05 0.06 0.06 0.07 0.08 0.08 0.09 0.1 0.11 0.12 0.13 0.14 0.15 0.16 0.17 0.18 0.2 0.21 0.23 0.24 0.26 0.28 0.3 0.31 0.33 0.35 0.37 0.39 0.41 0.43 0.45 0.48 0.5 0.52 0.55 0.57 0.6 0.63 0.66 0.68 0.72 0.74 0.78
0.81 0.85 0.88 0.92 0.96 1 1.04 1.08 1.12 1.17 1.21 1.26 1.3 1.35 1.39 1.44
Edit: I now have enough reputation to add images.
Picture created with the Curve Fitting Toolbar:
Picture generated by auto-generated function:
source to share