焓湿图绘制程序(基于JFreeChart)

程序引用了自主开发的基于 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();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值