2.8 Prony's method for non-linear exponential fitting
Helptext:
USAGE [alpha,c,rms] = expfit( deg, x1, h, y )
Prony's method for non-linear exponential fitting
Fit function: \sum_1^{deg} c(i)*exp(alpha(i)*x)
Elements of data vector y must correspond to
equidistant x-values starting at x1 with stepsize h
The method is fully compatible with complex linear
coefficients c, complex nonlinear coefficients alpha
and complex input arguments y, x1, non-zero h .
Fit-order deg must be a real positive integer.
Returns linear coefficients c, nonlinear coefficients
alpha and root mean square error rms. This method is
known to be more stable than 'brute-force' non-linear
least squares fitting.
Example
x0 = 0; step = 0.05; xend = 5; x = x0:step:xend;
y = 2*exp(1.3*x)-0.5*exp(2*x);
error = (rand(1,length(y))-0.5)*1e-4;
[alpha,c,rms] = expfit(2,x0,step,y+error)
alpha =
2.0000
1.3000
c =
-0.50000
2.00000
rms = 0.00028461
The fit is very sensitive to the number of data points.
It doesn't perform very well for small data sets.
Theoretically, you need at least 2*deg data points, but
if there are errors on the data, you certainly need more.
Be aware that this is a very (very,very) ill-posed problem.
By the way, this algorithm relies heavily on computing the
roots of a polynomial. I used 'roots.m', if there is
something better please use that code.
Demo for a complex fit-function:
deg= 2; N= 20; x1= -(1+i), x= linspace(x1,1+i/2,N).';
h = x(2) - x(1)
y= (2+i)*exp( (-1-2i)*x ) + (-1+3i)*exp( (2+3i)*x );
A= 5e-2; y+= A*(randn(N,1)+randn(N,1)*i); % add complex noise
[alpha,c,rms]= expfit( deg, x1, h, y )