package game;
import java.util.*;
public class hydrological_forecast2 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
// 参数Ke、Xe和n的确定
// System.out.print("请输入河长L值:");
// int L = sc.nextInt();
// System.out.print("请输入△t值:");
// int bt = sc.nextInt();
// System.out.print("请输入x值:");
// double x = sc.nextDouble();
// System.out.print("请输入K值:");
// int K = sc.nextInt();
int L = 512;
int bt = 3;
double x = 0.34;
int K = 12;
int Ke = bt;
int n = K/bt;
double Le = L/n;
double Xe = 0.5-n*(1-2*x)/2;
System.out.println("Ke值为"+Ke);
System.out.println("Xe值为"+Xe);
System.out.println("n值为"+n);
// C0 C1 C2 的确定
double C0 = (0.5*bt-Ke*Xe)/(0.5*bt+Ke-Ke*Xe);
double C1 = (0.5*bt+Ke*Xe)/(0.5*bt+Ke-Ke*Xe);
double C2 = (-0.5*bt+Ke-Ke*Xe)/(0.5*bt+Ke-Ke*Xe);
double CC = C0+C1+C2;
System.out.println("C0值=:"+C0);
System.out.println("C1值=:"+C1);
System.out.println("C2值=:"+C2);
System.out.println("C0+C1+C2值=:"+CC);
// 创建数组列表sites储存P
ArrayList<Double> sites = new ArrayList<Double>();
double A = C1+C0*C2;
// 将0段汇流系数P加入数组列表
sites.add(Math.pow(C0, 4));
// 其余段汇流系数pm
double sum;
for (int m = 1; m <20; m++) {
sum = 0;
for (int i = 1; i <= n ; i++) {
if (m-i >= 0) {
double A1 = Math.pow(A, i);
double B = Factorial(n)*Factorial(m-1)/(Factorial(i)*Factorial(i-1)*Factorial(n-i)*Factorial(m-i));
double C01 = Math.pow(C0, n-i);
double C21 = Math.pow(C2, m-i);
sum += A1*B*C01*C21;
}
}
sites.add(sum);
}
// 输出
System.out.println("汇流系数保留六位小数:");
double falg=0;
int p = 0;
for (int i = 0; i < sites.size(); i++) {
System.out.println(String.format("%.6f", sites.get(i)));
falg += sites.get(i);
// 定义条件,跳出循环
if (falg >= 1) {
p = i;
break;
}
}
outQ(sites,p);
}
// 阶乘计算
public static double Factorial(int n) {
double sum=1;
for (int i = 1; i <= n ; i++) {
sum*=i;
}
return sum;
}
// 输入输出Q 注意:此方法未完善
public static void outQ(ArrayList<Double> sites,int p) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入上游入流量个数:");
int x = sc.nextInt();
System.out.println("请输入上游入流量:");
double[] I = new double[x];
for (int i = 0; i < x; i++) {
I[i] = sc.nextDouble();
}
// 计算入流乘于汇流系数
double[][] qp = new double[I.length][p];
for (int j = 0; j < I.length; j++) {
for (int k = 0; k < p; k++) {
qp[j][k] = I[j]*sites.get(k);
}
}
// 输出下游流量
double sum;
for (int i = 0; i < p; i++) {
sum = 0;
for (int j = qp.length-1; j >= 0 ; j--) {
sum += qp[i][j];
sum += qp[i+1][j-1];
System.out.println(sum);
}
}
}
}
java马斯京根法计算汇流系数P
最新推荐文章于 2024-11-05 09:39:57 发布