没有曲线拟合工具箱的指数曲线拟合?
Exponential curve fitting without the Curve Fitting toolbox?
我有一些数据点需要拟合
形式的指数曲线
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
...
的值
进行对数变换然后使用线性回归应该可以做到。维基百科有一个很好的部分介绍如何做到这一点:
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
我确定可以清理代码,但这就是它的要点。
拟合形式的曲线
y = b * exp(a / x)
某些数据点(xi, yi)
在最小二乘意义上是困难的。您不能为此使用线性最小二乘法,因为模型参数(a
和 b
)不会以仿射方式出现在方程中。除非您准备好使用某种非线性最小二乘法,否则另一种方法是修改优化问题,以便修改后的问题 可以 使用线性最小二乘法求解(此过程是有时称为 "data linearization")。让我们这样做吧。
假设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));
虽然这些值通常不是原始问题的最优值,但在实践中它们通常是 "good enough"。如果需要,您始终可以将它们用作某些迭代非线性最小二乘法的初始猜测。
我有一些数据点需要拟合
形式的指数曲线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
...
进行对数变换然后使用线性回归应该可以做到。维基百科有一个很好的部分介绍如何做到这一点: 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
我确定可以清理代码,但这就是它的要点。
拟合形式的曲线
y = b * exp(a / x)
某些数据点(xi, yi)
在最小二乘意义上是困难的。您不能为此使用线性最小二乘法,因为模型参数(a
和 b
)不会以仿射方式出现在方程中。除非您准备好使用某种非线性最小二乘法,否则另一种方法是修改优化问题,以便修改后的问题 可以 使用线性最小二乘法求解(此过程是有时称为 "data linearization")。让我们这样做吧。
假设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));
虽然这些值通常不是原始问题的最优值,但在实践中它们通常是 "good enough"。如果需要,您始终可以将它们用作某些迭代非线性最小二乘法的初始猜测。