exponential regression functions with error in input values

18 views (last 30 days)
Hi, I am trying to fit a regression model that should look like something of the form y = e^(a-bx) for some positive constants a and b. I have been perviously using the linear least squares method after taking the log of both sides and then fitting a linear model and this works. However, due to some erros in my input data this will not work for the occasion where y = 0 for obvious reasons. The issue is I need to fit an exponential line that follows the points for example [4,100], [25,50], [100,0]. This line should remain postive although the point [100,0] is where the failure arises. Any help would be greatly appreciated!

Accepted Answer

Fabio Freschi
Fabio Freschi on 22 Nov 2023
Edited: Fabio Freschi on 22 Nov 2023
you can use lsqnonlin or lsqcurvefit
clear variables, close all
% data
x = [4 25 100];
y = [100 50 0];
% fitting function
yfit = @(p,x) exp(p(1)-p(2)*x);
% nonlin problem
f = @(p) yfit(p,x)-y;
% initial guess
p0 = [1 1];
% use lsqnonlin
pfit1 = lsqnonlin(f,p0);
Local minimum possible. lsqnonlin stopped because the final change in the sum of squares relative to its initial value is less than the value of the function tolerance.
% use built-in lsqcurvefit
pfit2 = lsqcurvefit(yfit,p0,x,y);
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.
% plot
figure,hold on;
plot(x,y,'o')
xfit = linspace(min(x),max(x),100);
plot(xfit,yfit(pfit1,xfit))
plot(xfit,yfit(pfit2,xfit))

More Answers (1)

Star Strider
Star Strider on 22 Nov 2023
There are other options, however everyone hass fminsearch, so using it —
x = [4; 25; 100];
y = [100; 50; 0];
% objfcn = @(b,x) b(1) .* exp(b(2) - b(3).*x);
objfcn = @(b,x) exp(b(1) - b(2).*x);
[B,nres] = fminsearch(@(b)norm(y - objfcn(b,x)), rand(2,1))
B = 2×1
4.7478 0.0345
nres = 3.9186
xv = linspace(min(x), max(x), 50);
figure
plot(x, y, 'p')
hold on
plot(xv, objfcn(B,xv), '-r')
hold off
grid
The fitnlm function is more robust and provides statistics on the fit. Use the predict function to return the fitted curve and confidence region on the fit.
.

Products


Release

R2023b

Community Treasure Hunt

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

Start Hunting!