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

时间:2015-04-14 17:53:16

标签: matlab curve-fitting

我有一些数据点需要符合表格的指数曲线

y = B * exp(A/x)

(没有Curve Fitting Toolbox的帮助。)

到目前为止,我尝试通过应用log来线性化模型,结果是

log(y/B) = A/x

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

然后我可以用

形式写出来
Y = AX + B

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

来解决它
A = pseudoinverse (X) * Y

但是我坚持使用B ...

的值

2 个答案:

答案 0 :(得分:2)

拟合表格的曲线

y = b * exp(a / x)

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

假设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));

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

答案 1 :(得分:0)

执行日志转换然后使用线性回归应该这样做。维基百科有一个很好的部分,如何做到这一点: 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

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