Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
28
Добавлен:
09.12.2017
Размер:
1.73 Кб
Скачать
class Percolation{
public static void main(String args[]){
// Количество запусков для усреднения:
int N=100;
// Количество точек вычисления вероятности:
int M=5;
// Размер сетки:
int n=200;
// Переменная-счетчик:
int count;
// Начальная вероятность и ее приращение:
double q=0.57,dq=0.01;
// Матрица перколяционной сетки:
int[][] A=new int[n][n];
// Массив со значениями вероятностей:
double[][] P=new double[2][M+1];
// Индексные переменные:
int i,j,k,m;
// Заполнение массива вероятностей:
for(m=0;m<=M;m++) P[0][m]=q+dq*m;
// Вычисление вероятностей протекания:
for(m=0;m<=M;m++){
// Начальное значение вероятности протекания:
P[1][m]=0;
for(k=1;k<=N;k++){
for(i=0;i<n;i++){
for(j=0;j<n;j++){
// Заполнение перколяционной матрицы:
if(Math.random()>P[0][m]) A[i][j]=1;
else A[i][j]=0;}}
// "Заливка" жидкости (заполнение первого столбца):
for(i=0;i<n;i++){
if(A[i][0]==0) A[i][0]=2;}
// Определение протекания:
do{
// Начальное состояние счетчика:
count=0;
// Изменение состояния узлов сетки:
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(A[i][j]==2){
if(i>0&&A[i-1][j]==0) {A[i-1][j]=2; count++;}
if(i<n-1&&A[i+1][j]==0) {A[i+1][j]=2; count++;}
if(j<n-1&&A[i][j+1]==0) {A[i][j+1]=2; count++;}
if(j>0&&A[i][j-1]==0) {A[i][j-1]=2; count++;}
}}}
}while(count>0);
// Проверка последнего столбца перколяционной матрицы:
for(i=0;i<n;i++){
if(A[i][n-1]==2){
    P[1][m]+=(double)1/N;
    break;}
}}}
// Вывод результата на экран:
System.out.print("Протекание узла \t");
for(m=0;m<=M;m++){
System.out.print(Math.round(P[0][m]*100)/100.0+(m!=M?"\t":"\n"));}
System.out.print("Протекание сетки\t");
for(m=0;m<=M;m++){
System.out.print(Math.round(P[1][m]*100)/100.0+(m!=M?"\t":"\n"));}
}}