我有一些数据点需要拟合以下形式的指数曲线
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
的值...
最佳答案
拟合形状的曲线
y = b * exp(a / x)
对于一些数据点(xi, yi)
在最小二乘意义上是困难的。您不能为此使用线性最小二乘法,因为模型参数(a
和 b
)不会以仿射方式出现在方程中。除非您准备好使用某种非线性最小二乘方法,否则另一种方法是修改优化问题,以便可以使用线性最小二乘法解决修改后的问题(此过程有时称为“数据线性化”)。让我们这样做吧。
假设b
和yi
均为正数,则可以对方程两边取自然对数:
log(y) = log(b) + a / x
或
a / x + log(b) = log(y)
通过引入一个新参数b2
,定义为log(b)
,很明显参数a
和b2
以线性(实际上是仿射)方式出现在新方程中:
a / x + b2 = log(y)
因此,您可以使用最小二乘法计算这些参数的最佳值;您剩下要做的就是构造正确的线性系统,然后使用 MATLAB 的反斜杠运算符求解它:
A = [1 ./ x, ones(size(x))];
B = log(y);
params_ls = A \ B;
(这里我假设 x 和 y 是列向量。)
然后,修改后的问题的最优值(在最小二乘意义上)由下式给出:
a_ls = params_ls(1);
b_ls = exp(params_ls(2));
虽然这些值通常对于原始问题来说并不是最优的,但在实践中它们通常“足够好”。如果需要,您始终可以将它们用作某些迭代非线性最小二乘方法的初始猜测。
关于matlab - 没有曲线拟合工具箱的指数曲线拟合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29634183/