【问题标题】:Exponential curve fitting without the Curve Fitting toolbox?没有曲线拟合工具箱的指数曲线拟合?
【发布时间】:2015-06-20 11:12:21
【问题描述】:

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

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...

【问题讨论】:

  • 而且...你到底卡在哪里了?你怎么尝试没有给你预期的结果?请提供更多详细信息。
  • 感谢您的回复,我已编辑。任何帮助将不胜感激
  • 嗨,我正在测试它,我已经休息了几天。很快就会更新,感谢您的帮助

标签: matlab curve-fitting


【解决方案1】:

拟合形状的曲线

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

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

【讨论】:

    【解决方案2】:

    进行对数变换然后使用线性回归应该可以做到。维基百科有一个很好的部分介绍了如何做到这一点: 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
    

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

    【讨论】:

      猜你喜欢
      • 2015-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-13
      • 1970-01-01
      • 2015-03-22
      • 1970-01-01
      相关资源
      最近更新 更多