Output of MATLAB Curve Fitting Toolbox does not match generated function

折月煮酒 提交于 2019-12-12 16:05:56

问题


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 automatically-generated function:


回答1:


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.



来源:https://stackoverflow.com/questions/29947968/output-of-matlab-curve-fitting-toolbox-does-not-match-generated-function

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!