指数曲线拟合matlab
Exponential curve fit matlab
我有以下等式:
我想使用 MATLAB 对上述等式进行指数曲线拟合,其中 y = f(u,a)
。 y
是我的输出,而 (u,a)
是我的输入。我想找到一组提供的数据的系数 A,B
。
我知道如何通过定义状态对简单多项式执行此操作。例如,如果 states= (ones(size(u)), u u.^2)
,这将给我 L+Mu+Nu^2
,其中 L
、M
和 N
是回归系数。
然而,上述等式并非如此。我如何在 MATLAB 中执行此操作?
一种方法是使用 log(y) 关于 u² 和 a³ 的线性回归:
假设u
、a
、y
是等长的列向量:
AB = [u .^ 2, a .^ 3] \ log(y)
之后,AB(1)
为A的拟合值,AB(2)
为B的拟合值。计算使用Matlab的mldivide
operator; an alternative would be to use the pseudo-inverse.
以这种方式找到的拟合值是参数的最大似然估计,假设与精确方程的偏差是常量方差正态分布误差加到 A u² + B a³ 上。如果偏差的实际来源与此不同,则这些估计可能不是最佳的。
根据@eigenchris 所说的,只需对等式两边取自然对数(log
在 MATLAB 中)。如果我们这样做,我们实际上会将 log
space 中的方程线性化。换句话说,给定您的原始等式:
我们得到:
但是,这不完全是多项式回归。这更多是 least squares fitting 你的观点。具体来说,给定一组 y
和一对 (u,a)
点,您将构建一个方程组并通过最小二乘法求解该系统。换句话说,给定集合 y = (y_0, y_1, y_2,...y_N)
和 (u,a) = ((u_0, a_0), (u_1, a_1), ..., (u_N, a_N))
,其中 N
是您拥有的点数,您可以像这样构建方程组:
这可以写成矩阵形式:
要求解 A
和 B
,您只需找到 least-squares 解。可以看到是这样的形式:
Y = AX
为了求解 X
,我们使用所谓的 pseudoinverse。因此:
X = A^{*} * Y
A^{*}
是伪逆。这可以在 MATLAB 中使用 \
或 mldivide
运算符雄辩地完成。您所要做的就是构建一个 y
值的向量,并使用 log
值,以及构建 u
和 a
值的矩阵。因此,如果你的点 (u,a)
分别存储在 U
和 A
中,以及 y
的值存储在 Y
中,你只需这样做:
x = [u.^2 a.^3] \ log(y);
x(1)
将包含 A
的系数,而 x(2)
将包含 B
的系数。正如 A. Donda 在他的回答中指出的那样(我尴尬地忘记了这一点),A
和 B
的值是假设相对于您试图拟合的确切曲线的误差是常量方差的正态(高斯)分布。误差也需要是累加的。如果不是这种情况,那么您获得的参数可能并不代表最佳匹配。
有关 least-squares 拟合采用的假设的更多详细信息,请参阅此维基百科页面:
http://en.wikipedia.org/wiki/Least_squares#Least_squares.2C_regression_analysis_and_statistics
我有以下等式:
我想使用 MATLAB 对上述等式进行指数曲线拟合,其中 y = f(u,a)
。 y
是我的输出,而 (u,a)
是我的输入。我想找到一组提供的数据的系数 A,B
。
我知道如何通过定义状态对简单多项式执行此操作。例如,如果 states= (ones(size(u)), u u.^2)
,这将给我 L+Mu+Nu^2
,其中 L
、M
和 N
是回归系数。
然而,上述等式并非如此。我如何在 MATLAB 中执行此操作?
一种方法是使用 log(y) 关于 u² 和 a³ 的线性回归:
假设u
、a
、y
是等长的列向量:
AB = [u .^ 2, a .^ 3] \ log(y)
之后,AB(1)
为A的拟合值,AB(2)
为B的拟合值。计算使用Matlab的mldivide
operator; an alternative would be to use the pseudo-inverse.
以这种方式找到的拟合值是参数的最大似然估计,假设与精确方程的偏差是常量方差正态分布误差加到 A u² + B a³ 上。如果偏差的实际来源与此不同,则这些估计可能不是最佳的。
根据@eigenchris 所说的,只需对等式两边取自然对数(log
在 MATLAB 中)。如果我们这样做,我们实际上会将 log
space 中的方程线性化。换句话说,给定您的原始等式:
我们得到:
但是,这不完全是多项式回归。这更多是 least squares fitting 你的观点。具体来说,给定一组 y
和一对 (u,a)
点,您将构建一个方程组并通过最小二乘法求解该系统。换句话说,给定集合 y = (y_0, y_1, y_2,...y_N)
和 (u,a) = ((u_0, a_0), (u_1, a_1), ..., (u_N, a_N))
,其中 N
是您拥有的点数,您可以像这样构建方程组:
这可以写成矩阵形式:
要求解 A
和 B
,您只需找到 least-squares 解。可以看到是这样的形式:
Y = AX
为了求解 X
,我们使用所谓的 pseudoinverse。因此:
X = A^{*} * Y
A^{*}
是伪逆。这可以在 MATLAB 中使用 \
或 mldivide
运算符雄辩地完成。您所要做的就是构建一个 y
值的向量,并使用 log
值,以及构建 u
和 a
值的矩阵。因此,如果你的点 (u,a)
分别存储在 U
和 A
中,以及 y
的值存储在 Y
中,你只需这样做:
x = [u.^2 a.^3] \ log(y);
x(1)
将包含 A
的系数,而 x(2)
将包含 B
的系数。正如 A. Donda 在他的回答中指出的那样(我尴尬地忘记了这一点),A
和 B
的值是假设相对于您试图拟合的确切曲线的误差是常量方差的正态(高斯)分布。误差也需要是累加的。如果不是这种情况,那么您获得的参数可能并不代表最佳匹配。
有关 least-squares 拟合采用的假设的更多详细信息,请参阅此维基百科页面:
http://en.wikipedia.org/wiki/Least_squares#Least_squares.2C_regression_analysis_and_statistics