3
votes

A similar question has been answered in the past, but my part of their question was not answered (Matlab curve fitting tool, cftool, generate code function does not give the same fit).

I have a set of data points that are meant to show the "ideal" curve for the mechanism I am studying.

When I ask the Curve Fitting Toolbox in Matlab to find a 2-term exponential, I get a great fit (R-square: 0.9998, Adjusted R-square: 0.9997). However, when I generate code for this fit, it changes the coefficients a, b, c and d.

In the toolbox, it displays:

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

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

Notice that the coefficients are completely different, as are the curves generated.

Notice also that for coefficients displayed in the curve-fitting toolbox, c = -a and d = b, so that y should equal zero for any value of x, which is ludicrous.

But when I edit the generated function to replace the function's coefficients with the coefficients from the toolbox, I get a good 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 to post images of the curves, but in the toolbox it looks perfect and the one from the function looks awful - translated in the same way as the linked poster.

Here's variable bgSt:

-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 variable testSt:

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.

Figure generated by curve fitting toolbox:

Figure generated by cftool

Figure generated by automatically-generated function:

Figure generated by function

1

1 Answers

0
votes

I ran into a similar problem using the exponential fit due to how the coefficients were bounded. It's possible that they're bounded in the dialogue, but I don't see where they'd be bounded in the generated code.