13,826
社区成员
发帖
与我相关
我的任务
分享
void MainWindow::calButtonClicked()
{
prodData.listVectorData=ui->prodData->getListVectorData();
injData.listVectorData=ui->injData->getListVectorData();
QVectorConvertEigen q1;
ArrayXd tnP0=q1.QVectorToVectorXd(prodData.listVectorData.at(0)).array();
ArrayXd prodDataArray=q1.QVectorToVectorXd(prodData.listVectorData.at(1)).array();
ArrayXXd injDataArray=q1.ListVectorToMatrix(injData.listVectorData).array();
CmpModel cmp;
cmp.setData(tnP0,injDataArray,prodDataArray);
cmp.setFitParams(600,100);
cmp.Run(100);
cmp.printResult();
CmpModel cmp1;
cmp1.setData(tnP0,injDataArray,prodDataArray);
cmp1.setFitParams(600,50);
cmp1.Run(50);
cmp1.printResult();
}
double CmpModel::GetFit(PARTICLE &particle)
{
int injNums=injDataMatrix.cols();
MatrixXd prodInjMatrix=getProdInjMatrix(timeList,particle.X[injNums+1],injDataMatrix,prodDataVector);
int cols=prodInjMatrix.cols();
int rows=prodInjMatrix.rows();
ArrayXd prodData=prodDataVector.tail(rows);
MatrixXd injMatrix=prodInjMatrix.leftCols(cols-1);
VectorXd resVector(injNums+1);
for (int i=0;i<injNums+1;i++)
{
resVector(i)=particle.X[i];
}
ArrayXd prodObs=(injMatrix*resVector).array();//计算出的产量
double qoj=prodData.mean()-prodObs.mean();//注采不平衡系数
prodObs+=qoj;
double err=-(prodData-prodObs).pow(2).sum()/rows;//相对误差
// double err=particle.X[0]*sin(particle.X[0]*3.1415926*10)+2;
return err;
}
//设置计算适应度参数
void CmpModel::setFitParams(int pNum,int maxIter)
{
int injNums=injDataMatrix.cols();
SetDimN(injNums+2,pNum);
double xDown[injNums+2],xUp[injNums+2];
for (int i=0;i<injNums;i++)
{
xDown[i]=0;
xUp[i]=1;
}
xDown[injNums]=0;
xUp[injNums]=2;
xDown[injNums+1]=0.01;
xUp[injNums+1]=100;
SetXdown(xDown);
SetXup(xUp);
SetVmax(0.125);
SetIteorMax(maxIter);
}
void CmpModel::printResult()
{
int injNums=injDataMatrix.cols();
double result[injNums+2];
double gBestFit=GetBest(result);
qDebug()<<"gBestFit:"<<gBestFit;
for (int i=0;i<injNums+2;i++)
{
qDebug()<<result[i];
}
}
double CmpModel::GetFit(PARTICLE &particle)
{
double err=particle.X[0]*sin(particle.X[0]*3.1415926*10)+2;
return err;
}