import com.threeclear.api.common.tool.method.ClearPolVarBean;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/**
* @author yaoxh
* @time
* 功能:公共计算方法
*/
public class ClearCalUtil {
/**
* @author yaoxh
* @time 2015-11-11 下午5:47:23
* @param type 污染物类型
* @param C 浓度
* @return
* 功能:计算SO2、NO2、PM2.5、PM10、CO和O3_8h的指数
*/
public static double scalIndex(String type, double C){
double result = 0;
try {
int S = 0;
if(ClearPolVarBean.SO2.equals(type)){
S = 60;
} else if(ClearPolVarBean.NO2.equals(type)){
S = 40;
} else if(ClearPolVarBean.PM10.equals(type)){
S = 70;
} else if(ClearPolVarBean.PM25.equals(type)){
S = 35;
} else if(ClearPolVarBean.CO.equals(type)){
S = 4;
} else if(ClearPolVarBean.O3_8h.equals(type)||ClearPolVarBean.O3.equals(type)){
S = 160;
}
result = C/S;
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* @author yaoxh
* @time 2015-11-11 下午6:00:36
* @param percentile 特定百分位
* @param numericalList 所有数据
* @return
* 功能:计算特定百分位数值
*/
public static double scalPercentile(double percentile, List<Double> numericalList){
double result = 0;
try {
if(numericalList!=null&&numericalList.size()>0){
int count = numericalList.size();
if(count==1){
result = numericalList.get(0);
} else {
double[] orderArray = new double[count];
for(int i=0;i<count;i++){
orderArray[i] = numericalList.get(i);
}
//排序
Arrays.sort(orderArray);
double mark = count*percentile;
int min = (int)Math.floor(mark);
int max = (int)Math.ceil(mark);
if(min==max){
result = orderArray[min-1];
} else {
result = orderArray[min-1]*(max-mark)+orderArray[max-1]*(mark-min);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* @author yaoxh
* @time 2015-8-20 上午9:30:23
* @param value 需要科学计算的数据
* @param digit 保留的小数位
* @return
* 功能:四舍六入五成双计算法
*/
public static String sciCal(double value, int digit){
String result = "-999";
try {
double ratio = Math.pow(10, digit);
boolean isNegative = false;
if(value<0) {
isNegative = true;
value = Math.abs(value);
}
double _num = value * ratio;
double mod = _num % 1;
double integer = Math.floor(_num);
double returnNum;
if(mod > 0.5){
returnNum=(integer + 1) / ratio;
}else if(mod < 0.5){
returnNum=integer / ratio;
}else{
returnNum=(integer % 2 == 0 ? integer : integer + 1) / ratio;
}
BigDecimal bg = new BigDecimal(returnNum);
result = bg.setScale((int)digit, BigDecimal.ROUND_HALF_UP).toString();
if(isNegative) {
result = "-" + result;
}
} catch (RuntimeException e) {
throw e;
}
return result;
}
/**
* @author yaoxh
* @time 2015-8-29 下午5:48:12
* @param value 需要计算的数字
* @param place 多少位取整(1:个位,10:十位,100:百位依次类推)
* @param digit 保留小树位数
* @return
* 功能:进位取整
*/
public static String ceiling(double value, int place, int digit){
String result = "-999";
try {
double ratio = Math.pow(10, (place+"").length()-1);
double _num = value / ratio;
double mod = _num % 1;
double integer = Math.floor(_num);
double returnNum = 0;
if(mod > 0){
returnNum=(integer + 1) * ratio;
}else if(mod <= 0){
returnNum=integer * ratio;
}
BigDecimal bg = new BigDecimal(returnNum);
result = bg.setScale(digit, BigDecimal.ROUND_HALF_UP).toString();
} catch (RuntimeException e) {
throw e;
}
return result;
}
/**
* @author yaoxh
* @time 2015-8-21 下午3:25:50
* @param type 污染物类型(SO2、NO2、CO、PM10和PM2.5)
* @param pol 污染物浓度
* @return
* 功能:计算污染物日均IAQI(包括PM10和PM2.5的24小时滑动平均)
*/
public static double getDailyIAQI(String type, double pol){
double polIAQI = 0;
try {
//按标志保留特定数值
if(ClearPolVarBean.CO.equals(type)){
pol = Double.parseDouble(ClearCalUtil.sciCal(pol, 3));
} else {
pol = Double.parseDouble(ClearCalUtil.sciCal(pol, 0));
}
if(pol<0){
return -999;
}
double iaqih = 0;
double iaqil = 0;
double ph = 0;
计算各污染物算法
最新推荐文章于 2023-09-17 01:52:24 发布
本文详细探讨了计算环境中用于分析和处理污染物数据的各种算法,包括数据预处理、污染物浓度计算、趋势分析及预测方法。通过对大量环境监测数据的处理,这些算法能够帮助我们理解和预测环境污染的变化,为环境保护提供科学依据。
摘要由CSDN通过智能技术生成