功能:采用粒子群算法对复数变量进行非线性拟合

格式:
[a,er,n]=nlinFitPluralPSO(f,an,xn,y,x,a0,aMin,aMax,Nbird,LoopSum,Error)
[a,er,n]=nlinFitPluralPSO(f,an,xn,y,x,a0,aMin,aMax,Nbird,LoopSum)
[a,er,n]=nlinFitPluralPSO(f,an,xn,y,x,a0,aMin,aMax,Nbird)
[a,er,n]=nlinFitPluralPSO(f,an,xn,y,x,a0,aMin,aMax)
[a,er,n]=nlinFitPluralPSO(f,an,xn,y,x,a0,aMin)
[a,er,n]=nlinFitPluralPSO(f,an,xn,y,x,a0)
[a,er,n]=nlinFitPluralPSO(f,an,xn,y,x)

f:存储拟合的符号表达式,注意表达式支持虚数单位i
an:以符号变量存储的需要拟合的变量名称,每个名称以逗号分隔,注意变量当中不能以需单位i命名
xn:以符号变量存储的实验采集数据的变量名称,每个名称以逗号分隔 ,注意变量当中不能以需单位i命名
y:列数为1或者2的矩阵变量或者常数,存储实验采集的等式右边的常数项。如果为矩阵变量,则第1列对应数据实数部分,第2列对应虚数部分
x:列数为偶数的矩阵变量,存储对应xn名称的数据,如果y是矩阵变量且行数为m,xn当中有变量个数为n,则此x为m×2n的矩阵变量,其中xn当中的第1个变量对应x当中的1、2列数据；xn当中的第2个变量对应x当中的3、4列数据……。此变量当中的奇数列对应实数部分,偶数项对应虚数部分
a0:存储an初始估计值的列数为1或者2的矩阵变量,如果an当中有变量个数为m，则此矩阵变量行数也为m，其中每一行对应an当中的值，其中第1列代表实数部分，第2列代表虚数部分。如果此值为一个常数,则每个初值均初始化为此值。
aMin:存储an下限值的列数为1或者2的矩阵变量,如果an当中有变量个数为m，则此矩阵变量行数也为m，其中每一行对应an当中的值，其中第1列代表实数部分，第2列代表虚数部分。如果此值为一个常数,则每个初值均初始化为此值，注意初始化时只针对实数项。程序默认虚数与实数部分的下限为-512
aMax:存储an上限值的列数为1或者2的矩阵变量,如果an当中有变量个数为m，则此矩阵变量行数也为m，其中每一行对应an当中的值，其中第1列代表实数部分，第2列代表虚数部分。如果此值为一个常数,则每个初值均初始化为此值，注意初始化时只针对实数项。程序默认虚数与实数部分的上限为512
Nbird:种群数,默认200
LoopSum:总循环次数,默认3000
Error:误差控制变量,默认1e-12

a:返回的拟合数据变量,返回变量的每一行对应an的每一个变量,第1列为实数部分,第2列为虚数部分
er:返回的误差
n:返回的迭代终止程序循环次数

原理:内部调用函数{nlinSolve2<矩阵运算\nlinSolve2>}

例子:

//现在有一组(x,y,z)的数据,已知它们满足表达式 z=a*sin(x)+b*cos(y)+c*i ,请拟合出最佳复数系数a、b以及实数c
x=rand(3,20,2);
y=rand(3,20,2);
a=[1 2];//a=1+2*i
b=[-3.5 -1];//b=-3.5-i
c=4;
d1=PluralRun("sin(x)");
d2=PluralRun("mul(a,d1)");
d3=PluralRun("cos(y)");
d4=PluralRun("mul(b,d3)");
d5=[0 1];
d6=PluralRun("mul(d5,c)");
d7=PluralRun("add(d2,d4)");
z=PluralRun("add(d7,d6)");
//上面这段代码只是为了测试数据而运行的代码,即事先得到的数据(x,y,z)

f="a*sin(x)+b*cos(y)+c*i";
an="a,b,c";
xn="x,y"
xy=[x,y];
a0=[10,-5;11,-6;0,0];//初始时默认a=10-5*i,b=11-6*i,c=0
amin=[-50,-60;-51,-61;-52,0];//注意这里下限对应的关系,即an当中的a变量实数部分下限为-50,虚数部分下限为-60
amax=[256,100;257,101;255,0];//因为an当中c为实数变量,则c的虚数部分上下限设置为0即可,仔细看amin与amax当中最后一个0的意义
[a,er,n]=nlinFitPluralPSO(f,an,xn,z,xy,a0,amin,amax,100,3000,1e-16)//回车后得到如下结果
a =
[ 1.00000000055712    1.99999999783559
 -3.49999999784349   -1.00000000087484
  4.00000000675976    0.00000000000000 ]
er =
[ 1.9295219801E-15 ]
n =
[ 3000.00000000000 ]