Clear Filters
Clear Filters

How to fit a plot to a set of data points in a log-log scale?

6 views (last 30 days)
Hi,
I have an equation of the form:
y = [1 + (1 - q) * x * m]^1/(1 - q)
I have 1000 values of y and x . I need to determine the values of 'q' and 'm' which best fits the equation in a log-log scale and also plot the same.
How to do it?

Answers (1)

Star Strider
Star Strider on 2 Apr 2023
Perhaps something like this —
yfcn = @(x,m,q) (1 + (1 - q) .* x .* m).^1./(1 - q); % Objective Function
x = sort(rand(1,50)); % Create Random Data
y = rand(1, 50); % Create Random Data
B0 = rand(2,1); % Initial Parameter Estimates
[B,fv] = fminsearch(@(b) norm(y - yfcn(x, b(1),b(2))), B0); % Estimate Parameters
xv = linspace(min(x), max(x), 150);
yv = yfcn(xv,B(1),B(2));
figure
loglog(x, y, '.', 'DisplayName','Data')
hold on
plot(xv, yv, '-r', 'DisplayName','Regression')
hold off
grid
xlabel('X')
ylabel('Y')
legend('Location','best')
text(min(xlim)+0.01*diff(xlim), min(ylim)+0.01*diff(ylim), sprintf('$y = (1 + (1-%.2f) \\cdot x \\cdot %.2f)^\\frac{1}{1-%.2f}$',B(2),B(1),B(2)), 'Interpreter','latex', 'FontSize',12)
.
  3 Comments
Star Strider
Star Strider on 2 Apr 2023
The fit is not perfect, however the regression works for me —
T1 = readtable('https://www.mathworks.com/matlabcentral/answers/uploaded_files/1343429/data_points.xlsx')
T1 = 1023×2 table
x y _________ _______ 0.0082825 0.67546 0.023756 0.22581 0.0086785 0.65298 0.0029937 0.94721 0.005617 0.78886 0.017193 0.35288 0.018741 0.31476 0.0071413 0.72825 0.020214 0.28837 0.02242 0.2522 0.0056988 0.78201 0.004754 0.84164 0.007176 0.7263 0.032983 0.12512 0.0045875 0.85239 0.013214 0.47507
yfcn = @(x,m,q) (1 + (1 - q) .* x .* m).^1./(1 - q); % Objective Function
x = T1.x;
y = T1.y;
B0 = rand(2,1); % Initial Parameter Estimates
[B,fv] = fminsearch(@(b) norm(y - yfcn(x, b(1),b(2))), B0) % Estimate Parameters
B = 2×1
-16.6911 -0.2806
fv = 4.8219
xv = linspace(min(x), max(x), 150);
yv = yfcn(xv,B(1),B(2));
figure
loglog(x, y, '.', 'DisplayName','Data')
hold on
plot(xv, yv, '-r', 'DisplayName','Regression')
hold off
grid
xlabel('X')
ylabel('Y')
legend('Location','best')
text(min(xlim)+0.01*diff(xlim), min(ylim)+0.01*diff(ylim), sprintf('$y = (1 + (1-%.2f) \\cdot x \\cdot %.2f)^\\frac{1}{1-%.2f}$',B(2),B(1),B(2)), 'Interpreter','latex', 'FontSize',12)
Warning: Negative data ignored
B0 = rand(2,1)*10; % Initial Parameter Estimates
yfcn2 = @(b,x) yfcn(x,b(1),b(2));
[B,fv] = lsqcurvefit(yfcn2, B0, x, y, zeros(1,2)) % Estimate Parameters
Local minimum possible. lsqcurvefit stopped because the final change in the sum of squares relative to its initial value is less than the value of the function tolerance.
B = 2×1
1.0e+06 * 0.0000 1.3517
fv = 293.7237
xv = linspace(min(x), max(x), 150);
yv = yfcn2(B,xv);
figure
loglog(x, y, '.', 'DisplayName','Data')
hold on
plot(xv, yv, '-r', 'DisplayName','Regression')
hold off
grid
xlabel('X')
ylabel('Y')
legend('Location','best')
text(min(xlim)+0.01*diff(xlim), min(ylim)+0.01*diff(ylim), sprintf('$y = (1 + (1-%.2f) \\cdot x \\cdot %.2f)^\\frac{1}{1-%.2f}$',B(2),B(1),B(2)), 'Interpreter','latex', 'FontSize',12)
The parameters are negative, so the display ed equation looks slightly strange, however there is no way in fminsearch to constrain them. If you have the Optimization Toolbox, use the lsqcurvefit function instead, and set the ‘lb’ srgument to zeros(1,2) to constrain them to be positive. I do not know if the regression will converge under those constraints, however.. (The negative values are ignored in the loglog plot because the logarithms of negative values are complex, and the logarithm of zero is negative infinity.)
Using lsqcurvefit with constrained parameters does not converge in any meaningful sense.
.
Alex Sha
Alex Sha on 4 Apr 2023
Maybe the original fitting function: y = [1 + (1 - q) * x * m]^1/(1 - q)
should be: y = [1 + (1 - q) * x * m]^(1/(1 - q))
if so, the results will become a little better.

Sign in to comment.

Products


Release

R2019b

Community Treasure Hunt

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

Start Hunting!