2

如何使用这个函数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那样乘以,而是被添加到它上面,因为. 所以我不知道下一步该怎么做。我知道要执行的代码and ,但我不知道如何解决这个问题。xlog(y)=log(a)+log(x)-log(b)y=b*x.^ay=b*exp.(x*a)

4

1 回答 1

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')

在此处输入图像描述

于 2013-01-28T04:22:21.090 回答