一、在两个值之间均匀取值
int Len=10;
double *temp = new double[Len];
double x=AdjustValue;
temp=UniformSampling(1-x,1+x,Len);
//函数功能:均匀取点算法
double *MainWindow::UniformSampling(double Mmin,double Mmax,int L)
{
double *temp = new double[L];
double delta=(Mmax-Mmin)/(L-1);
for(int i=0;i<L;++i)
{
temp[i]=Mmin+delta*i;
}
return temp;
}
二、在对数横坐标下的类正态分布函数
如下图所示,横坐标是对数坐标系,纵坐标是正常坐标系。带灰色阴影的是我们用函数产生的类正态分布曲线。
基本思想是:首先得到在常规坐标系下的正态分布函数,然后为了在横坐标转换为对数坐标系后,曲线的形态不变。那么本来曲线的对称轴是x=u,坐标系转换后,对称轴就变为x=log(u),注意C++中的log函数是以自然对数e为底的。同理,其他的x坐标也是变为log(x)。
//使用方式
//产生用于绘图的数据
for(int i=0;i<2000;i++)
{
//gaussrand函数的定义在后面
data2 << gaussrand(log(i*10),log(800),12);
}
//绘图
QVector<double> xx;
for(int i=0;i<2000;i++)
{
xx <<10*i;
}
CustomPlot->graph(1)->setData(xx,data2);
//函数功能:类高斯分布
//函数参数:value是横坐标下的输入值;u是正态分布的期望值;Amp是正态分布的顶点幅度
//函数返回值:纵坐标下的输出值
double MainWindow::gaussrand(double value,double u,double Amp)
{
//sigma是标准差,决定了类正态分布的曲线胖瘦
double sigma=0.3;
double mvalue=Amp*exp(-(value-u)*(value-u)/(2*sigma*sigma));
//qDebug()<<mvalue1;
return mvalue;
}