How to fit the data with 2 term power law function?
    4 visualizzazioni (ultimi 30 giorni)
  
       Mostra commenti meno recenti
    
    peipei feng
 il 1 Giu 2020
  
    
    
    
    
    Commentato: peipei feng
 il 2 Giu 2020
            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.
Risposta accettata
  Ameer Hamza
      
      
 il 1 Giu 2020
        
      Modificato: Ameer Hamza
      
      
 il 2 Giu 2020
  
      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 Commenti
  Ameer Hamza
      
      
 il 2 Giu 2020
				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);
Più risposte (0)
Vedere anche
Categorie
				Scopri di più su Get Started with Curve Fitting Toolbox in Help Center e File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!

