功能:处理振动周期函数
类  :ClassByOptFunForVibration
说明:
1. 本类主要拟合如下一类函数
$$
\begin{aligned}
x(t)&=\underbrace{\alpha+\sum_{i=1}^{n_1}a_it^i}_{趋势项}
\\
&+\underbrace{\sum_{i=1}^{n_2}\exp(-\beta_it)(b_i+g_it)+\sum_{i=1}^{n_3}(d_i\exp(-\gamma_it)+e_i)\cos(w_it+r_i)}_{振动项}
\\
&+\underbrace{\sum_{i=1}^{n_4}\dfrac{2h_i}{\pi}\dfrac{p_i}{4(t-c_i)^2+ p_i^2} + \sum_{i=1}^{n_5}\dfrac{q_i}{\sigma_i\sqrt{2\pi}}\exp(-\dfrac{(t-u_i)^2}{2\sigma_i^2})}_{多峰项}
\end{aligned}
$$
上面(t,x)为已知数据,需要拟合系数。

2. 这个模型包含常规的振动模型以及高斯、洛伦兹峰函数。

3. 这里提供如下函数
//3.1
Dim data(0,0) As Double'这里假设事先有一系列(t,x)的观测数据
Dim vMin(0), vMax(0), a(0) As Double
Dim obj As New ClassByOptFunForVibration
Dim n1 As Integer = 3
Dim n2 As Integer = 2
Dim n3 As Integer = 3
Dim n4 As Integer = 1
Dim n5 As Integer = 0
obj.Init(n1, n2, n3, n4, n5)'n1,n2,n3,n4,n5含义参考上面第1点的表达式
obj.SetConst(true)'是否包含上面第1点表达式常数项$\alpha$
obj.SetData(xy)'data为2维数据,第1列为t,第2列为x
obj.AutoRange()'自动处理变量上下限
obj.GetRange(vMin, vMax)'获取变量上下限
API_SetMatrix("vMin", vMin)'优化窗口设置vMin为下限
API_SetMatrix("vMax", vMax)'优化窗口设置vMax为上限

//3.2 优化每一步调用
Dim var(0) As Double
Dim error As Double = obj.CalcError(var)'根据变量var计算当前拟合误差平方和

//3.3 优化结束时
Dim var(0) As Double
obj.SetVar(var)
obj.CalcError()
Dim res As String = obj.GetResult()
ShowLatex(res)'显示结果

Dim params As Double() = obj.GetAllParam()'导出所有参数变量
obj.SetAllParam(params)'设置所有参数变量,当obj使用3.1初始化成功后,可以直接执行本操作，设置所有参数
Dim x As Object  = obj.CalcExpress(t)'计算t时刻对应的值x,这里t可以为数值,可以为一维数据,可以为2维数据
Dim dx As Object  = obj.CalcFirstDiff(t)'计算t时刻对应的一阶导数,这里t可以为数值,可以为一维数据,可以为2维数据
Dim dx2 As Object = obj.CalcSecondDiff(t)'计算t时刻对应的二阶导数,这里t可以为数值,可以为一维数据,可以为2维数据