# To find exponent in power law equation of the form y = ax^m + b

20 views (last 30 days)

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?

##### 0 Comments

### Accepted Answer

Matt J
on 19 Jan 2023

Edited: Matt J
on 19 Jan 2023

fminspleas downloadable from

is especially appropriate for power law fits.

a = 0.55;

m = 1.3;

b = -0.78;

% dummy data

x = (1:25)';

y = a*x.^m + b + randn(size(x));

m=fminspleas( {@(m,x)x.^m , 1}, 2,x,y, 1.2,2.5 )

##### 2 Comments

Matt J
on 19 Jan 2023

### More Answers (2)

Mathieu NOE
on 19 Jan 2023

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

##### 0 Comments

Matt J
on 19 Jan 2023

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)

##### 0 Comments

### See Also

### Categories

### Community Treasure Hunt

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

Start Hunting!