java 均值插值_用JAVA实现插值查询的方法(算近似值,区间求法)

该博客介绍了如何使用Java实现插值查询方法,特别是针对水位和库容之间的关系,当输入值在已有数据范围内时,计算近似值。算法涉及到根据输入的水位或库容查找最近的数据范围,并通过计算每单位水位或库容的增量来确定最终的近似值。
摘要由CSDN通过智能技术生成

//插值查询法

@OverridepublicString InterpolantQuery(ReservoirCapacityConditionParam param)

{

String finalVal="";float finalVolumn=0;

StringBuffer sb=newStringBuffer();

StringBuffer sd=newStringBuffer();

sb.append("select z,v from hydro_curve_b where stcd='"+param.getStcd()+"'");if(param.getV()==""&&param.getZ()!="")

{

sb.append("and z='"+param.getZ()+"'");

}else if(param.getV()!=""&&param.getZ()=="")

{

sb.append("and v='"+param.getV()+"'");

}

List fromSTCD=this.daoHelper.findBySql(sb.toString());//如果是已有数据,直接显示,否则算法查找

/*算法:通过库容查水位或通过水位查库容,如果输入的值在已有数据的某个范围内,则定位此数据的最小范围

* 1.比如输入120,有119~121,118~122这2个范围,则取119~121这个近似范围

* 2.假设输入的是水位,要查询库容,那么首先算出每一米水位在(1)范围内的库容,然后算出库容的增量,用这个增量加上这个区间内较低的库容

* 3.由于框架不能使用TOP关键字,所以(1)的范围的的取法:左边:查出比输入值小的所有数据,按大小的降序拍了,取最后一条,右边:查出比输入值大的所有数据,按升序排列,取最后一条*/

if(fromSTCD.size()==0)

{//如果水位为空,则按照库容查询水位

if(param.getZ()=="")

{if(param.getV().equals("0"))

{//如果输入0,则不查询

}else{//查出左边区间的

List left_fromSTCD=this.daoHelper.findBySql("select z,v from hydro_curve_b where stcd='"+param.getStcd()+"' and v

List right_fromSTCD=this.daoHelper.findBySql("select z,v from hydro_curve_b where stcd='"+param.getStcd()+"' and v>'"+param.getV()+"' order by z desc");float beginZ=0,beginV=0; //水位

float endZ=0,endV=0; //库容//如果左边区间为空

if(left_fromSTCD.size()==0)

{//重置左边的区间

left_fromSTCD=this.daoHelper.findBySql("select z,min(v) v from hydro_curve_b where stcd='"+param.getStcd()+"' group by z order by z desc");for(Object []obj:left_fromSTCD)

{

beginZ=Float.parseFloat(String.valueOf(obj[0]));

beginV=Float.parseFloat(String.valueOf(obj[1]));

}//重置右边的区间

right_fromSTCD=this.daoHelper.findBySql("select z.* from (select top 2 z,min(v) v from hydro_curve_b where stcd='"+param.getStcd()+"' and v>"+param.getV()+"group by z) z order by z.z asc");for(Object []obj:right_fromSTCD)

{

endZ=Float.parseFloat(String.valueOf(obj[0]));

endV=Float.parseFloat(String.valueOf(obj[1]));

}

}else{for(Object []obj:left_fromSTCD)

{

beginZ=Float.parseFloat(String.valueOf(obj[0]));

beginV=Float.parseFloat(String.valueOf(obj[1]));

}

}//如果右边区间为空

if(right_fromSTCD.size()==0)

{//重置左边的区间

left_fromSTCD=this.daoHelper.findBySql("select z.* from (select top 2 z,max(v) v from hydro_curve_b where stcd='"+param.getStcd()+"' and v

{

beginZ=Float.parseFloat(String.valueOf(obj[0]));

beginV=Float.parseFloat(String.valueOf(obj[1]));

}//重置右边的区间

right_fromSTCD=this.daoHelper.findBySql("select z,max(v) from hydro_curve_b where stcd='"+param.getStcd()+"' group by z order by z asc");for(Object []obj:right_fromSTCD)

{

endZ=Float.parseFloat(String.valueOf(obj[0]));

endV=Float.parseFloat(String.valueOf(obj[1]));

}

}else{for(Object []obj:right_fromSTCD)

{

endZ=Float.parseFloat(String.valueOf(obj[0]));

endV=Float.parseFloat(String.valueOf(obj[1]));

}

}//计算每一格库容所包含的水位

float eachVolumn=1/((endV-beginV)/(endZ-beginZ));float z=Float.parseFloat(param.getV());//得到最终的水位

finalVolumn=(z-beginV)*eachVolumn+beginZ;

}

}//如果库容为空,则按照水位查询库容

else if(param.getV()=="")

{if(param.getZ().equals("0"))

{//如果输入0,则不做任何操作

}else{//查出左边区间的

List left_fromSTCD=this.daoHelper.findBySql("select z,v from hydro_curve_b where stcd='"+param.getStcd()+"' and z

List right_fromSTCD=this.daoHelper.findBySql("select z,v from hydro_curve_b where stcd='"+param.getStcd()+"' and z>'"+param.getZ()+"' order by v desc");float beginZ=0,beginV=0; //水位,库容(left)

float endZ=0,endV=0; //水位,库容(right)//如果输入的最小值比最数据库里的最小值小,那么取数据库里的最小值//重置区间的原因是因为最小值是一个区间,用TOP2确定范围

if(left_fromSTCD.size()==0)

{//重置左边的区间

left_fromSTCD=this.daoHelper.findBySql("select MIN(z) z,v from hydro_curve_b where stcd='"+param.getStcd()+"' group by v order by v desc");for(Object []obj:left_fromSTCD)

{

beginZ=Float.parseFloat(String.valueOf(obj[0]));

beginV=Float.parseFloat(String.valueOf(obj[1]));

}//重置右边的区间

right_fromSTCD=this.daoHelper.findBySql("select z.* from (select top 2 min(z) z,v from hydro_curve_b where stcd='"+param.getStcd()+"' and z>"+param.getZ()+"group by v) z order by z.v asc");for(Object []obj:right_fromSTCD)

{

endZ=Float.parseFloat(String.valueOf(obj[0]));

endV=Float.parseFloat(String.valueOf(obj[1]));

}

}else{for(Object []obj:left_fromSTCD)

{

beginZ=Float.parseFloat(String.valueOf(obj[0]));

beginV=Float.parseFloat(String.valueOf(obj[1]));

}

}//如果输入的最大值比数据库里的最大值大,那么取数据库的最大值。

if(right_fromSTCD.size()==0)

{//重置左边的区间

left_fromSTCD=this.daoHelper.findBySql("select z.* from (select top 2 max(z) z,v from hydro_curve_b where stcd='"+param.getStcd()+"' and z

{

beginZ=Float.parseFloat(String.valueOf(obj[0]));

beginV=Float.parseFloat(String.valueOf(obj[1]));

}//重置右边的区间

right_fromSTCD=this.daoHelper.findBySql("select max(z) z,v from hydro_curve_b where stcd='"+param.getStcd()+"' group by v order by v asc");for(Object []obj:right_fromSTCD)

{

endZ=Float.parseFloat(String.valueOf(obj[0]));

endV=Float.parseFloat(String.valueOf(obj[1]));

}

}else{for(Object []obj:right_fromSTCD)

{

endZ=Float.parseFloat(String.valueOf(obj[0]));

endV=Float.parseFloat(String.valueOf(obj[1]));

}

}//计算每一格库容所包含的水位//float eachVolumn=(endV-beginV)/(endZ-beginZ);

float eachVolumn=1/((endZ-beginZ)/(endV-beginV));float z=Float.parseFloat(param.getZ());//得到最终的库容//finalVolumn=(endZ-z)*eachVolumn+endZ;

finalVolumn=beginV+eachVolumn*(z-beginZ);

}

}returnString.valueOf(finalVolumn);

}else{for(Object obj[]:fromSTCD)

{if(param.getV()=="")

{

finalVal=String.valueOf(obj[1]);

}else if(param.getZ()=="")

{

finalVal=String.valueOf(obj[0]);

}

}returnfinalVal;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值