Guest User

Untitled

a guest
Jun 19th, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.47 KB | None | 0 0
  1. require 'mathn'
  2.  
  3. L = 5
  4. M = 4
  5. K = 3
  6. N = 2
  7.  
  8. Delta = 10**-5
  9.  
  10. data = <<MATRIX
  11. 0 1 0 0 0 0 0 0
  12. 0 0.5 0.5 0 0 0 0 0
  13. 0 0 0 1 0 0 0 0
  14. 0 0 0 0 1 0 0 0
  15. 0 0 0 0 0 0 1 0
  16. 0 0.333 0.333 0 0 0 0.333 0
  17. 0 0 0 0 0 0 0.5 0.5
  18. 0 0 0 0 0 0 0 1
  19. MATRIX
  20.  
  21. transitions = data.split("\n").map {|row| row.split.map {|it| eval it }}
  22.  
  23. class FixedMatrix < Matrix
  24. def **(d)
  25. (d == 0 and square?) ? self.class.identity(column_size) : super
  26. end
  27. end
  28.  
  29. class Program
  30. attr_reader :size, :k
  31.  
  32. def initialize(data)
  33. @p = FixedMatrix.rows data
  34. @size = @p.row_size
  35. calculate_k
  36. end
  37.  
  38. def calculate_k
  39. @k = 1
  40. @k += 1 while 1 - (@p**@k)[0, @size-1] > Delta
  41. end
  42.  
  43. def probability_density_for(k)
  44. (@p**k)[0, @size-1] - (@p**(k-1))[0, @size-1]
  45. end
  46.  
  47. def singular
  48. @f ||= Array.new(@k) {|k| probability_density_for(k + 1) }
  49. end
  50.  
  51. def sequential(n)
  52. f = singular
  53. fr = f.clone
  54. k = fr.size * 2
  55. 2.upto(n) do
  56. ff = Array.new(k, 0)
  57. 0.upto(k-1) do |i|
  58. (i>=f.length ? (i-f.length+1) : 0).upto(i>=fr.length ? fr.length-1 : i) {|j| ff[i+1]+=fr[j]*f[i-j]}
  59. end
  60. fr = ff.clone
  61. k += f.length
  62. end
  63. fr
  64. end
  65.  
  66. def parallel_and(n)
  67. unless n.is_a?(Array)
  68. f = singular
  69. fr = Array.new(f.length,0)
  70. 0.upto(fr.length-1) do |i|
  71. proda,prodb=1,1
  72. 1.upto(n) do
  73. suma,sumb=0,0
  74. 0.upto(i) do |j|
  75. suma+=f[j]
  76. if j<i : sumb+=f[j]
  77. end
  78. end
  79. proda*=suma
  80. prodb*=sumb
  81. end
  82. fr[i]=proda-prodb
  83. end
  84. fr
  85. else
  86. fs = n
  87. fr = Array.new(k,0)
  88. (@k-1).times do |i|
  89. a = fs.inject(1) do |prod, f|
  90. prod * f.take(i+1).inject(0) {|sum, fi| sum + fi }
  91. end
  92. b = fs.inject(1) do |prod, f|
  93. f1 = f.clone
  94. f1.pop
  95. prod * f1.take(i).inject(0) {|sum, fi| sum + fi }
  96. end
  97. fr[i+1] = a - b
  98. end
  99. fr
  100. end
  101. end
  102.  
  103. def parallel_or(n, f=nil)
  104. unless n.is_a?(Array)
  105. f ||= singular
  106. fr = Array.new(f.length,0)
  107. 0.upto(fr.length-1) do |i|
  108. proda,prodb=1,1
  109. 1.upto(n) do
  110. suma,sumb=0,0
  111. 0.upto(i) do |j|
  112. suma+=f[j]
  113. if j<i : sumb+=f[j]
  114. end
  115. end
  116. proda*=1-suma
  117. prodb*=1-sumb
  118. end
  119. fr[i]=prodb-proda
  120. end
  121. fr
  122. else
  123. f = n
  124. fr = Array.new(k,0)
  125. 0.upto(fr.length-1) do |i|
  126. proda,prodb=1,1
  127. f.size.times do |f_index|
  128. suma,sumb=0,0
  129. 0.upto(i) do |j|
  130. suma+=f[f_index][j]
  131. if j<i : sumb+=f[f_index][j]
  132. end
  133. end
  134. proda*=1-suma
  135. prodb*=1-sumb
  136. end
  137. fr[i]=prodb-proda
  138. end
  139. fr
  140. end
  141. end
  142.  
  143. def binominal(m, l)
  144. return 0 if m > l
  145. c = 1
  146. 1.upto(m) do |i|
  147. c *= l
  148. c /= i
  149. c -= 1
  150. end
  151. c
  152. end
  153.  
  154. def out_of(m, l)
  155. return parallel_and l if m == l
  156. fr = parallel_and m
  157. bc = binominal m, l
  158. parallel_or bc, fr
  159. end
  160. end
  161.  
  162. def dynamic_characteristics_for(f)
  163. m, d = 0, 0
  164. f.each_with_index {|fk, k| m += fk*(k+1) }
  165. f.each_with_index {|fk, k| d += fk*(k+1-m)**2 }
  166. e = 1 - f.inject {|sum, el| sum + el }
  167. [m, d, e]
  168. end
  169.  
  170. def print_density(header, f)
  171. puts header
  172. puts "=================="
  173. f.each_with_index do |fk, i|
  174. k = i + 1
  175. puts "Fk(#{k})=#{fk}"
  176. end
  177. puts "==================\n\n"
  178. end
  179.  
  180. def print_characteristics(header, data)
  181. m,d,e = *data
  182. puts header
  183. puts "Математическое ожидание: #{m},\nДисперсия:#{d},\nОшибка:#{e}\n\n"
  184. end
  185.  
  186. program = Program.new transitions
  187. Singular = program.singular
  188. Out = program.out_of M, L
  189. And = program.parallel_and K
  190. Or = program.parallel_or [Out, And]
  191. Full = program.parallel_and [Or, Singular]
  192.  
  193. puts "Параметры системы: L=#{L}, M=#{M}, K=#{K}, N=#{N}\n\n"
  194. print_characteristics "Один процесс:", dynamic_characteristics_for(Singular)
  195. print_characteristics "M из L:", dynamic_characteristics_for(Out)
  196. print_characteristics "И:", dynamic_characteristics_for(And)
  197. print_characteristics "ИЛИ:", dynamic_characteristics_for(Or)
  198. print_characteristics "Полная программа:", dynamic_characteristics_for(Full)
Add Comment
Please, Sign In to add comment