exponential regression functions with error in input values
5 views (last 30 days)
Show older comments
Benjamin Wilson
on 22 Nov 2023
Answered: Star Strider
on 22 Nov 2023
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!
0 Comments
Accepted Answer
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);
% use built-in lsqcurvefit
pfit2 = lsqcurvefit(yfit,p0,x,y);
% 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))
0 Comments
More Answers (1)
Star Strider
on 22 Nov 2023
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))
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.
.
0 Comments
See Also
Categories
Find more on Interpolation 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!