Coefficents not reflecting the curve obtained using fit function

1 Ansicht (letzte 30 Tage)
I am trying to write a piece of code that outputs the constants a and b for a curve of the following format:
f(x)=1/(1+exp(1).^(b*(x-a)))
My code (below) is producing the logistic function plot (below) which i believe to be correct, however the coefficients being extracted from the code are not representative of the plot being produced. Is there a fix for this which would mean that the correct values of a and b could be extracyed from the function? Any help would be much appreciated
function [a,b] = fit_lightoff(Temperature,Gas_Conversion)
ft = fittype( '1/(1+exp(1).^(-b*(x-a)))');
options = fitoptions;
options.Normal = 'on';
f=fit(Temperature,Gas_Conversion, ft, options)
MyCoeffs=coeffvalues(f);
a= MyCoeffs(1);
b= MyCoeffs(2);
h = plot( f, Temperature,Gas_Conversion);
end

Akzeptierte Antwort

David Wilson
David Wilson am 10 Apr. 2019
Bearbeitet: David Wilson am 10 Apr. 2019
I suspect that the problem is that you have normalised the data, and then forgot that when you looked at the parameter values.
For example, since you didn't bother give us any data to work with, I've made my own to roughly follow yours. In this case I know the true parameters, "a" & "b". I've also added a small amount of noise just for fun.
x = linspace(180,380,8)';
a = 280; b=0.05; % approx constants
y = 1.0./(1+exp(-b*(x-a))) + 0.05*randn(size(x))
plot(x,y,'o')
If you plot this data, you'll see something similar to your original data points.
Now we are ready to fit. Always a good idea to give it a reasonable starting guess.
Temperature=x; Gas_Conversion=y;
ft = fittype( '1.0./(1+exp(-b*(x-a)))');
options = fitoptions('method','NonlinearLeastSquares'); % Must do this, in order to specify an initial guess
options.Normal = 'off'; % TURN OFF !!! (or re-scale the coefficients)
options.StartPoint = [280, 0.05]'; % default start point for a & b
f=fit(Temperature,Gas_Conversion, ft, options)
MyCoeffs=coeffvalues(f);
a= MyCoeffs(1);
b= MyCoeffs(2);
h = plot( f, Temperature,Gas_Conversion);
Now we get a reasonable plot with
f =
General model:
f(x) = 1.0./(1+exp(-b*(x-a)))
Coefficients (with 95% confidence bounds):
a = 278 (272.3, 283.7)
b = 0.06609 (0.04472, 0.08745)
sensible coefficients, close to what I generated the original data with.

Weitere Antworten (0)

Kategorien

Mehr zu Linear and Nonlinear Regression finden Sie in Help Center und File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by