I have the data in the graph below (blue dotted line). I have fitted a curve (red line). How can I isolate the flat/horizontal part?
Code example:
close all;
clear all;
clc;
load('ExampleData');
ft = fittype('(a.*x.^b)',...
'dependent',{'y'},'independent',{'x'},...
'coefficients',{'a','b'});
f = fit(dataX,dataY,ft,'StartPoint',[600 -1]);
coeffvals = coeffvalues(f);
figure
plot(dataX,dataY,'-ob')
hold on
plot(dataX,f(dataX),'-r')
legend('Actucal data','Fitted')
xlabel('dataX')
ylabel('dataY')
The ExampleData file is also attached.

3 Kommentare

Torsten
Torsten am 31 Jan. 2023
Bearbeitet: Torsten am 31 Jan. 2023
Your curve does not have a turning point (at least in the usual mathematical sense).
MichailM
MichailM am 31 Jan. 2023
Correct. I rephrased.
Plotting it on a loglog scale produces a straight line (as would be expected from a power relation) —
LD = load(websave('ExampleData','https://www.mathworks.com/matlabcentral/answers/uploaded_files/1279075/ExampleData.mat'));
dataX = LD.dataX;
dataY = LD.dataY;
ft = fittype('(a.*x.^b)',...
'dependent',{'y'},'independent',{'x'},...
'coefficients',{'a','b'});
f = fit(dataX,dataY,ft,'StartPoint',[600 -1])
f =
General model: f(x) = (a.*x.^b) Coefficients (with 95% confidence bounds): a = 600.4 (561.2, 639.5) b = -1.038 (-1.041, -1.035)
coeffvals = coeffvalues(f);
figure
loglog(dataX,dataY,'-ob')
hold on
plot(dataX,f(dataX),'-r')
legend('Actual data','Fitted')
xlabel('dataX')
ylabel('dataY')
.

Melden Sie sich an, um zu kommentieren.

Antworten (4)

John D'Errico
John D'Errico am 31 Jan. 2023

1 Stimme

What part of this curve is horizontal?
syms x
F = exp(-10*x)
F = 
fplot(F,[0,3])
Well, clearly, ithe horizontal part lies above x==0.5.
fplot(F,[0.5,3.5])
Oh wait. It must start above x==1.
fplot(F,[1,4])
Wow. That is strange. It must start above x==1.5.
fplot(F,[1.5,4.5])
I think I'm gonna get it right soon. It DEFINITELY starts at x==2.
fplot(F,[2,5])
This is really, really strange.
Or, maybe, just maybe, there is NO horizontal part of the curve. Wherever you look, the curve has EXACTLY the same shape.
Walter Roberson
Walter Roberson am 31 Jan. 2023

1 Stimme

Declare your horizontal cutoff to be the place where abs() of the gradient is less than some threshold. If necessary, low-pass filter the data first (to remove experimental noise)
Image Analyst
Image Analyst am 31 Jan. 2023

1 Stimme

Maybe adjust the axis to start and end wherever you want, like
xlim([0.5e-6, 5e-6]);
but like John said, there is no flat part so you just have to make some judgment about where you think the flat part starts.
MichailM
MichailM am 31 Jan. 2023

0 Stimmen

It seems that my description of the flat/horizontal part caused some sort of confusion with regards to the strict definition of it. dataY shows an abrupt decrease for the the very early values of dataX which fits well to the behavior of the power function. From a point an after, that decrease becomes sort of linear with superimposed experimental noise as Walter mentioned.
I will need to detect the part where the curve in the first post becomes sort of linear, after it has experienced the abrupt decrease. I hope that explains things somehow better. Apologies for the confusion.

1 Kommentar

Image Analyst
Image Analyst am 31 Jan. 2023
You can try my piecewise linear demo, attached.
My attached demo does the "Novice Method" above. It looks like you're using the "Expert Method" above.
Or you can use the triangle method, also attached.

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Mathematics finden Sie in Hilfe-Center und File Exchange

Produkte

Version

R2022b

Gefragt:

am 31 Jan. 2023

Kommentiert:

am 31 Jan. 2023

Community Treasure Hunt

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

Start Hunting!

Translated by