功能：高级优化窗口主要是提供更加灵活地求解优化问题

需求：在这个窗口里需要使用VB.NET语言自定义定义误差函数

说明：所谓优化问题，即给定一个误差目标函数，让计算器去寻找满足条件的最优解。这类问题包括：非线性拟合、非线性方程组求解等等。

特点：

1. 支持混合整数优化

2. 支持对变量优化范围进行控制(如果求解效果不理想, 尝试更改变量范围varMax和varMin, 再进行求解)

3. 采用多线程加速求解

4. 有一定程度的自定义操作空间

5. 在设置求解算法时(solveType, 如果求解不理想, 请尝试设置其它算法进行求解),对应算法分类如下:

5.1 效率较高, 内部会求解稠密线性方程组, 适合优化变量个数不是很大的情况, 对应算法有: DogLeg, LM, Grad(一种带缩放的梯度优化算法)

5.2 效率一般, 内部不会求解方程组, 适合优化变量个数较大的情况, 对应算法有: Adma, Nadam, AMSGrad, Adadelta, GradNoEqu(一种带缩放的梯度优化算法)

5.3 效率较低, 适合优化变量个数较大的情况, 对应算法有: Fun(函数直接试探)

6. 自定义代码中的函数funPtr对象提供了一些如下的内部函数

6.1 读取数据
申明: bool API_ReadData(f, x)
说明: 主要读取矩阵变量数据, f为string存储的文件路径,如果为空将打开选择读取文件对话框, 读取成功将数据放到二维数组x,每一行数据以逗号或空格分隔,每列数据以分号或者换行符号分隔. 函数执行成功返回True.
例子:
Dim x(0,0) As Double
API_ReadData("", x)

6.2 保存数据
申明: bool API_WriteData(f, vars)
说明: 主要将数据保存到文件, f为保存文件路径, vars为需要保存的多个数据. 函数执行成功返回True.
例子:
//下面的代码放到RunEnd函数里, 优化完毕后可以查看C:\test.txt文件内容
Dim vars As Object() = new Object(){"error = ", minError, vbCrLf, "loop = ", loopSum, vbCrLf, "var = " , vbCrLf, optVar}
API_WriteData("C:\test.txt", vars)

6.3 求解线性方程组
申明: bool API_SolveEqu(A, b, x)
说明: 主要求解线性方程x,即已知二维数组A,一维数组b,求解一维数组x. 函数执行成功返回True.
例子:
API_SolveEqu(a, b, x)

6.4 自适应一维定积分
申明: double API_IntegralFun1D(fun, var, i, a, b, eps, deep, error)
说明: 
(1)主要使用自适应算法进行一维定积分
(2)fun为指定函数,必须是类似Public Function fun(ByVal v() As Double) As Double这样定义的一个函数
(3)var为传递的一维变量
(4)i表示var中第i个需要积分的变量
(5)a表示积分下限
(6)b表示积分上限
(7)eps设置的误差精度
(8)deep最大分割深度
(9)error最终返回度量结果好坏的误差
(10)函数执行完毕返回积分结果 

例子:
//已知有函数f = y * sin(x) / exp(x)，现在想在 y = 3.6 的情况下，计算x从0.25到正无穷的积分
Public Function funXY(ByVal v() As Double) As Double
    Dim x As Double = v(0)
    Dim y As Double = v(1)
    Dim f As Double = y * Sin(x) / Exp(x)
    Return f
End Function

//然后添加如下代码，运行代码后，可以看z的结果
Dim er As Double
Dim var(1) As Double
var(1) = 3.6
dim z As Double = API_IntegralFun1D(funXY, var, 0, 0.25, inf, 1e-8, 40, er)

6.5 一阶导数
申明: double API_DiffFun1D(fun, var, i)
说明: 
(1)fun为指定函数,必须是类似Public Function fun(ByVal v() As Double) As Double这样定义的一个函数
(2)var为传递的一维变量
(3)i表示var中第i个需要求导数的变量

例子:
//已知有函数f = y * sin(x) / exp(x)，现在想计算x = 2.5, y = 3.6时 df/dx 的值
Public Function funXY(ByVal v() As Double) As Double
    Dim x As Double = v(0)
    Dim y As Double = v(1)
    Dim f As Double = y * Sin(x) / Exp(x)
    Return f
End Function

//然后添加如下代码，运行代码后，可以看z的结果
Dim var(1) As Double
var(0) = 2.5
var(1) = 3.6
dim z As Double = API_DiffFun1D(funXY, var, 0)

6.6 一阶常微分方程组求解
申明: bool API_SolveODE(dxfun, x, h, admas, y)
说明: 
(1)dxfun为指定的一阶导数函数,必须是类似Public Function fun(ByVal x As Double, ByVal y() As Double) As Double()这样定义的一个函数
(2)x为边界初始值
(3)h为每个值的步长
(4)admas为True表示采用改进的4阶亚当姆斯预报矫正算法, 为False表示采用4阶显示龙格库塔算法
(5)y为一个二维数组,第1行代表初始值x对应的值(有多列,表示多个不同的y),后续每一列x对应值递增

例子:
//已知 dy/dx = 1 + x - y, 其中边界初值x = 0 时, y = 1, 现在想计算x = 1.2时, y的值
//下面先写导数函数
Public Function fun(ByVal x As Double, ByVal y() As Double) As Double()
    dim dx(0) as Double
    dx(0) = 1 + x - y(0)
    Return dx
End Function

//然后添加如下代码，运行代码后，可以看z的结果
Dim x As Double = 0
Dim h As Double = 1.2/20 '我们这里将区间等分20份来设置步长
Dim y(20,0) As Double
y(0,0) = 1

API_SolveODE(fun, x, h, True, y)
Dim z As Double = y(20,0) '这里x = 1.2 - h时，对应的y(19,0)