反比例函数方程拟合
如果对于一组数据,它满足
y
=
a
x
+
b
y= \frac{a}{x}+b
y=xa+b,很容易求出a和b来。
但是,由于有反比例的存在,导致在x趋于0时,y趋于无穷,这也限制了它的应用。
于是我就想,能不能把x平移一段距离,然后再预测呢?写成表达式就是
y
=
a
x
+
c
+
b
y= \frac{a}{x+c}+b
y=x+ca+b,这样的话,如果c大于0,那么就表示y存在初始值(在x=0时有界),同时,它很好的保留了反比例函数单减(增)、且最后收敛到某一个值的性质。
但是,由于我不知道它叫什么名字,所以搜索了半天后,决定自己推导。
推导过程
首先,声明一点,我不确定我的这个做法是否正确,同时,在我做完后发现,c总是小于0,这导致了数据预测不准确,目前我没有什么好的改进方法,希望各位大佬帮忙指点。
-
设 y = a x + c + b + ϵ y=\frac{a}{x+c}+b+\epsilon y=x+ca+b+ϵ,则 y − a x + c − b = ϵ y-\frac{a}{x+c}-b=\epsilon y−x+ca−b=ϵ。我们希望 ϵ \epsilon ϵ的值尽可能接近0,则正常情况下,我们转化为求如下表达式的最小值: Q = ∑ i = 1 n ( y i − a x i + c − b ) 2 = ∑ i = 1 n ϵ i 2 Q=\sum_{i=1}^n (y_i-\frac{a}{x_i+c}-b) ^{2}=\sum_{i=1}^n \epsilon_i^2 Q=∑i=1n(yi−xi+ca−b)2=∑i=1nϵi2。此时我们就将 Q Q Q看作是关于 a a a和 b b b的函数,即为 Q ( a , b ) Q(a,b) Q(a,b),然后对它求偏导,求得 a a a和 b b b的值。
-
但由于有分式的存在,在求偏导时,除了数值计算,我想不到其他好的解法了,所以我索性换了一种评价方式,我们对式子变形得到: ( y − b ) ( x + c ) − a = ϵ ( x + c ) (y-b)(x+c)-a=\epsilon(x+c) (y−b)(x+c)−a=ϵ(x+c),这个式子表明,如果,在 x + c > 0 x+c>0 x+c>0的情况下, x x x越大,要想使得 ( y − b ) ( x + c ) − a (y-b)(x+c)-a (y−b)(x+c)−a接近0,则 ϵ \epsilon ϵ必须越小。但是,在 x + c ≈ 0 x+c\approx0 x+c≈0的情况下,误差就会十分的明显,所以,我们应该想办法避免这种情况的发生。(但事实是我不会避免,求大神帮忙)
-
我们转化为求如下表达式的最小值: Q = ∑ i = 1 n [ ( y i − b ) ( x i + c ) − a ] 2 Q=\sum_{i=1}^n [(y_i-b)(x_i+c)-a]^{2} Q=∑i=1n[(yi−b)(xi+c)−a]2。对 Q Q Q求偏导得到:
∂ Q ∂ a = − 2 ∑ i = 1 n [ ( y i − b ) ( x i + c ) − a ] \frac{\partial {Q}}{\partial {a}}=-2\sum_{i=1}^n [(y_i-b)(x_i+c)-a] ∂a∂Q=−2∑i=1n[(yi−b)(xi+c)−a]
∂ Q ∂ b = − 2 ∑ i = 1 n [ ( y i − b ) ( x i + c ) − a ] ( x i + c ) \frac{\partial {Q}}{\partial {b}}=-2\sum_{i=1}^n [(y_i-b)(x_i+c)-a](x_i+c) ∂b∂Q=−2∑i=1n[(yi−b)(xi+c)−a](xi+c)
∂ Q ∂ c = 2 ∑ i = 1 n [ ( y i − b ) ( x i + c ) − a ] ( y i − b ) \frac{\partial {Q}}{\partial {c}}=2\sum_{i=1}^n [(y_i-b)(x_i+c)-a](y_i-b) ∂c∂Q=2∑i=1n[(yi−b)(xi+c)−a](yi−b)
令 ∂ Q ∂ a = ∂ Q ∂ b = ∂ Q ∂ c = 0 \frac{\partial {Q}}{\partial {a}}=\frac{\partial {Q}}{\partial {b}}=\frac{\partial {Q}}{\partial {c}}=0 ∂a∂Q=∂b∂Q=∂c∂Q=0得:
∑ i = 1 n [ ( y i − b ) ( x i + c ) − a ] = 0 … … ( 1 ) \sum_{i=1}^n [(y_i-b)(x_i+c)-a]=0 ……(1) ∑i=1n[(yi−b)(xi+c)−a]=0……(1)
∑ i = 1 n [ ( y i − b ) ( x i + c ) − a ] ( x i + c ) = 0 … … ( 2 ) \sum_{i=1}^n [(y_i-b)(x_i+c)-a](x_i+c)=0……(2) ∑i=1n[(yi−b)(xi+c)−a](xi+c)=0……(2)
∑ i = 1 n [ ( y i − b ) ( x i + c ) − a ] ( y i − b ) = 0 … … ( 3 ) \sum_{i=1}^n [(y_i-b)(x_i+c)-a](y_i-b)=0……(3) ∑i=1n[(yi−b)(xi+c)−a](yi−b)=0……(3) -
我们将(1)代入(2)(3)化简,令 s u m x sumx sumx= ∑ i = 1 n x \sum_{i=1}^n x ∑i=1nx, s u m y sumy sumy= ∑ i = 1 n y \sum_{i=1}^n y ∑i=1ny
展开得:
∑ i = 1 n x i y i n + s u m y n c − s u m x n b − b c = a … … ( 4 ) \frac{\sum_{i=1}^n x_iy_i}{n}+\frac{sumy}{n}c-\frac{sumx}{n}b-bc=a……(4) n∑i=1nxiyi+nsumyc−nsumxb−bc=a……(4)
∑ i = 1 n x i 2 y i s u m x + ∑ i = 1 n x i y i s u m x c − ∑ i = 1 n x i 2 s u m x b − b c = a … … ( 5 ) \frac{\sum_{i=1}^n x_i^2y_i}{sumx}+\frac{\sum_{i=1}^n x_iy_i}{sumx}c-\frac{\sum_{i=1}^n x_i^2}{sumx}b-bc=a……(5) sumx∑i=1nxi2yi+sumx∑i=1nxiyic−sumx∑i=1nxi2b−bc=a……(5)
∑ i = 1 n x i y i s u m y + ∑ i = 1 n y i 2 s u m y c − ∑ i = 1 n x i y i s u m y b − b c = a … … ( 6 ) \frac{\sum_{i=1}^n x_iy_i}{sumy}+\frac{\sum_{i=1}^n y_i^2}{sumy}c-\frac{\sum_{i=1}^n x_iy_i}{sumy}b-bc=a……(6) sumy∑i=1nxiyi+sumy∑i=1nyi2c−sumy∑i=1nxiyib−bc=a……(6)
令 k = a + b c k=a+bc k=a+bc,则我们可以得到:
s u m y n c − s u m x n b − k = − ∑ i = 1 n x i y i n … … ( 7 ) \frac{sumy}{n}c-\frac{sumx}{n}b-k=-\frac{\sum_{i=1}^n x_iy_i}{n}……(7) nsumyc−nsumxb−k=−n∑i=1nxiyi……(7)
∑ i = 1 n x i y i s u m x c − ∑ i = 1 n x i 2 s u m x b − k = − ∑ i = 1 n x i 2 y i s u m x … … ( 8 ) \frac{\sum_{i=1}^n x_iy_i}{sumx}c-\frac{\sum_{i=1}^n x_i^2}{sumx}b-k=-\frac{\sum_{i=1}^n x_i^2y_i}{sumx}……(8) sumx∑i=1nxiyic−sumx∑i=1nxi2b−k=−sumx∑i=1nxi2yi……(8)
∑ i = 1 n y i 2 s u m y c − ∑ i = 1 n x i y i s u m y b − k = − ∑ i = 1 n x i y i s u m y … … ( 9 ) \frac{\sum_{i=1}^n y_i^2}{sumy}c-\frac{\sum_{i=1}^n x_iy_i}{sumy}b-k=-\frac{\sum_{i=1}^n x_iy_i}{sumy}……(9) sumy∑i=1nyi2c−sumy∑i=1nxiyib−k=−sumy∑i=1nxiyi……(9)
这样我们就可以通过matlab计算出来 b b b、 c c c、 k k k的值了。
令 A = [ s u m y n − s u m x n − 1 ∑ i = 1 n x i y i s u m x − ∑ i = 1 n x i 2 s u m x − 1 ∑ i = 1 n y i 2 s u m y − ∑ i = 1 n x i y i s u m y − 1 ] A=\left[ \begin{matrix} \frac{sumy}{n} & -\frac{sumx}{n} & -1\\ \frac{\sum_{i=1}^n x_iy_i}{sumx} & -\frac{\sum_{i=1}^n x_i^2}{sumx} &-1\\ \frac{\sum_{i=1}^n y_i^2}{sumy} & -\frac{\sum_{i=1}^n x_iy_i}{sumy} & -1\\ \end{matrix} \right] A=⎣⎢⎡nsumysumx∑i=1nxiyisumy∑i=1nyi2−nsumx−sumx∑i=1nxi2−sumy∑i=1nxiyi−1−1−1⎦⎥⎤
B = [ − ∑ i = 1 n x i y i n − ∑ i = 1 n x i 2 y i s u m x − ∑ i = 1 n x i y i s u m y ] B=\left[ \begin{matrix} -\frac{\sum_{i=1}^n x_iy_i}{n} \\ -\frac{\sum_{i=1}^n x_i^2y_i}{sumx}\\ -\frac{\sum_{i=1}^n x_iy_i}{sumy}\\ \end{matrix} \right] B=⎣⎢⎡−n∑i=1nxiyi−sumx∑i=1nxi2yi−sumy∑i=1nxiyi⎦⎥⎤
X = [ c b k ] X=\left[ \begin{matrix} c\\ b\\ k\\ \end{matrix} \right] X=⎣⎡cbk⎦⎤
所以,式子改写成: A X = B AX=B AX=B
所以,解得 X = A − 1 B X=A^{-1}B X=A−1B
然后,我们就可以求出a的值了: a = k − b c a=k-bc a=k−bc
缺点
可以看出,推导中完全没有考虑
x
+
c
<
0
x+c<0
x+c<0的请况,因此,完全有可能出现我们想拟合一条曲线,但是发现它反而拟合出了奇点。我在此提供一组数据,它就拟合出了奇点。
x从1到17
y=13.5
13.5
13.1
13.1
14.7
15.6
14.5
14.5
13.8
11.8
11.86
9.9
8.2
8.5
8.35
8.2
7.00
拟合出来的曲线为:
不过,我们可以看出,它在后面工作的还是很好的。而通过我多次用matlab模拟发现,它不太常出现奇点,所以,还是可以使用的。