程序引用了自主开发的基于 JFreeChart 的 Plot 接口工具
import tju.plot.Plot;
import java.awt.*;
import java.util.ArrayList;
import static java.lang.Math.*;
import static tju.plot.Plot.range;
public class id_diagram {
static final double a = 5.11564;
static final double b = 1687.537;
static final double c = 230.17;
// 给定温度,输出水蒸气饱和分压力,水蒸汽的饱和压力 = 同温度下湿空气中水蒸气的饱和分压力
public static double p_sat(double t) {
return pow(10, a - b/(t + c));
}
public static double t_sat(double p) {
return b/(a-log10(p)) - c;
}
// 已知温度 t [℃]、相对湿度 φ,确定含湿量 d [kg]
public static double d(double t, double φ) {
return 0.622*φ*p_sat(t)/(1 - φ*p_sat(t));
}
// 已知含湿量、相对湿度,确定
public static double t(double d, double φ) {
return t_sat(1/(0.622/d + 1)/φ);
}
// 返回等焓线上的含湿量、温度坐标
public static ArrayList<ArrayList<Double>> equalEnthalpyLine(double h) {
if (h < -20 || h > 500) {
System.out.println("Enthalpy should be larger than -20 [kJ/(kg·K)] and less than 500 [kJ/(kg·K)]");
return null;
}
var tRange = range(-20, 0.1, 150);
var T = new ArrayList<Double>();
var D = new ArrayList<Double>();
for (double t: tRange) {
var d = (h - 1.005*t)/(2500 + 1.84*t);
var dmax = d(t, 1);
if (d > 0 && d < dmax) {
T.add(t);
D.add(d);
}
}
var data = new ArrayList<ArrayList<Double>>();
data.add(D);
data.add(T);
return data;
}
public static void main(String[] args) {
double dmax = 0.08;
var N = range(0.0001, 0.001, dmax).length;
Plot plot = new Plot();
plot.xRange(0, dmax)
.yRange(-10, 60)
.xAxisTitle("含湿量 [kg/kg干]")
.yAxisTitle("温度 [℃]")
.verticalGridLineVisible(true)
.horizontalGridLineVisible(true);
var φ = range(0.1, 0.1, 1.1);
// 绘制等相对湿度线
for (int j = 0; j < φ.length; j++) {
var t = new double[N];
var d = range(0.0001, 0.001, dmax);
for (int i =0; i < N; i++) {
t[i] = t(d[i], φ[j]);
}
plot.line(d, t, Color.BLACK, false)
.insertLabel(d(53-j*(53-47)/(φ.length-1), φ[j]), 53-j*(53-46)/(φ.length-1),
"φ = " + Math.round(φ[j]*100) + "%",
305 + j*50/(φ.length-1), Color.BLACK);
}
// 绘制状态点,过程线
plot.scatter(new double[] {0.05}, new double[] {t(0.05,1)},
Color.RED, 'c', 4, true)
.scatter(new double[] {0.01}, new double[] {55},
Color.RED, 'c', 4, true)
.line(new double[] {0.05, 0.01}, new double[]{t(0.05, 1), 55},
Color.BLUE, false);
// 绘制等焓线
var hs = range(-10, 10, 250);
for (var hi: hs) {
var ds = equalEnthalpyLine(hi).get(0);
var ts = equalEnthalpyLine(hi).get(1);
var d_data = new double[ds.size()];
var t_data = new double[ts.size()];
for (int i = 0; i < ds.size(); i++) {
d_data[i] = ds.get(i);
t_data[i] = ts.get(i);
}
plot.line(d_data, t_data, Color.BLACK,0.5f,
true, false, 'c', false,
0, false);
}
plot.show();
}
}