フィルターのクリア

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

29 ビュー (過去 30 日間)
Akshay Kumar
Akshay Kumar 2020 年 9 月 12 日
編集済み: Image Analyst 2020 年 9 月 12 日
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];

採用された回答

Image Analyst
Image Analyst 2020 年 9 月 12 日
編集済み: Image Analyst 2020 年 9 月 12 日
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().

その他の回答 (1 件)

Star Strider
Star Strider 2020 年 9 月 12 日
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.
.

カテゴリ

Help Center および File ExchangeGet Started with Curve Fitting Toolbox についてさらに検索

製品


リリース

R2019a

Community Treasure Hunt

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

Start Hunting!

Translated by