没有曲线拟合工具箱的指数曲线拟合?

Exponential curve fitting without the Curve Fitting toolbox?

我有一些数据点需要拟合

形式的指数曲线
y = B * exp(A/x)

(没有 Curve Fitting Toolbox 的帮助)。

到目前为止,我尝试通过应用对数对模型进行线性化,结果是

log(y/B) = A/x

log(y) = A/x + log(B)

然后我可以把它写成

Y = AX + B

现在,如果我忽略B,那么我可以用

解决它
A = pseudoinverse (X) * Y

但我坚持 B...

的值

进行对数变换然后使用线性回归应该可以做到。维基百科有一个很好的部分介绍如何做到这一点: http://en.wikipedia.org/wiki/Linear_least_squares_%28mathematics%29#The_general_problem

    %MATLAB code for finding the best fit line using least squares method
    x=input('enter a')                      %input in the form of matrix, rows contain points
        a=[1,x(1,1);1,x(2,1);1,x(3,1)]          %forming A of Ax=b
        b=[x(1,2);x(2,2);x(3,2)]                %forming b of Ax=b
        yy=inv(transpose(a)*a)*transpose(a)*b   %computing projection of matrix A on b, giving x
    %plotting the best fit line
      xx=linspace(1,10,50);
      y=yy(1)+yy(2)*xx;
      plot(xx,y)
         %plotting the points(data) for which we found the best fit line
     hold on
        plot(x(2,1),x(2,2),'x')
     hold on
        plot(x(1,1),x(1,2),'x')
     hold on
        plot(x(3,1),x(3,2),'x')
     hold off

我确定可以清理代码,但这就是它的要点。

拟合形式的曲线

y = b * exp(a / x)

某些数据点(xi, yi)在最小二乘意义上是困难的。您不能为此使用线性最小二乘法,因为模型参数(ab)不会以仿射方式出现在方程中。除非您准备好使用某种非线性最小二乘法,否则另一种方法是修改优化问题,以便修改后的问题 可以 使用线性最小二乘法求解(此过程是有时称为 "data linearization")。让我们这样做吧。

假设byi为正数,可以对等式两边取自然对数:

log(y) = log(b) + a / x

a / x + log(b) = log(y)

通过引入一个新参数 b2,定义为 log(b),很明显参数 ab2 以线性(仿射,真的)方式出现在新等式中:

a / x + b2 = log(y)

因此,您可以使用最小二乘法计算这些参数的最优值;您剩下要做的就是构建正确的线性系统,然后使用 MATLAB 的反斜杠运算符对其求解:

A = [1 ./ x, ones(size(x))];
B = log(y);
params_ls = A \ B;

(这里我假设 xy 是列向量。)

然后,修改后的问题的最优值(在最小二乘意义上)由下式给出:

a_ls = params_ls(1);
b_ls = exp(params_ls(2));

虽然这些值通常不是原始问题的最优值,但在实践中它们通常是 "good enough"。如果需要,您始终可以将它们用作某些迭代非线性最小二乘法的初始猜测。