Fit curve when corresponding to one x value we have multiple y value?

10 Ansichten (letzte 30 Tage)
I have a data set where corresponding to one x value multiple y values are available. I tring to a*x^b function to these data using curve fitting app.
I an getting error 'Data sizes are incompatible'.
Do'nt know to arrange these data.
Help needed.
x = [ 0.0500 0.5000 5.0000 15.0000 25.0000];
y = [ 1.0000 0.9686 0.9893 0.9585 0.9484;...
1.0000 0.8911 0.8813 0.8420 0.8375;...
1.0000 0.7802 0.7747 0.7802 0.8022;...
1.0000 0.9819 0.9392 0.9038 0.8923;...
1.0000 0.9590 0.8974 0.8840 0.7308;...
1.0000 0.8803 0.8872 0.6493 0.7214;...
1.0000 0.9551 0.8923 0.8163 0.7953;...
1.0000 0.9591 0.9084 0.8098 0.6922;...
1.0000 0.8306 0.7610 0.6142 0.6299;...
1.0000 0.8993 0.8583 0.8115 0.7535;...
1.0000 0.9072 0.8780 0.7501 0.6728;...
1.0000 0.9348 0.8529 0.6733 0.5870;...
1.0000 0.8333 0.8167 0.7667 0.7000;...
1.0000 0.9048 0.8493 0.7405 0.6214;...
1.0000 0.8892 0.7967 0.6878 0.5504];

Akzeptierte Antwort

Image Analyst
Image Analyst am 12 Sep. 2020
Bearbeitet: Image Analyst am 12 Sep. 2020
Usually what I do in that situation is to add a very tiny, insignificant bit a noise to the x values. It will be so small that it won't affect the fit but it will prevent you from having duplicate x values:
x = [ 0.0500 0.5000 5.0000 15.0000 25.0000];
y = [ 1.0000 0.9686 0.9893 0.9585 0.9484;...
1.0000 0.8911 0.8813 0.8420 0.8375;...
1.0000 0.7802 0.7747 0.7802 0.8022;...
1.0000 0.9819 0.9392 0.9038 0.8923;...
1.0000 0.9590 0.8974 0.8840 0.7308;...
1.0000 0.8803 0.8872 0.6493 0.7214;...
1.0000 0.9551 0.8923 0.8163 0.7953;...
1.0000 0.9591 0.9084 0.8098 0.6922;...
1.0000 0.8306 0.7610 0.6142 0.6299;...
1.0000 0.8993 0.8583 0.8115 0.7535;...
1.0000 0.9072 0.8780 0.7501 0.6728;...
1.0000 0.9348 0.8529 0.6733 0.5870;...
1.0000 0.8333 0.8167 0.7667 0.7000;...
1.0000 0.9048 0.8493 0.7405 0.6214;...
1.0000 0.8892 0.7967 0.6878 0.5504];
[rows, columns] = size(y)
xm = repmat(x, [rows, 1])
% Make into vectors.
xv = xm(:);
yv = y(:);
plot(xv, yv, '+', 'LineWidth', 3, 'MarkerSize', 12);
% Add a tiny bit of noise to each x value
xv = xv + 0.000001 * rand(length(xv), 1);
% Fit to a cubic
coefficients = polyfit(xv, yv, 3);
% Get new values
yFit = polyval(coefficients, xv);
hold on
plot(xv, yFit, 'r-', 'LineWidth', 3);
grid on;
xlabel('x', 'FontSize', 20);
ylabel('y', 'FontSize', 20);
legend('data', 'fit');
Use fitnlm since you want a power law. I'm attaching some examples of fitnlm().

Weitere Antworten (1)

Star Strider
Star Strider am 12 Sep. 2020
If you want to regress all of them to the same set of parameters, this works:
xm = repmat(x, size(y,1), 1);
fcn = @(p,x) p(1) .* x.^p(2);
cf = @(b) norm(y - fcn(b,xm));
B = fminsearch(cf, [1;1]);
RL = fcn(B,xm);
figure
plot(x, y)
hold on
plot(x, RL, '--', 'LineWidth',2)
hold off
grid
xlabel('x')
ylabel('y')
producing:
Use a loop and loop through the rows of ‘y’ to fit them individually.
.

Kategorien

Mehr zu Get Started with Curve Fitting Toolbox finden Sie in Help Center und File Exchange

Produkte


Version

R2019a

Community Treasure Hunt

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

Start Hunting!

Translated by