Matlab上的对数最小二乘法

时间:2013-01-28 01:25:13

标签: matlab logarithm least-squares data-fitting

如何使用此功能y=(a*x)./(b+x)来估算此数据 x = [1.5 4 5 8 12 16 17]y = [1.6 2.6 2.4 3.2 3.4 3.6 3.4]使用matlab进行最小二乘法?

我使用了对数并获得了log(y)=log(a*x)-log(b+x)。结果不是我需要它的y = a*x + b形式。 a它不应该与x相乘,但它会被添加到log(y)=log(a)+log(x)-log(b)。所以我不知道接下来该做什么。我知道要执行y=b*x.^ay=b*exp.(x*a)的代码,但我不知道如何解决此问题。

1 个答案:

答案 0 :(得分:3)

嗯,我认为是时候回到代数1. log(b + x)与log(b)不同。你无法使用日志解决这个问题,至少不是你尝试过的。

只要你愿意快速松散地使用错误结构(即使你不知道这意味着什么,它仍然很重要)然后假设你反转了什么?

1/y = (b+x)/(ax) = b/(ax) + 1/a

转换问题,以便

c = b/a
d = 1/a
u = 1/x
v = 1/y

现在我们有了

v = cu + d

解决这个线性回归问题,然后从c和d中恢复a和b。

在MATLAB中,简单。

x = [1.5 4 5 8 12 16 17];
y = [1.6 2.6 2.4 3.2 3.4 3.6 3.4];

u = 1./x;
c_d = polyfit(u,1./y,1)
c = c_d(1);
d = c_d(2);

a = 1./d
a =
          3.90554889035516

b = c*a
b =
          2.19394529536478

绘制拟合的结果。

ezplot(@(x) a.*x./(b+x),[1.5 17])
hold on
plot(x,y,'ro')

enter image description here