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

标签 matlab curve-fitting

我有一些数据点需要拟合以下形式的指数曲线

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)在最小二乘意义上是困难的。您不能为此使用线性最小二乘法,因为模型参数(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;

(这里我假设 x 和 y 是列向量。)

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

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

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

关于matlab - 没有曲线拟合工具箱的指数曲线拟合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29634183/

相关文章:

r - 黄土拟合和结果方程

python - 将高斯拟合到测量峰值

c++ - 我如何才能使 matlab 精度与 C++ 中的精度相同?

Matlab:如何对不包括NaN的数据下降进行排序

arrays - 如何找到一个向量中最接近(最近)的值到另一个向量?

curve-fitting - 具有已知端点的贝塞尔曲线拟合

python - 如何在 python 中正确地适应 beta 分布?

python - 如何用Python确定拟合参数的不确定性?

matlab - 如何在 MATLAB 中将矩阵变为 1+j、1-j、-1+j、-1-j

matlab - MATLAB 中的 1 行 try/catch 等价物