How to fit the data with 2 term power law function?

6 ビュー (過去 30 日間)
peipei feng
peipei feng 2020 年 6 月 1 日
コメント済み: peipei feng 2020 年 6 月 2 日
Hi there,
I have the followig data and I want to fit them in the form of z = r^a * v^b.
I tried to obtain log values of the function: log(z) =a*log(r)+b*log(v), but I'm confused as there are so many vectors.
r = [4.242640687119285e-06,5.656854249492381e-06,7.071067811865476e-06,8.485281374238570e-06,9.899494936611665e-06,1.131370849898476e-05,1.272792206135786e-05];
v = [0.3656,0.6093,0.9748,1.2185];
z = [2.20075780727420 2.34800174967587 2.40633263085150 2.46928643488236 2.55551444168423 2.66309682650254 2.78591291730793
1.20828256541234 1.57243262679317 1.78594063849408 1.94976208027465 2.10251979263655 2.25584172701771 2.41163339237766
0.472116287092821 0.855613921769617 1.14739856522263 1.38120431719641 1.58720801177653 1.78025160940097 1.96628391586011
0.243938638287455 0.563375613060710 0.851155979561504 1.09774989977420 1.31858268912292 1.52483525677172 1.72202346894929
];
the plot is also attached, where different curves are from different v values.

採用された回答

Ameer Hamza
Ameer Hamza 2020 年 6 月 1 日
編集済み: Ameer Hamza 2020 年 6 月 2 日
taking log() of the equation make it very easy to find the parameter (because the equation is linear in term of a and b). Try the following code
r = [4.242640687119285e-06,5.656854249492381e-06,7.071067811865476e-06,8.485281374238570e-06,9.899494936611665e-06,1.131370849898476e-05,1.272792206135786e-05];
v = [0.3656,0.6093,0.9748,1.2185];
z = [2.20075780727420 2.34800174967587 2.40633263085150 2.46928643488236 2.55551444168423 2.66309682650254 2.78591291730793
1.20828256541234 1.57243262679317 1.78594063849408 1.94976208027465 2.10251979263655 2.25584172701771 2.41163339237766
0.472116287092821 0.855613921769617 1.14739856522263 1.38120431719641 1.58720801177653 1.78025160940097 1.96628391586011
0.243938638287455 0.563375613060710 0.851155979561504 1.09774989977420 1.31858268912292 1.52483525677172 1.72202346894929
];
a = zeros(1, 4);
b = zeros(1, 4);
for i=1:numel(a)
V = repmat(v(i), size(r));
Z = log(z(i, :).');
X = [log(r.') log(V.')];
sol = X\Z;
a(i) = sol(1);
b(i) = sol(2);
end
figure;
axes();
hold on
for i=1:numel(v)
z_est = r.^a(i).*v(i).^b(i);
plot(r, z(i,:), '+--', 'DisplayName', ['v = ' num2str(v(i)) ' real']);
plot(r, z_est, 'DisplayName', ['v = ' num2str(v(i)) ' est']);
end
legend('Location', 'best');
  5 件のコメント
Ameer Hamza
Ameer Hamza 2020 年 6 月 2 日
In that case, the original solution was correct. As you can see, the value of a and b vary very much to fit these lines, so it might not be possible to get a good fit with single 'a' and 'b'.
Here is the original code for reference
r = [4.242640687119285e-06,5.656854249492381e-06,7.071067811865476e-06,8.485281374238570e-06,9.899494936611665e-06,1.131370849898476e-05,1.272792206135786e-05];
v = [0.3656,0.6093,0.9748,1.2185];
z = [2.20075780727420 2.34800174967587 2.40633263085150 2.46928643488236 2.55551444168423 2.66309682650254 2.78591291730793
1.20828256541234 1.57243262679317 1.78594063849408 1.94976208027465 2.10251979263655 2.25584172701771 2.41163339237766
0.472116287092821 0.855613921769617 1.14739856522263 1.38120431719641 1.58720801177653 1.78025160940097 1.96628391586011
0.243938638287455 0.563375613060710 0.851155979561504 1.09774989977420 1.31858268912292 1.52483525677172 1.72202346894929
];
[V, R] = ndgrid(v, r);
Y = log(z(:));
X = [log(R(:)) log(V(:))];
sol = X\Y; % least square solution
a = sol(1);
b = sol(2);
peipei feng
peipei feng 2020 年 6 月 2 日
Thank you!

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeInterpolation についてさらに検索

タグ

Community Treasure Hunt

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

Start Hunting!

Translated by