0

我已经阅读了 fsolve 和 solve,并尝试了各种曲线拟合/回归方法,但我觉得我需要一些指导,然后再花更多时间尝试做一些可能是错误方法的工作。

我有一系列方程,我试图分别拟合数据集 (x):

例如:

(a+b*c)*d = x
a*(1+b*c)*d = x

x = 1.9248 3.0137 4.0855 5.0097 5.7226 6.2064 6.4655 6.5108 6.3543 6.0065

c= 0.0200 0.2200 0.4200 0.6200 0.8200 1.0200 1.2200 1.4200 1.6200 1.8200

d = 1.2849 2.2245 3.6431 5.6553 8.3327 11.6542 15.4421 19.2852 22.4525 23.8003

我知道 c、d 和 x - 它们是观察值。我的未知数是 a 和 b,应该是常数。

我可以为每个 x 观察手动完成,但必须有一种自动且优越得多的方法,或者至少是另一种方法。

非常感谢我能得到一些指导。谢谢你的时间!

4

3 回答 3

2

给定您的两个示例方程式;让y=x./d,然后

  • y = a+b*c
  • y = a+a*b*c

第一种情况只是一条线,您可以获得最小二乘拟合(a和的值bpolyfit()。在第二种情况下,您可以只说 k=a*b (因为无论如何它们都适合),然后将其重写为:

  • y = a+k*c

这与第一个问题完全相同,除了现在 b = k/a。事实上,b=b1/a 是第二个问题的解,其中 b1 是第一个问题的拟合。简而言之,要解决这两个问题,您需要一个电话polyfit()和几个部门。

这对你有用吗?

于 2013-08-30T01:31:16.583 回答
1

我看到两个不同的方程适合这里。拼写代码:

为了(a+b*c)*d = x

p = polyfit(c, x./d, 1);
a = p(2);
b = p(1);

为了a*(1+b*c)*d = x

p = polyfit(c, x./d, 1);
a = p(2);
b = p(1) / a;
于 2013-08-30T01:44:21.910 回答
0

不需要polyfit;这只是一个线性最小二乘问题,最好用 MATLAB 的slash运算符解决:

>> ab = [ones(size(c)) c] \ (x./d)
ans =
   1.411437211703194e+000  % 'a'
  -7.329687661579296e-001  % 'b'

更快、更清洁、更有教育意义:)

而且,正如 Emmet 已经说过的,您的第二个方程式只不过是您的第一个方程式的不同形式,不同之处b在于您的第一个方程式中的 等于a*b您的第二个方程式。

于 2013-09-02T12:37:27.943 回答