Advertisement
Guest User

Untitled

a guest
Dec 17th, 2018
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.04 KB | None | 0 0
  1. import numpy as np
  2.  
  3.  
  4. def generateY_0():
  5. IB = np.kron(np.identity(W + 1), b)
  6. y_0 = np.matrix([[0 for __ in range((W + 1) * (M + 1))] for _ in range((W + 1) * (M + 1))])
  7. y_0[0:W + 1, W + 1:(W + 1) * (M + 1)] = IB
  8.  
  9. return y_0
  10.  
  11.  
  12. def generateY_1():
  13. kron_sum = np.kron(D_0, np.identity(M)) + np.kron(np.identity(W + 1), S)
  14.  
  15. diag = kron_sum.diagonal()
  16. R = np.diagflat(np.absolute(diag))
  17. y_21 = np.dot(np.linalg.inv(R), np.kron(np.identity(W + 1), S_0))
  18. tmp = np.dot(np.linalg.inv(R), kron_sum)
  19. y_22 = tmp + np.identity(tmp.shape[0])
  20.  
  21. y_1 = np.matrix([[0. for __ in range((W + 1) * (M + 1))] for _ in range((W + 1) * (M + 1))])
  22. y_1[W + 1: W + (W + 1) * (M + 1), 0: (W + 1)] = y_21
  23. y_1[W + 1:(W + 1) * (M + 1), W + 1:(W + 1) * (M + 1)] = y_22
  24. return y_1
  25.  
  26.  
  27. def generateY_2():
  28. y_2 = np.matrix([[0. for __ in range((W + 1) * (M + 1))] for _ in range((W + 1) * (M + 1))])
  29. kron_sum = np.kron(D_0, np.identity(M)) + np.kron(np.identity(W + 1), S)
  30. diag = kron_sum.diagonal()
  31. R = np.diagflat(np.absolute(diag))
  32. y_22 = np.dot(np.linalg.inv(R), np.kron(D_1, np.identity(M)))
  33. y_2[W + 1:(W + 1) * (M + 1), W + 1:(W + 1) * (M + 1)] = y_22
  34. return y_2
  35.  
  36.  
  37. def solveEquation():
  38. G_0 = np.identity((W + 1) * (M + 1))
  39. tmp1 = np.linalg.inv(np.identity((W + 1) * (M + 1)) - Y_1)
  40. tmp2 = Y_0 + np.dot(Y_2, np.dot(G_0, G_0))
  41. G_1 = np.dot(tmp1, tmp2)
  42. while np.linalg.norm(G_1 - G_0) > e_g:
  43. G_0 = G_1
  44. tmp1 = np.linalg.inv(np.identity((W + 1) * (M + 1)) - Y_1)
  45. tmp2 = Y_0 + np.dot(Y_2, np.dot(G_0, G_0))
  46. G_1 = np.dot(tmp1, tmp2)
  47.  
  48. return G_1;
  49.  
  50.  
  51. def generateQii(i):
  52. q00 = np.matrix([[0. for __ in range((W + 1) * (M + 1))] for _ in range((W + 1) * (M + 1))])
  53. q00[W + 1:(W + 1) * (M + 1), 0:W + 1] = np.kron(np.identity(W + 1), S_0)
  54. q00[0:(W + 1), 0:W + 1] = D_0 - i * alpha * np.identity(W + 1)
  55. q00[0:(W + 1), W + 1:(W + 1) * (M + 1)] = np.kron(D_1, b)
  56. kron_sum = np.kron(D_0, np.identity(M)) + np.kron(np.identity(W + 1), S)
  57. q00[W + 1:(W + 1) * (M + 1), W + 1:(W + 1) * (M + 1)] = kron_sum
  58. return q00;
  59.  
  60.  
  61. def generateQiiPlus1():
  62. q01 = np.matrix([[0. for __ in range((W + 1) * (M + 1))] for _ in range((W + 1) * (M + 1))])
  63. q01[W + 1:(W + 1) * (M + 1), W + 1:(W + 1) * (M + 1)] = np.kron(D_1, np.identity(M));
  64. return q01;
  65.  
  66.  
  67. def generateQiiMin1(i):
  68. q10 = np.matrix([[0. for __ in range((W + 1) * (M + 1))] for _ in range((W + 1) * (M + 1))])
  69. q10[0:(W + 1), W + 1:(W + 1) * (M + 1)] = np.kron(i * alpha * np.identity(W + 1), b)
  70. return q10;
  71.  
  72.  
  73. def find_i0():
  74. i0 = 100;
  75. G_i0 = np.dot(np.transpose(-generateQii(i0 + 1) - np.dot(generateQiiPlus1(), G)), generateQiiMin1(i0 + 1))
  76. while np.linalg.norm(G_i0 - G) < e_g:
  77. i0 += 10
  78. G_i0 = np.dot(np.transpose(-generateQii(i + 1) - np.dot(generateQiiPlus1(), G)), generateQiiMin1(i + 1))
  79. return i0;
  80.  
  81.  
  82. def generateG_i(G_iPlus1, i):
  83. G_i = np.dot(np.linalg.inv(-generateQii(i + 1) - np.dot(generateQiiPlus1(), G_iPlus1)), generateQiiMin1(i + 1))
  84. return G_i;
  85.  
  86.  
  87. def generateQ(i, Gi):
  88. return generateQii(i) + np.dot(generateQiiPlus1(), Gi)
  89.  
  90.  
  91. def generateF_i(i, Q):
  92. return np.dot(np.dot(listF[i - 1], generateQiiPlus1()), np.linalg.inv(-Q));
  93.  
  94.  
  95. def solveP():
  96. Q00 = -listQ[0]
  97. F = np.matrix([[0. for __ in range((W + 1) * (M + 1))] for _ in range((W + 1) * (M + 1))])
  98. for f in listF:
  99. F += f
  100. F = np.dot(F, np.ones((M + 1) * (W + 1)))
  101. Q00[0:1, 0:(W + 1) * (M + 1)] = F
  102. zero = np.zeros((W + 1) * (M + 1))
  103. zero[0] = 1
  104. return np.linalg.solve(Q00, zero)
  105.  
  106.  
  107. def criterion(D_0, D_1, S, beta, size) -> bool:
  108. D_0 = np.array(D_0)
  109. D_1 = np.array(D_1)
  110. S = np.array(S)
  111. beta = np.array(beta)
  112. EPS = 10**(-5)
  113. nul = np.array([0]*size)
  114. eden = np.array([1] * size)
  115. # print(EPS)
  116. D = D_0 + D_1
  117. D = np.matrix.transpose(D)
  118. D[0] = [1] * size
  119. nul[0] = 1
  120. # print(D)
  121. Teta = np.linalg.solve(D, nul)
  122. print("Teta: ", Teta)
  123. lamb = np.dot(Teta, np.dot(D_1, eden))
  124. print("Lambda = ", lamb )
  125. # print("Inverse matrix S")
  126. # print(np.linalg.inv(S))
  127. # print(np.linalg.inv(S)*np.matrix.transpose(S))
  128. nym = np.dot(np.dot(beta, np.linalg.inv(S)), eden)
  129. nym = (-1)/nym
  130. print("Ny = ", nym)
  131. print("ro = ", lamb/nym)
  132. return (lamb/nym + EPS) < 1
  133.  
  134. def checkNegative(matrix):
  135. for i in range(len(matrix)-1):
  136. if matrix[i,i] > 0:
  137. return False
  138. return True
  139.  
  140.  
  141. if __name__ == '__main__':
  142. print('Hello! Please, enter W')
  143. # W = int(input())
  144. W = 1
  145. D_0 = np.matrix([[0 for __ in range(W + 1)] for _ in range(W + 1)])
  146. D_1 = np.matrix([[0 for __ in range(W + 1)] for _ in range(W + 1)])
  147.  
  148. print('Please, enter matrix elements')
  149. D_0 = np.matrix([[-8, 1], [1, -11]])
  150. D_1 = np.matrix([[2, 5], [4, 6]])
  151.  
  152. # for i in range(W + 1):
  153. # D_0[i] = [float(j) for j in input().split()]
  154. # for i in range(W + 1):
  155. # D_1[i] = [float(j) for j in input().split()]
  156.  
  157. print('Please, enter M')
  158. # M = int(input())
  159. M = 2
  160. print('Enter b')
  161. b = np.array([float(i) for i in input().split()])
  162. # print('Enter S')
  163. # S = np.matrix([[0 for _ in range(M + 1)] for __ in range(M + 1)])
  164.  
  165. S = np.matrix([[-30., 30.], [0., -30.]])
  166. E = np.ones(W + 1)
  167. S_0_1 = np.dot(-S, E)
  168. S_0 = np.transpose(S_0_1)
  169.  
  170. # for i in range(M + 1):
  171. # S[i] = [float(i) for i in input().split()]
  172. # e_g, e_f = [float(i) for i in input().split()]
  173.  
  174. e_g = 0.000000001
  175. e_f = 0.000001
  176. alpha = 100000000
  177.  
  178. print(criterion(D_0, D_1, S, b, W + 1))
  179.  
  180. Y_0 = generateY_0()
  181. Y_1 = generateY_1()
  182. Y_2 = generateY_2()
  183. G = solveEquation()
  184.  
  185. Q00 = generateQii(0)
  186. Q01 = generateQiiPlus1()
  187. Q10 = generateQiiMin1(1)
  188.  
  189. I = find_i0()
  190. print("i0 = ", I)
  191.  
  192. i = I
  193. listG = [G]
  194. while i >= 0:
  195. listG = [generateG_i(listG[0], i)] + listG
  196. i -= 1
  197.  
  198. listQ = []
  199. i = I
  200. while i >= 0:
  201. listQ = [generateQ(i, listG[i])] + listQ
  202. i -= 1
  203.  
  204. listF = [np.identity((W + 1) * (M + 1))]
  205. i = 1
  206. while i < I + 1:
  207. listF.append(generateF_i(i, listQ[i]))
  208. if np.linalg.norm(listF[len(listF) - 1], np.inf) < e_f:
  209. break
  210. i += 1
  211.  
  212. if np.linalg.norm(listF[len(listF) - 1], np.inf) > e_f:
  213. while np.linalg.norm(listF[len(listF) - 1], np.inf) > e_f:
  214. listF.append(generateF_i(i, generateQ(i, G)))
  215. i += 1
  216. p0 = solveP()
  217. p = []
  218. for f in listF:
  219. p.append(np.array(np.dot(p0, f)).flatten())
  220.  
  221. i = 0
  222. prob = []
  223. for Pi in p:
  224. prob.append(np.dot(Pi, np.transpose(np.ones((W+1)*(M+1)))))
  225. print("probability that in orbit ", i, "applications: ", np.dot(Pi, np.transpose(np.ones((W+1)*(M+1)))))
  226. i += 1
  227.  
  228. probSum = 0
  229. i = 1
  230. for pr in prob:
  231. probSum += i*pr
  232. i += 1
  233. print("Average count of requests on orbit", probSum)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement