C++实现的归一化和反归一化处理函数

更新时间:2024-03-30 20:15:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

C++实现的归一化和反归一化处理函数

///////////////////////////////////////////////////////////////////////////////////////////////////

void __fastcall TModelManage::TranslateData(TModel* pModel,int Id,double *Value,int Flag) {

//转换函数类型 int iChgFunc;

//节点对应的最大、最小值 double dMaxValue,dMinValue;

//取节点配置信息:转换函数类型,最大值,最小值

GetNodeConfValue(pModel->ConfTable,Id,&iChgFunc,&dMaxValue,&dMinValue); if(Flag==1) //仿真时不取边界值,以避免仿真结果误差太大 {

if(*Value<=(dMinValue*1.005)) *Value=dMinValue*1.005; if(*Value>=(dMaxValue*0.995)) *Value=dMaxValue*0.995; } else {

if(*Value<=dMinValue) *Value=dMinValue; if(*Value>=dMaxValue) *Value=dMaxValue; }

//线性函数转换,转换在0-1之内 if(iChgFunc==0) {

*Value=(*Value-dMinValue)/(dMaxValue-dMinValue); }

//用atan函数转换在0-1之内 else if(iChgFunc==2) {

*Value=atan(*Value)*2/M_PI; }

//用log函数转换 else if(iChgFunc==1) {

if(*Value<=1) *Value=0; else

*Value=log10(*Value); //用log10函数转换(缩小)

if(dMaxValue>1)

*Value=*Value/log10(dMaxValue); //转换为0-1之间 }

//不用转换

else if(iChgFunc==3) {

*Value=*Value; }

*Value=((0.5-0.001)/0.5)*(*Value)+0.001; //用线性函数把数据转换为0.001-0.0.9995之间 }

/////////////////////////////////////////////////////////////////////////////////////////////////// //反数据转换,主要是针对仿真结果要反算回实际预测的值

void __fastcall TModelManage::UnTranslateData(TModel* pModel,int Id,double *Value,int Flag) {

//转换函数类型 int iChgFunc;

//节点对应的最大、最小值 double dMaxValue,dMinValue;

//取节点配置信息:转换函数类型,最大值,最小值

GetNodeConfValue(pModel->ConfTable,Id,&iChgFunc,&dMaxValue,&dMinValue);

*Value=(((*Value)-0.001)*0.5)/(0.5-0.001); //对应于---->用线性函数把数据转换为0.001-0.0.9995之间

//反线性函数转换 if(iChgFunc==0) {

*Value=(*Value)*(dMaxValue-dMinValue)+dMinValue; }

//用tan函数转换 else if(iChgFunc==2) {

*Value=tan(*Value)*M_PI/2; }

//用反log函数转换 else if(iChgFunc==1) {

*Value=pow(10,(*Value)); //用反对数方式函数转换(放大) }

else if(iChgFunc==3) {

*Value=*Value; //不用转换 } }

归一化处理其实本身比较简单理解,就是要先把数据按一定规则处理在一个区间内,比如x1到x2之间(0到1或是-1到1之间): 公式为:

归一化后数据=

x1+[(x2-x1)*(归一化前数据-数据中的最小值)/(数据中的最大值-数据中的最小值)]

盲孔优化分析序列 分析序列 盲孔深度 (mm) 盲孔直径 (mm) 盲孔处最大应力(MPa) 总体 1 3.0 2 3 4 4.1502 33.708 5 4.2678 35.621 6 7 5.3887 3.5520 4.3815 4.2861 35.903 34.334 32.0 32.743 34.154 445.33 687.44 501.90 0.195 0.198 74E+07 74E+07 550.90 0.199 23E+07 557.34 0.195 49E+07 598.01 568.67 0.197 0.198 积0.200 4E+07 (mm3) 17E+07 13E+07

function guiyihua( )

p1=[3.0 5.3887 3.5520 4.1502 4.2678 4.3815 4.2861]; p2=[32.0 32.743 34.154 33.708 35.621 35.903 34.334]; t=[445.33 687.44 501.90 550.90 557.34 598.01 568.67];

x1=0; x2=1;

maxp1=max(p1); minp1=min(p1); maxp2=max(p2); minp2=min(p2); maxt=max(t); mint=min(t); for i=1:7

newp1(i)=x1+[(x2-x1)*(p1(i)-minp1)/(maxp1-minp1)]; newp2(i)=x1+[(x2-x1)*(p2(i)-minp2)/(maxp2-minp2)];

newt(i)=x1+[(x2-x1)*(t(i)-mint)/(maxt-mint)]; end newp1 newp2 newt

运行出来的数据为: newp1 =

newp2 =

newt =

0 1.0000 0 0.1904 0 1.0000 0.2311 0.4815 0.5519 0.4376 0.2337 0.4360 0.5307 0.5783 0.9277 1.0000 0.4626 0.6306 0.5384 0.5980 0.5094

本文来源:https://www.bwwdw.com/article/yger.html

Top