To find exponent in power law equation of the form y = ax^m + b
Show older comments
I have X and Y points for a curve to be of the form Y = ax^m + b.
I want to find the exponent m, lets just say that m could be inbetween 1.2 - 2.5.
How can I find exact value for m?
Accepted Answer
More Answers (2)
hello
try this
may need some refinement for the initial guess for the parameters depending of your data
a = 0.55;
m = 1.3;
b = -0.78;
% dummy data
x = (1:25);
y = a*x.^m + b + randn(size(x));
% equation model y = a*x^m + b
f = @(a,m,b,x) (a*x.^m + b);
obj_fun = @(params) norm(f(params(1), params(2), params(3),x)-y);
% IC guessed
sol = fminsearch(obj_fun, rand(3,1));
a_sol = sol(1)
m_sol = sol(2)
b_sol = sol(3)
y_fit = f(a_sol, m_sol, b_sol, x);
Rsquared = my_Rsquared_coeff(y,y_fit); % correlation coefficient
figure(1)
plot(x,y,'rd',x,y_fit,'b-');
title(['Power Fit / R² = ' num2str(Rsquared) ], 'FontSize', 15)
ylabel('Intensity (arb. unit)', 'FontSize', 14)
xlabel('x(nm)', 'FontSize', 14)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function Rsquared = my_Rsquared_coeff(data,data_fit)
% R² correlation coefficient computation
% The total sum of squares
sum_of_squares = sum((data-mean(data)).^2);
% The sum of squares of residuals, also called the residual sum of squares:
sum_of_squares_of_residuals = sum((data-data_fit).^2);
% definition of the coefficient of correlation is
Rsquared = 1 - sum_of_squares_of_residuals/sum_of_squares;
end
If you have the Curve Fitting Toolbox,
a = 0.55;
m = 1.3;
b = -0.78;
% dummy data
x = (1:25)';
y = a*x.^m + b + randn(size(x));
fobj=fit(x,y,'power2','Lower',[-inf,1.2,-inf],'Upper',[+inf,2.5,+inf])
plot(fobj,x,y)
Categories
Find more on Fit Postprocessing in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!
