数据拟合愚见

1、数据拟合一些基本的东西，比如涉及到积分、微分、甚至隐函数的拟合问题,请参看博文{数据拟合愚见<http://blog.163.com/shikang999@126/blog/static/172624896201463111856714/>}

2、如果涉及到多目标拟合,其本质上还是可以转化为单目标拟合,这个时候可以使用{SymExpressionWeight<矩阵运算\SymExpressionWeight>}或者{SymExpressionWeight2<矩阵运算\SymExpressionWeight2>}函数自定义各个目标的权重比,进而再使用本程序提供的算法求解即可.

3、复数的拟合,当涉及到复数拟合时,本程序目前提供3个复系数相关的函数{PluralSolveEquation<矩阵运算\PluralSolveEquation>}、{nlinFitPluralGA<矩阵运算\nlinFitPluralGA>}、{nlinFitPluralPSO<矩阵运算\nlinFitPluralPSO>}进行求解.

4、因为初值对拟合速度甚至结果有一定影响，因此这里就简单说一下确定数学模型后,拟合非线性问题时,初值的选取的问题。

5、如果已知数学模型，有一定物理意义，则建议根据物理意义选取。

6、当无法确定初值时，且你的数学模型有导数（如果求导模型很复杂甚至没有导数，则可进行简单的差分构造），则可以采用如下的办法进行

步骤:
(1)求出拟合函数的一阶导数【如果有必要求更高阶导数】
(2)使用已知数据求出近似点的一阶导数
(3)代入一阶导数函数以及原函数求得初值近似值

例子:

已知一组数据x、y满足如下关系式，求拟合数据a、b、c、d的初始近似值

y = a + b * (x - c) ^ d

步骤:

(1) y' = b * d * (x - c) ^ (d - 1)

(2)因为已知x、y数据,则根据相应算法求得一组x、y' 的近似值,这里记 f = y' 

(3)将x、y' 代入(1)式的方程得到如下三个方程进而求解出b、c、d

 f[1] = b * d * (x[1] - c) ^ (d - 1)      ①
 f[2] = b * d * (x[2] - c) ^ (d - 1)      ②
 f[3] = b * d * (x[3] - c) ^ (d - 1)      ③
 
(4)取任意一组x、y然后将b、c、d一起代入原方程 y = a + b * (x - c) ^ d 进而可以求得近似值 a

(5)至此 a、b、c、d初始近似值确定完毕！

7、常微分方程拟合
之所以在这里单独列一个点，主要是提供一个求解这类问题的一个快速处理方式：
(1)对于微分项，使用对应差分公式代替，然后按正常流程拟合出对应拟合参数。（由于这个时候的微分使用的差分代替，是比较粗糙的求解的，这个拟合值仅能作为初始值参考）

(2)然后采用使用第(1)点得到的拟合参数作为初始值，常微分方程函数主体采用对应常微分方程求解算法（比如龙格库塔法），然后正常进行非线性拟合。

PS：这种求解方式是先简单粗暴找到一个邻近的解，然后再使用比较精确的算法在这个解附近查找最优值。

(3) 还有另一种方式，对于一个常微分方程 y' = f(x),那么计算积分 y(x1) - y(x0) = int[f(x) , x0 , x1],其中积分可采用现成算法进行计算