我有一些数据点需要符合表格的指数曲线
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
...
答案 0 :(得分:2)
拟合表格的曲线
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));
虽然这些值通常不是原始问题的最佳值,但它们在实践中通常“足够好”。如果需要,您可以始终将它们用作某些迭代非线性最小二乘法的初始猜测。
答案 1 :(得分:0)
执行日志转换然后使用线性回归应该这样做。维基百科有一个很好的部分,如何做到这一点: 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
我确定代码可以清理,但这是它的要点。