Вывод MATLAB Curve Fitting Toolbox не соответствует сгенерированной функции
В прошлом на подобный вопрос был дан ответ, но на мою часть их вопроса не было ответа ( инструмент подбора кривой Matlab, cftool, функция генерации кода не дает такой же подгонки).
У меня есть набор точек данных, которые должны показать "идеальную" кривую для механизма, который я изучаю.
Когда я спрашиваю Curve Fitting Toolbox в Matlab, чтобы найти 2-членную экспоненту, я получаю отличную посадку (R-квадрат: 0.9998, Скорректированный R-квадрат: 0.9997). Однако, когда я генерирую код для этого соответствия, он меняет коэффициенты a, b, c и d.
На панели инструментов отображается:
Общая модель Exp2:
f(x) = a*exp(b*x) + c*exp(d*x)
Коэффициенты (с доверительными границами 95%):
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)
Совершенство подходит:
SSE: 0,002979
R-квадрат: 0,9998
Скорректированный R-квадрат: 0,9997
RMSE: 0,006823
Функция, генерируемая набором кривых:
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
Обратите внимание, что коэффициенты совершенно разные, как и сгенерированные кривые.
Также обратите внимание, что для коэффициентов, отображаемых в наборе инструментов для подбора кривой, c = -a и d = b, так что y должно равняться нулю для любого значения x, что нелепо.
Но когда я редактирую сгенерированную функцию, чтобы заменить коэффициенты функции на коэффициенты из панели инструментов, я получаю хорошую кривую.
Отредактированный код:
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
У меня недостаточно репутации, чтобы публиковать изображения кривых, но на панели инструментов она выглядит идеально, а функция из функции выглядит ужасно - переводится так же, как связанный постер.
Вот переменная 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
Вот переменная 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
Изменить: теперь у меня достаточно репутации, чтобы добавлять изображения.
Рисунок, сгенерированный набором кривых:
Рисунок, сгенерированный автоматически сгенерированной функцией:
1 ответ
Я столкнулся с подобной проблемой, используя экспоненциальное соответствие из-за того, как коэффициенты были ограничены. Возможно, что они ограничены в диалоге, но я не вижу, где они будут ограничены в сгенерированном коде.