Advertisement
Guest User

Untitled

a guest
Feb 28th, 2020
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.27 KB | None | 0 0
  1. import numpy as np
  2. from numpy.linalg import matrix_power as mp
  3.  
  4. def read_matrix(filename: str):
  5.     """
  6.    Читает матрицу из файла
  7.    """
  8.     matrix = np.zeros((15, 15))
  9.     with open(filename, encoding='utf-8') as f:
  10.         for i, line in enumerate(f):
  11.             matrix[i, :] = list(map(float, line.replace(',', '.').split()))
  12.     return matrix
  13.  
  14. def task1(p: np.array, i: int, j: int, k: int) -> int:
  15.     """
  16.    Вероятность того, что за k шагов система перейдет из состояния i в состояние j
  17.    """
  18.     p_k = mp(p, k)
  19.     return p_k[i, j]
  20.  
  21. def task2(p: np.array, a_0: np.array, k: int) -> np.array:
  22.     """
  23.    Вероятности состояний системы спустя k шагов, если в начальный момент вероятность состояний были a_0
  24.    """
  25.     return np.dot(mp(p, k), a_0)
  26.  
  27. def task3(p: np.array, i: int, j: int, k: int) -> float:
  28.     """
  29.    Вероятность первого перехода за k шагов из состояния i в состояние j
  30.    """
  31.     p_ = p
  32.     for _ in range(2, k+1):  # 2, 3, 4, ..., k-1, k
  33.         new = np.zeros(p.shape)  # сделаем матрицу для рассчета вероятности первого прехода для конкретного k
  34.         # заполняем матрицу
  35.         for i in range(p.shape[0]):
  36.             for j in range(p.shape[1]):
  37.                 s = 0
  38.                 for m in range(p.shape[0]):
  39.                     s += p[i, m] * p_[m, j] if m != j else 0
  40.                 new[i, j] = s
  41.         # делаем полученную матрицу p_(k-1)
  42.         p_ = new
  43.     return p_[i, j]
  44.  
  45. def task4(p: np.array, i: int, j: int, k: int) -> float:
  46.     """
  47.    Вероятность перехода из i в j не позднее, чем за k шагов
  48.    """
  49.     s = 0
  50.     for t in range(k):
  51.         s += task3(p, i, j, t)
  52.     return s
  53.  
  54. def task5(p: np.array, i: int, j: int) -> float:
  55.     """
  56.    Среднее количество шагов для перехода из состояния i в состояние j
  57.    """
  58.     t = 1
  59.     t_ = 0
  60.     for t in range(1, 10):  # поставить большое число
  61.         t_ += t * task3(p, i, j, t)
  62.     return t_
  63.  
  64.  
  65. def task6(p: np.array, j: int, k: int) -> float:
  66.     """
  67.    Вероятность первого возвращения в состояние j за k шагов
  68.    """
  69.     s = np.zeros(p.shape)
  70.     for m in range(1, k):
  71.         s += task6(p, j, m) * mp(p, k-m)
  72.     return (mp(p, k) - s)[j, j]
  73.  
  74.  
  75. def task7(p: np.array, j: int, k: int) -> float:
  76.     """
  77.    Вероятность возвращения в состояние j не позднее чем за k шагов
  78.    """
  79.     s = 0
  80.     for t in range(1, k+1):
  81.         s += task6(p, j, t)
  82.     return s
  83.  
  84. def task8(p: np.array, j: int) -> float:
  85.     """
  86.    Среднее время возвращения в состояние j
  87.    """
  88.     s = 0
  89.     for t in range(1, 20):  # большое число
  90.         s += t * task6(p, j, t)
  91.     return s
  92.  
  93. def task9(p):
  94.     """
  95.    Установившиеся вероятности
  96.    """
  97.     m = p.T - np.eye(p.shape[0])
  98.     m[-1, :] = 1
  99.     b = np.array([0] * (p.shape[0] - 1) + [1])
  100.     x = np.dot(np.linalg.inv(m), b)
  101.     return x
  102.  
  103. if __name__ == "__main__":
  104.     matrix = read_matrix('matrix.txt')
  105.    
  106.     ### Task1
  107.     print(f'1) Вероятность того, что за 8 шагов система перейдет из состояния 11 в состояние 2: {task1(matrix, 10, 1, 8):.3f}')
  108.    
  109.     ### Task2
  110.     t2 = task2(matrix, np.array((0.08,0.11,0.09,0.11,0,0.01,0.05,0.01,0.12,0.05,0.07,0.11,0.06,0.05,0.08)), 10)
  111.     print(f'2) Вероятности состояний системы спустя 10 шагов, если в начальный момент вероятность состояний были следующими: \nA=(0,08;0,11;0,09;0,11;0;0,01;0,05;0,01;0,12;0,05;0,07;0,11;0,06;0,05;0,08)\n')
  112.     print(t2)
  113.  
  114.     ### Task3
  115.     print(f'3) Вероятность первого перехода за 8 шагов из состояния 14 в состояние 3')
  116.     print(task3(matrix, 13, 2, 8))
  117.  
  118.     ### Task4
  119.     print(f'4) Вероятность перехода из состояния 3 в состояние 13 не позднее чем за 10 шагов')
  120.     print(task4(matrix, 2, 12, 10))
  121.  
  122.     ### Task5
  123.     print(f'5) Среднее количество шагов для перехода из состояния 11 в состояние 15')
  124.     print(task5(matrix, 10, 14))
  125.  
  126.     ### Task6
  127.     print(f'6) Вероятность первого возвращения в состояние 5 за 7 шагов')
  128.     print(task6(matrix, 4, 7))
  129.  
  130.     ### Task7
  131.     print(f'7) Вероятность возвращения в состояние 5 не позднее чем за 6 шагов')
  132.     print(task7(matrix, 4, 6))
  133.  
  134.     ### Task8
  135.     print(f'8) Среднее время возвращения в состояние 12')
  136.     print(task8(matrix, 11))
  137.  
  138.     ### Task9
  139.     print(f'Установившиеся вероятности')
  140.     print(task9(matrix))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement