基于Java的AGA8_92DC压缩因子计算方法

概要

上一章节分享了《基于Python的AGA8_92DC压缩因子计算方法》,本章节将分享基于Java的AGA8_92DC压缩因子计算方法。

整体架构流程

跳转至上篇文章查看算法原理

备注

Java类名 calculatorZ
在这里插入图片描述

技术细节

package calculatorZ;
import java.util.Scanner;

public class calculatorZ {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.println("请选择计算方式:");
        System.out.println("1. 使用预设组分计算Z因子");
        System.out.println("2. 输入组分计算Z因子");

        String choice = scanner.nextLine();

        if (choice.equals("1")) {
            System.out.print("请输入绝对压力(MPa):");
            double JueDuiYaLi = scanner.nextDouble();
            System.out.print("请输入温度(℃):");
            double WenDu = scanner.nextDouble();

            double Z = Z_CAL.Z_result_YuSheNG(JueDuiYaLi, WenDu);
            System.out.printf("计算得到的Z因子为:%.6f%n", Z);

        } else if (choice.equals("2")) {
            System.out.print("请输入组分摩尔分数(用空格分隔,共21个组分):CH4 N2 CO2 C2H6 C3H8 H2O H2S H2 CO O2 iC4H10 nC4H10 iC5H12 nC5H12 nC6H14 nC7H16 nC8H18 nC9H20 nC10H22 He Ar\n");
            String[] ZuFenStr = scanner.nextLine().split(" ");
            double[] ZuFen = new double[21];
            for (int i = 0; i < 21; i++) {
                ZuFen[i] = Double.parseDouble(ZuFenStr[i]);
            }
            System.out.print("请输入绝对压力(MPa):");
            double YaLi = scanner.nextDouble();
            System.out.print("请输入温度(℃):");
            double WenDu = scanner.nextDouble();

            double Z = Z_CAL.Z_result_QiTq_NG(ZuFen, YaLi, WenDu);
            System.out.printf("计算得到的Z因子为:%.6f%n", Z);

        } else {
            System.out.println("无效的选择,请重新运行程序并输入有效的选项。");
        }

        scanner.close();
    }
}

class Z_CAL {

    public static double Z_result_YuSheNG(double p, double WenDu) {
        double TT = 0.0;
        double D = 0.0;
        double Z = 0.0;
        double BMIX = 0.0;
        // Gas compositions for example calculations 组分GB17747.2-2011第二部分 附录C 1#气样
        double[] ex1 = {0.965, 0.003, 0.006, 0.018, 0.0045, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0010, 0.0010, 0.0005, 0.0003, 0.0007, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000};

        MDP_Z.DCAGA(ex1);
        TT = WenDu + 273.15;
        double[] result = MDP_Z.DZOFPT(p, TT);
        D = result[0];
        Z = result[1];
        BMIX = result[2];

        return Z;
    }

    public static double Z_result_QiTq_NG(double[] ZuFen, double p, double WenDu) {
        double TT = 0.0;
        double D = 0.0;
        double Z = 0.0;
        double BMIX = 0.0;

        MDP_Z.DCAGA(ZuFen);
        TT = WenDu + 273.15;// Temperatures for example calculations 工况温度℃,需要转换成热力学温度;
        double[] result = MDP_Z.DZOFPT(p, TT);
        D = result[0];
        Z = result[1];
        BMIX = result[2];

        return Z;
    }
}

class MDP_Z {
    static double[] A = { 0.153832600, 1.341953000, -2.998583000, -0.048312280, 0.375796500, -1.589575000, -0.053588470, 0.886594630, -0.710237040, -1.471722000,
            1.321850350, -0.786659250, 0.2291290e-8, 0.157672400, -0.436386400, -0.044081590, -0.003433888, 0.032059050, 0.024873550, 0.073322790,
            -0.001600573, 0.642470600, -0.416260100, -0.066899570, 0.279179500, -0.696605100, -0.002860589, -0.008098836, 3.150547000, 0.007224479,
            -0.705752900, 0.534979200, -0.079314910, -1.418465000, -0.599905e-16, 0.105840200, 0.034317290, -0.007022847, 0.024955870, 0.042968180,
            0.746545300, -0.291961300, 7.294616000, -9.936757000, -0.005399808, -0.243256700, 0.049870160, 0.003733797, 1.874951000, 0.002168144,
            -0.658716400, 0.000205518, 0.009776195, -0.020487080, 0.015573220, 0.006862415, -0.001226752, 0.002850908 };
    static double[] B = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9 };
    static double[] C = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1 };
    static double[] K = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 2, 2, 4, 4, 0, 0, 2, 2, 2, 4, 4, 4, 4, 0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 0, 0, 2, 2, 2, 4, 4, 0, 2, 2, 4, 4, 0, 2, 0, 2, 1, 2, 2, 2, 2 };
    static double[] G = { 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0 };
    static double[] Q = { 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1 };
    static double[] F = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
    static double[] S = { 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
    static double[] W = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
    static double[] U = { 0.0, 0.5, 1.0, 3.5, -0.5, 4.5, 0.5, 7.5, 9.5, 6.0, 12.0, 12.5, -6.0, 2.0, 3.0, 2.0, 2.0, 11.0, -0.5, 0.5, 0.0, 4.0, 6.0, 21.0, 23.0, 22.0, -1.0, -0.5, 7.0,
            -1.0, 6.0, 4.0, 1.0, 9.0, -13.0, 21.0, 8.0, -0.5, 0.0, 2.0, 7.0, 9.0, 22.0, 23.0, 1.0, 9.0, 3.0, 8.0, 23.0, 1.5, 5.0, -0.5, 4.0, 7.0, 3.0, 0.0, 1.0, 0.0 };
    static double[] MI = { 16.0430, 28.0135, 44.0100, 30.0700, 44.0970, 18.0153, 34.0820, 2.0159, 28.0100, 31.9988, 58.1230, 58.1230, 72.1500, 72.1500, 86.1770, 100.2040, 114.2310, 128.2580, 142.2850, 4.0026, 39.9480 };//M摩尔质量属于被约分掉了的中间量
    static double[] EI = { 151.318300, 99.737780, 241.960600, 244.166700, 298.118300, 514.015600, 296.355000, 26.957940, 105.534800, 122.766700, 324.068900,
            337.638900, 365.599900, 370.682300, 402.636293, 427.722630, 450.325022, 470.840891, 489.558373, 2.610111, 119.629900 };
    static double[] KI = { 0.4619255, 0.4479153, 0.4557489, 0.5279209, 0.5837490, 0.3825868, 0.4618263, 0.3514916, 0.4533894, 0.4186954, 0.6406937,
            0.6341423, 0.6738577, 0.6798307, 0.7175118, 0.7525189, 0.7849550, 0.8152731, 0.8437826, 0.3589888, 0.4216551 };
    static double[] GI = { 0.000000, 0.027815, 0.189065, 0.079300, 0.141239, 0.332500, 0.088500, 0.034369, 0.038953, 0.021000, 0.256692,
            0.281835, 0.332267, 0.366911, 0.289731, 0.337542, 0.383381, 0.427354, 0.469659, 0.000000, 0.000000 };
    static double[] QI = { 0.0, 0.0, 0.69, 0.0, 0.0, 1.06775, 0.633276, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
    static double[] FI = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
    static double[] SI = { 0.0, 0.0, 0.0, 0.0, 0.0, 1.5822, 0.390, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
    static double[] WI = { 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
    static double[][] EIJ = {
            { 1.000000, 0.971640, 0.960644, 1.000000, 0.994635, 0.708218, 0.931484, 1.170520, 0.990126, 1.000000, 1.019530, 0.989844, 1.002350, 0.999268, 1.107274, 0.880880, 0.880973, 0.881067, 0.881161, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.022740, 0.970120, 0.945939, 0.746954, 0.902271, 1.086320, 1.005710, 1.021000, 0.946914, 0.973384, 0.959340, 0.945520, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 0.925053, 0.960237, 0.849408, 0.955052, 1.281790, 1.500000, 1.000000, 0.906849, 0.897362, 0.726255, 0.859764, 0.855134, 0.831229, 0.808310, 0.786323, 0.765171, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.022560, 0.693168, 0.946871, 1.164460, 1.000000, 1.000000, 1.000000, 1.013060, 1.000000, 1.005320, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.034787, 1.000000, 1.000000, 1.000000, 1.004900, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.008692, 1.010126, 1.011501, 1.012821, 1.014089, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.100000, 1.000000, 1.300000, 1.300000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 } };
    static double[][] UIJ = {
            { 1.000000, 0.886106, 0.963827, 1.000000, 0.990877, 1.000000, 0.736833, 1.156390, 1.000000, 1.000000, 1.000000, 0.992291, 1.000000, 1.003670, 1.302576, 1.191904, 1.205769, 1.219634, 1.233498, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 0.835058, 0.816431, 0.915502, 1.000000, 0.993476, 0.408838, 1.000000, 1.000000, 1.000000, 0.993556, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 0.969870, 1.000000, 1.000000, 1.045290, 1.000000, 0.900000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.066638, 1.077634, 1.088178, 1.098291, 1.108021, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.065173, 1.000000, 0.971926, 1.616660, 1.000000, 1.000000, 1.250000, 1.250000, 1.250000, 1.250000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.028973, 1.033754, 1.038338, 1.042735, 1.046966, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 } };
    static double[][] KIJ = {
            { 1.000000, 1.003630, 0.995933, 1.000000, 1.007619, 1.000000, 1.000080, 1.023260, 1.000000, 1.000000, 1.000000, 0.997596, 1.000000, 1.002529, 0.982962, 0.983565, 0.982707, 0.981849, 0.980991, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 0.982361, 1.007960, 1.000000, 1.000000, 0.942596, 1.032270, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.008510, 1.000000, 1.000000, 1.007790, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 0.910183, 0.895362, 0.881152, 0.867520, 0.854406, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 0.986893, 1.000000, 0.999969, 1.020340, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 0.968130, 0.962870, 0.957828, 0.952441, 0.948338, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 } };
    static double[][] GIJ = {
            { 1.000000, 1.000000, 0.807653, 1.000000, 1.000000, 1.000000, 1.000000, 1.957310, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 0.982746, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 0.370296, 1.000000, 1.673090, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 },
            { 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 } };

    static double RGAS = 8.31451e-3; // R = 8.31451kJ/(kmol·K)为气体摩尔常数
    static double[] BI = new double[18]; // AGA8 状态方程
    static double[] CNS = new double[58]; // AGA8 状态方程系数C*n 共有46 个(13≤n≤58)
    static double K1 = 0.0;

    public static void DCAGA(double[] XJ) {
        int I, J, N;
        double[] XI = new double[21];
        double SUM = 0.0;
        double U1 = 0.0;
        double G1 = 0.0;
        double Q1 = 0.0;
        double F1 = 0.0;
        double XIJ = 0.0;
        double EIJ0 = 0.0;
        double GIJ0 = 0.0;
        double BN = 0.0;

        for (J = 0; J < 21; J++) {
            XI[J] = XJ[J];
        }

        // Normalize mole fractions
        for (I = 0; I < 21; I++) {
            SUM += XI[I];
        }
        for (I = 0; I < 21; I++) {
            XI[I] /= SUM;
        }

        // Calculate molecular weight
        RGAS = 8.31451e-3;

        for (N = 0; N < 18; N++) {
            BI[N] = 0.0;
        }

        K1 = 0.0;

        for (I = 0; I < 21; I++) {
            K1 += XI[I] * Math.pow(KI[I], 2.5);  // B.11
            U1 += XI[I] * Math.pow(EI[I], 2.5);  // B.6
            G1 += XI[I] * GI[I];  // B.7
            Q1 += XI[I] * QI[I];  // B.8
            F1 += XI[I] * XI[I] * FI[I];  // B.9
        }

        K1 *= K1;  // B.11
        U1 *= U1;  // B.6

        for (I = 0; I < 20; I++) {
            for (J = I + 1; J < 21; J++) {
                XIJ = XI[I] * XI[J];
                if (XIJ != 0) {
                    K1 += 2.0 * XIJ * (Math.pow(KIJ[I][J], 5.0) - 1.0) * Math.pow(KI[I] * KI[J], 2.5);  // B.11
                    U1 += 2.0 * XIJ * (Math.pow(UIJ[I][J], 5.0) - 1.0) * Math.pow(EI[I] * EI[J], 2.5);  // B.6
                    G1 += XIJ * (GIJ[I][J] - 1.0) * (GI[I] + GI[J]);  // B.7
                }
            }
        }

        for (I = 0; I < 21; I++) {
            for (J = I; J < 21; J++) {
                XIJ = XI[I] * XI[J];
                if (XIJ != 0) {
                    if (I != J) {
                        XIJ *= 2;
                    }
                    EIJ0 = EIJ[I][J] * Math.sqrt(EI[I] * EI[J]);  // B.3
                    GIJ0 = GIJ[I][J] * (GI[I] + GI[J]) / 2.0;  // B.4
                    for (N = 0; N < 18; N++) {
                        BN = Math.pow(GIJ0 + 1.0 - G[N], G[N]) *
                                Math.pow(QI[I] * QI[J] + 1.0 - Q[N], Q[N]) *
                                Math.pow(Math.sqrt(FI[I] * FI[J]) + 1.0 - F[N], F[N]) *
                                Math.pow(SI[I] * SI[J] + 1.0 - S[N], S[N]) *
                                Math.pow(WI[I] * WI[J] + 1.0 - W[N], W[N]);
                        BI[N] += A[N] * XIJ * Math.pow(EIJ0, U[N]) * Math.pow(KI[I] * KI[J], 1.5) * BN;  // B.2
                    }
                }
            }
        }

        K1 = Math.pow(K1, 0.2);  // B.11
        U1 = Math.pow(U1, 0.2);  // B.6

        for (N = 12; N < 58; N++) {
            CNS[N] = Math.pow(G1 + 1.0 - G[N], G[N]) *
                    Math.pow(Q1 * Q1 + 1.0 - Q[N], Q[N]) *
                    Math.pow(F1 + 1.0 - F[N], F[N]) * A[N] * Math.pow(U1, U[N]);  // B.5
        }
    }


    public static double[] PZOFDT(double D, double T) {
        double P = 0.0;
        double Z = 0.0;
        double BMIX = 0.0;
        int N;
        double DR = 0.0;

        DR = D * K1 * K1 * K1;  // (2)
        BMIX = 0.0;
        for (N = 0; N < 18; N++) {
            BMIX += BI[N] * Math.pow(T, -U[N]);  // B.1
        }
        Z = 1.0 + BMIX * D;  // (1) B.10
        for (N = 12; N < 18; N++) {
            Z -= DR * CNS[N] * Math.pow(T, -U[N]);  // (1) B.10
        }
        for (N = 12; N < 58; N++) {
            Z += CNS[N] / Math.pow(T, U[N]) * (B[N] - C[N] * K[N] * Math.pow(DR, K[N])) *
                    Math.pow(DR, B[N]) * Math.exp(-C[N] * Math.pow(DR, K[N]));
        }
        P = D * RGAS * T * Z;

        return new double[]{P, Z, BMIX};
    }


    public static double[] DZOFPT(double P, double T) {
        int I;
        double X1 = 0.000001;
        double X2 = 40.0;
        double X3 = 0.0;
        double F = 0.0;
        double F1 = 0.0;
        double F2 = 0.0;
        double F3 = 0.0;
        double TOL = 0.5e-6;  // 默认TOL(容差)0.5e-9
        double D = 0.0;
        double Z = 0.0;
        double BMIX = 0.0;

        // 初始计算
        double[] result1 = PZOFDT(X1, T);
        F1 = result1[0] - P;
        double[] result2 = PZOFDT(X2, T);
        F2 = result2[0] - P;

        if (F1 * F2 >= 0) {
            return new double[]{D, Z, BMIX};
        }

        // BEGIN ITERATING
        for (I = 1; I <= 50; I++) {
            // 使用False Position法获取点3
            X3 = X1 - F1 * (X2 - X1) / (F2 - F1);
            double[] result3 = PZOFDT(X3, T);
            F3 = result3[0] - P;

            // 使用Chamber's方法(二次解法)估计根
            D = X1 * F2 * F3 / ((F1 - F2) * (F1 - F3)) +
                    X2 * F1 * F3 / ((F2 - F1) * (F2 - F3)) +
                    X3 * F1 * F2 / ((F3 - F1) * (F3 - F2));

            if ((D - X1) * (D - X2) >= 0) {
                D = (X1 + X2) / 2;
            }

            // 计算新的F值
            double[] result4 = PZOFDT(D, T);
            F = result4[0] - P;

            if (Math.abs(F) <= TOL) {
                double[] result5 = PZOFDT(D, T);
                return new double[]{D, result5[1], result5[2]};
            }

            // 如果False Position法的根更接近,则丢弃二次解
            if (Math.abs(F3) < Math.abs(F) && F * F3 > 0) {
                if (F3 * F1 > 0) {
                    X1 = X3;
                    F1 = F3;
                } else {
                    X2 = X3;
                    F2 = F3;
                }
            } else {
                // 交换新的二次解值
                if (F * F3 < 0) {
                    X1 = D;
                    F1 = F;
                    X2 = X3;
                    F2 = F3;
                } else if (F3 * F1 > 0) {
                    X1 = D;
                    F1 = F;
                } else {
                    X2 = D;
                    F2 = F;
                }
            }
        }

        return new double[]{D, Z, BMIX};
    }
}

小结

计算结果(GBT17747.2-2011 附录C 1#气样)
在这里插入图片描述
GBT17747.2-2011 附录C 1#气样计算结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值