函数调用自定义函数

问题:

有些情况下，函数很复杂,需要使用自定义函数来实现相应功能,这时可考虑如下方式.


解决:

1、准备

使用VB.NET代码编写自定义函数到程序目录下的"Calculator\DefineFunction\VBNET"文件夹里,具体可参看自定义函数

2、具体问题

2.1、积分问题

支持函数:IntegralCortez、IntegralDiff、IntegralGauss、IntegralGaussAdapt、IntegralInfinite、IntegralInfinite2、IntegralRomberg、IntegralSimpson、Integralxy、Integralxyz

例子:

求函数sin(x)*cos(x+5)/(4+x*x)*sin(sin(x)*cos(x+5)/(4+x*x)+x)对x在[0,1]上的定积分

步骤(1):在"Calculator\DefineFunction\VBNET"下建立名称为"Ftest.vb"的文件,其中文件里代码如下/*

Public Function Ftest(ByVal x as Double) as Double
dim y,z as Double
y=sin(x)*cos(x+5)
z=y/(4+x*x)
Return z*sin(z+x)
End Function

*/

 

步骤(2):在命令窗口依次执行如下命令有

Integral(Ftest,0,1)//回车得到如下结果
ans =
[ 0.05562043407933 ]

2.2、数据拟合

支持函数:{nlinFit2<矩阵运算\nlinFit2>}、{nlinFitDE<矩阵运算\nlinFitDE>}、{nlinFitGA<矩阵运算\nlinFitGA>}、{nlinFitPSO<矩阵运算\nlinFitPSO>}、{nlinFitPSO2<矩阵运算\nlinFitPSO2>}、{nlinFitPSO3<矩阵运算\nlinFitPSO3>}

注意:在编写函数时,函数的参数必须一一与输入参数顺序的变量名称对应,否则会计算出错


例子:

//已知有如下一组数据,其中数据表达式满足sin(z(1))*a+b*z(2)+c*z(3)-d+z(4)=0,其中z(1)、z(2)、z(3)、z(4)分别对应z数据的第1、2、3、4列数据,现在要求拟合出最佳系数a、b、c、d

z =
[ 1.00000000000000    0.84147098480789    0.54030230586814   -0.11354116913921
  2.00000000000000    1.81859485365136   -0.83229367309428   -2.98857287563957
  3.00000000000000    0.42336002417960   -2.96997748980134    8.57093735278360
  4.00000000000000   -3.02720998123171   -2.61457448345445    26.5074268849209
  5.00000000000000   -4.79462137331569    1.41831092731613    30.5547959392623
  6.00000000000000   -1.67649298919356    5.76102171990220    10.3420277278667
  7.00000000000000    4.59890619103152    5.27731578040313   -18.9578735381232
  8.00000000000000    7.91486597298705   -1.16400027046891   -27.4422548545962
  9.00000000000000    3.70906636717581   -8.20017235696209   -0.69668553794993
  10.0000000000000   -5.44021110889370   -8.39071529076452    40.8716652807862 ]


步骤(1):在"Calculator\DefineFunction\VBNET"下建立名称为"Ftest.vb"的文件,其中文件里代码如下/*

Public Function Ftest(ByVal a as Double,ByRef b as Double,ByRef c as Double ,ByRef d as Double,ByRef z1 as Double,ByRef z2 as Double,ByRef z3 as Double,ByRef z4 as Double) as Double
Return sin(z1)*a+b*z2+c*z3-d+z4
End Function

*/

b=Zeros(10,1);zn="z1,z2,z3,z4";xn="a,b,c,d";nlinFit2(Ftest,xn,zn,b,z)//回车得到如下结果
ans =
[ 4.99999999548462    4.00000000015479    0.99999999989246    7.99999999914101    7.4121897549E-17 ]

//在上面的例子中,一定要注意自定义函数Ftest里接收参数的顺序必须先是拟合变量(xn),再是自变量(zn)


2.3、非线性方程组求解

支持函数:{nlinSolve<矩阵运算\nlinSolve>}、{nlinSolveGA<矩阵运算\nlinSolveGA>}、{nlinSolvePSO<矩阵运算\nlinSolvePSO>}、{nlinSolvePSO2<矩阵运算\nlinSolvePSO2>}、{nlinSolvePSO3<矩阵运算\nlinSolvePSO3>}

注意:如果有多个方程组,必须以一个函数给出.

例子:

求解如下方程组/*

sin(x)*8+4*y^2-z=10
x^2-cos(z)*7=1.235
log(x^2+4)*7-y*z+7=12.78

*/


步骤(1):在"Calculator\DefineFunction\VBNET"下建立名称为"Ftest.vb"的文件,其中文件里代码如下/*

Public Function Ftest(ByVal x as Double,ByVal y as Double,ByVal z as Double) as Double
dim f1,f2,f3 as Double
f1=sin(x)*8+4*y^2-z-10
f2=x^2-cos(z)*7-1.235
f3=log(x^2+4)*7-y*z+7-12.78
Return f1^2+f2^2+f3^2
End Function

*/

 

步骤(2):在命令窗口依次执行如下命令有

x = "x,y,z";//这里注意,这里的x、y、z带入函数后就是Ftest(x,y,z).如果这里变为 x="x,z,y"，则带入函数后就变成Ftest(x,z,y),这时一定要注意对于

nlinSolveGA(Ftest,x)//回车得到如下结果
ans =
[ 0.28575236344791   -0.89414919069016   -4.54687684265185    1.5899325674E-16 ]

2.4、支持的其它函数

{DiffFirstOrder<矩阵运算\DiffFirstOrder>}、{DynamicWaveU<矩阵运算\DynamicWaveU>}、{DynamicWaveV<矩阵运算\DynamicWaveV>}