How can I fit an exponential curve?

6 ビュー (過去 30 日間)
fengsen huang
fengsen huang 2018 年 11 月 15 日
回答済み: Arturo Gonzalez 2020 年 9 月 8 日
Below is an example of finding a fit with only one term of exponential term but I dont know how to find the fit of the curve when it has 2 degree of exponential term, i.e.[y = a*e^(bx) + c*e^(dx)]
example for y = a*e^(bx)
phi =[ones(size(xx)),xx];
aa=phi\log(yy);
yfit = exp(phi*aa);
plot(xx, yy, ro, xx, yfit, k-) ;
s=sprintf(y=%8fexp(%8fx)’,exp(aa(1)),aa(2));
exp.jpg

採用された回答

Star Strider
Star Strider 2018 年 11 月 15 日
編集済み: Star Strider 2018 年 11 月 15 日
Try this:
filename1 = 'x2.mat';
D1 = load(filename1);
x = D1.x2;
filename2 = 'y2.mat';
D2 = load(filename2);
y = D2.y2;
fcn = @(b,x) b(1).*exp(b(2).*x) + b(3).*exp(b(4).*x);
[B,fval] = fminsearch(@(b) norm(y - fcn(b,x)), ones(4,1));
figure
plot(x, y, 'p')
hold on
plot(x, fcn(B,x), '-')
hold off
grid
The fitted parameters are:
B =
1.13024777245481
-2.75090020576997
-2.09865110252493
-5.48051415288241
How can I fit an exponential curve - 2018 11 14.png
EDIT — Added plot figure.
  9 件のコメント
fengsen huang
fengsen huang 2018 年 11 月 15 日
編集済み: madhan ravi 2018 年 11 月 15 日
fcn = @(b,x) b(1).*exp(b(2).*x) + b(3).*exp(b(4).*x);
[B,fval] = fminsearch(@(b) norm(y - fcn(b,x)), ones(4,1))
Hi, can you kindly explain what those 2 lines mean
also how do you know this fit is the most appropriate i.e R^2 value or something?
Thank you so much appreciate it
Star Strider
Star Strider 2018 年 11 月 15 日
編集済み: Star Strider 2018 年 11 月 15 日
This line:
fcn = @(b,x) b(1).*exp(b(2).*x) + b(3).*exp(b(4).*x);
is the objective function, the expression that describes the function to fit to the data.
This line:
[B,fval] = fminsearch(@(b) norm(y - fcn(b,x)), ones(4,1))
calls the fminsearch function to fit the function to the data. The norm function compares the function output to the data and returns a single scalar value (the square root of the sum of squares of the difference between the function evaluation and the data here), that fminsearch uses. I refer you to the documentation on fminsearch (link) for details on how it works.
The value would be calculated as:
Rsq = 1 - sum((y - fcn(B,x)).^2) / sum((y - mean(y)).^2)
returning:
Rsq =
0.980214434988184
We are not comparing models, so this is the only statistic available. There are several ways to compare models, a subject much more involved than I will go into here. See any good text on nonlinear parameter estimation for details.
@fengsen huang —
If my Answer helped you solve your problem, please Accept it!

サインインしてコメントする。

その他の回答 (2 件)

Image Analyst
Image Analyst 2018 年 11 月 15 日
Here's another way using fitnlm(). I get
coefficients =
0.0124001386786833
6.04782212479857
-1.14123018111715
-12.6780685424329
formulaString =
'Y = 0.012 * exp(6.048 * X) + -1.141 * exp(-12.678 * X)'
Quite a bit different than Star's numbers.
0000 Screenshot.png

Arturo Gonzalez
Arturo Gonzalez 2020 年 9 月 8 日
Per this answer, you can do it with the following matlab code
clear all;
clc;
% get data
dx = 0.001;
x = (dx:dx:1.5)';
y = -1 + 5*exp(0.5*x) + 4*exp(-3*x) + 2*exp(-2*x);
% calculate n integrals of y and n-1 powers of x
n = 3;
iy = zeros(length(x), n);
xp = zeros(length(x), n+1);
iy(:,1) = cumtrapz(x, y);
xp(:,1) = x;
for ii=2:1:n
iy(:, ii) = cumtrapz(x, iy(:, ii-1));
xp(:, ii) = xp(:, ii-1) .* x;
end
xp(:, n+1) = ones(size(x));
% get exponentials lambdas
Y = [iy, xp];
A = pinv(Y)*y;
Ahat = [A(1:n)'; [eye(n-1), zeros(n-1, 1)]];
lambdas = eig(Ahat);
lambdas
% get exponentials multipliers
X = [ones(size(x)), exp(lambdas'.*x)];
P = pinv(X)*y;
P
% show estimate
y_est = X*P;
figure();
plot(x, y); hold on;
plot(x, y_est, 'r--');

カテゴリ

Help Center および File ExchangeGet Started with Curve Fitting Toolbox についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by