How do I do a linear fit on half of the data points in a set?
8 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
JJH
el 22 de Nov. de 2018
Comentada: Star Strider
el 22 de Nov. de 2018
I have a code that should plot a set of data points and then a linear fit to the data points. Only the second half of the data follows a linear trend so I have set the fit over the second half of the data only. I have the code
fig3 = figure;
for ij = 1:N
subplot(1,2,1);
plot(Pdissarray(ij,:)',peakposarray(ij,2:end)','.','color', CM(ij,:))
xlabel('Dissipated Power (mW)');
ylabel('Peak Wavelength (nm)');
ylim([842 855]);
hold on
fitA = polyfit(Pdissarray(ij,15:end),peakposarray(ij,15:end),1);
lambdafit = polyval(fitA,Pdiss(ij,:));
subplot(1,2,1);
plot(Pdissarray(ij,:),lambdafit,'--','color',CM(ij,:));
hold on
end
where pdissarray and peakposarray are data sets such that each row is the thing I want to plot for each iteration of the loop and there are N rows (i.e. the arrays are each Nx50 and each N represents a single data set). The plot of these data sets is great, I get a set of N lines where each is a plot of the first row of each array. The problem is the fit. I'm trying to do a polynomial fit of degree one on each one of these lines. I do polyfit followed by polyval and then plot this output but the plot of this fit is empty. What am I doing wrong? Is it an indexing problem?
2 comentarios
Respuesta aceptada
Star Strider
el 22 de Nov. de 2018
There are several problems with the code you posted.
This works for me:
fig3 = figure;
for ij = 1:N
subplot(1,N,ij);
plot(Pdissarray(ij,:)',peakposarray(ij,2:end)','.','color', CM(ij,:))
xlabel('Dissipated Power (mW)');
ylabel('Peak Wavelength (nm)');
ylim([842 855]);
hold on
fitA = polyfit(Pdissarray(ij,15:end),peakposarray(ij,16:end),1);
lambdafit = polyval(fitA,Pdissarray(ij,:));
plot(Pdissarray(ij,:),lambdafit,'--','color',CM(ij,:));
hold off
end
2 comentarios
Star Strider
el 22 de Nov. de 2018
My pleasure.
You included a subplot call, so I assumed you wanted them all as subplots. To plot them all in one axes object, this works:
fig3 = figure;
hold all
for ij = 1:N
plot(Pdissarray(ij,:)',peakposarray(ij,2:end)','.','color', CM(ij,:))
fitA = polyfit(Pdissarray(ij,15:end),peakposarray(ij,16:end),1);
lambdafit = polyval(fitA,Pdissarray(ij,:));
plot(Pdissarray(ij,:),lambdafit,'--','color',CM(ij,:));
end
hold off
xlabel('Dissipated Power (mW)');
ylabel('Peak Wavelength (nm)');
ylim([845 853]);
Keeping only the operations affected by the for looop inside it makes it more efficient. I also tweaked the ylim argument to make the plot a bit more readable.
Más respuestas (0)
Ver también
Categorías
Más información sobre Get Started with Curve Fitting Toolbox en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!