DmitriyMV

Untitled

Jun 22nd, 2021 (edited)
742
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.68 KB | None | 0 0
  1. import pandas as pd
  2. import math
  3. import matplotlib.pyplot as plt
  4. # disable chained assignments
  5. pd.options.mode.chained_assignment = None
  6.  
  7.  
  8. def draw_F(x, p, show):
  9.     print("Найдем функция распределения случайной величины.\nРисуем график F(x) от x")
  10.     slv = "F(x)=\n"
  11.     slv += "----\n"
  12.     slv += f"|0 ,если x <={x[0]}\n"
  13.     plt.plot([x[0]-2, x[0]], [0, 0], label=f"x <={x[0]}")
  14.     for i in range(len(x)-1):
  15.         sum_p = sum(p[0:i+1])
  16.         plt.plot([x[i], x[i+1]], [sum_p, sum_p], label=f"{x[i]}< x <={x[i+1]}")
  17.         slv += f"|{sum_p} ,если {x[i]}< x <={x[i+1]}\n"
  18.     slv += f"|1 , если x >{x[len(x)-1]}\n"
  19.     plt.plot([x[len(x)-1], x[len(x)-1]+2], [1, 1],  label=f"x <={x[0]}")
  20.     slv += "----"
  21.     if(show):
  22.         print(slv)
  23.     print([x[len(x)-1]])
  24.     plt.xlabel('x')
  25.     plt.ylabel('F(x)')
  26.     plt.grid()
  27.     plt.legend()
  28.     if(show):
  29.         plt.show()
  30.  
  31.  
  32. def math_wait(x: list, p: list, show):
  33.     x_graph = x
  34.     p_graph = p
  35.     slv = "Найдем Мат. Ожидание\n"
  36.     slv += "M(X)= Σm(i)p(i) = "
  37.     M = sum(float(x[i])*float(p[i]) for i in range(len(x)))
  38.     slv += f"{M}"
  39.     print(slv)
  40.  
  41.     slv = "Найдем \nx - M (x),\n(x - M (x))^2,\nx_i*p_i\nx_i^2*p_i,\nДисперсию = D(X)=M[(X - M(x^2))], которая не может быть отрицателной,\nсигму (называют средним квадратическим отклонением) σ(X)=√D(x)"
  42.     print(slv)
  43.  
  44.     x_minus_Mx = [i-M for i in x]
  45.     x_minus_Mx2 = [i**2 for i in x_minus_Mx]
  46.     x_minus_Mx2_pi = [x_minus_Mx2[i]*p[i] for i in range(len(x_minus_Mx2))]
  47.     xp = [x[i]*p[i] for i in range(len(x))]
  48.     x2p = [(x[i]**2)*p[i] for i in range(len(x))]
  49.  
  50.     slv = "\nНайдем Дисперпсию cлучайной величины X\nD(X)=M[(X - M(x^2))] =\nили\nD(X)=M(X^2)-(M(X))^2=\n= "
  51.     D = round(sum(x_minus_Mx2_pi), 3)
  52.     print(pd.Series([sum(x)]))
  53.     x = x.append(pd.Series([sum(x)]), ignore_index=True)
  54.     p = p.append(pd.Series([sum(p)]), ignore_index=True)
  55.     x_minus_Mx.append(sum(x_minus_Mx))
  56.     x_minus_Mx2.append(sum(x_minus_Mx2))
  57.     x_minus_Mx2_pi.append(sum(x_minus_Mx2_pi))
  58.     xp.append(sum(xp))
  59.     x2p.append(sum(x2p))
  60.     # добавляем последний столбец - сумму
  61.     df = pd.DataFrame({
  62.         "x": x,
  63.         "p": p,
  64.         "x - M (x)": x_minus_Mx,
  65.         "(x - M (x))^2": x_minus_Mx2,
  66.         "(x-M(x))^2*p_i, sum=D": x_minus_Mx2_pi,
  67.         "x_i*p_i": xp,
  68.         "(x_i^2)*p_i": x2p,
  69.     })
  70.     df = df.transpose()
  71.     df.rename(columns={len(p)-1: 'Сумма'}, inplace=True)
  72.     print("\nТаблица:")
  73.     print(df)
  74.     if(D < 0):
  75.         print("Ошибка! Дисперсия не может быть отрицательной")
  76.     slv += f"{D}\n\n"
  77.     sigma = round(math.sqrt(D), 3)
  78.     slv += f"Найдем среднее квадратическое отклонение (сигма σ)\nσ(X)=√D(x) =√({D}) = "
  79.     slv += f"{sigma}\n"
  80.     print(slv)
  81.     print(f"Ответ: M(X) = {M}, D(X) = {D}, σ(X) = {sigma}")
  82.  
  83.     print("Рисуем график pi от xi")
  84.     plt.plot(x_graph, p_graph, color="blue", label="pi от xi")
  85.     plt.xlabel('xi')
  86.     plt.ylabel('pi')
  87.     plt.grid()
  88.     plt.legend()
  89.     plt.show()
  90.     draw_F(x_graph, p_graph, show)
  91.     return M
  92.  
  93.  
  94. def solve_table_p(table, show):
  95.     print("----------")
  96.     print(table)
  97.     # решает таблицу и находит одну отсутвующую p
  98.     table = list(map(list, zip(*table)))
  99.     df = pd.DataFrame(table, columns=['m', 'p'])
  100.     sum_p = 0
  101.     p_index = -1
  102.     for i in range(len(df["p"])):
  103.         if type(df["p"][i]) != str:
  104.             sum_p += df["p"][i]
  105.         else:
  106.             p_index = i
  107.     if p_index == -1:
  108.         return math_wait(df["m"], df["p"], show)
  109.     x = round(1 - sum_p, 3)
  110.     df["p"][p_index] = x
  111.     print(f"Найдено отсутсвующее значение для {df['m'][p_index]} = {x}")
  112.     df = df.sort_values(by=['m'])
  113.     df2 = df.transpose()
  114.     print("Вся таблица")
  115.     print(df2)
  116.     math_wait(df["m"], df["p"], show)
  117.     return x
  118.  
  119.  
  120. def corMoment(M_e, n_list: list, M_n, e_list: list, table):
  121.     solve = "Корреляционный момент\n"
  122.     solve += "K_xy =  ∑_i∑_j(x_i-m_x(y_i-m_i))pij = "
  123.     K = 0
  124.     for i in range(len(n_list)):
  125.         for j in range(len(e_list)):
  126.             K += (e_list[j]-M_e)*(n_list[i]-M_n)*table[j][i]
  127.     solve += str(K)
  128.     print(solve)
  129.     print("Такие случайные величины называются некоррелированными (независимыми).")
  130.  
  131.  
  132. def countQ(n_list, e_list, table, a, b):
  133.     def q(e, n):
  134.         return a*e+b*n
  135.     row_of_distribution = []
  136.     solve = ""
  137.     for i in range(len(e_list)):
  138.         for t in range(len(n_list)):
  139.             q_buff = q(e_list[i], n_list[t])
  140.             solve += f"Q_{i+1}{t+1} = {q_buff}\n"
  141.             solve += f"P_{i+1}{t+1} = {table[i][t]}\n"
  142.             row_of_distribution.append([q_buff, table[i][t]])
  143.     row_of_distribution.sort(key=lambda x: x[0])
  144.     print(solve)
  145.     for row in row_of_distribution:
  146.         print(row)
  147.     solve_table_p([list(i) for i in zip(*row_of_distribution)], True)
  148.  
  149.  
  150. def sumTable(n_list, e_list, table, a=0, b=0):
  151.     solve = ""
  152.     # e table
  153.     solve += "Ei | "
  154.     for i in range(len(e_list)):
  155.         solve += str(e_list[i]) + "  |  "
  156.     solve += "\n------------------------\n"
  157.     solve += "Pi | "
  158.     e_sum = []
  159.     for i in range(len(e_list)):
  160.         buff_sum = sum(table[i])
  161.         e_sum.append(buff_sum)
  162.         solve += str(round(buff_sum, 2)) + " | "
  163.  
  164.     solve += "\n\n"
  165.     # n table
  166.     solve += "Ni | "
  167.     for i in range(len(n_list)):
  168.         solve += str(n_list[i]) + "  |  "
  169.     solve += "\n------------------\n"
  170.     solve += "Pi | "
  171.     n_sum = []
  172.     for i in range(len(n_list)):
  173.         buff_sum = sum([*zip(*table)][i])
  174.         n_sum.append(buff_sum)
  175.         solve += str(round(buff_sum, 2)) + " | "
  176.     solve += "\n\n"
  177.     print(solve)
  178.     print("Найдем мат ожидание для e")
  179.     M_e = solve_table_p([e_list, e_sum], True)
  180.     M_n = solve_table_p([n_list, n_sum], True)
  181.     corMoment(M_e, n_list, M_n, e_list, table)
  182.     # if(a!=0):
  183.     #     countQ(n_list, e_list, table, a, b)
  184.  
  185. n = [-1, 4]
  186. e = [-1, 2, 3]
  187. table = [
  188.     [0.5, 0.1],
  189.     [0.2, 0.05],
  190.     [0.05, 0.1],
  191. ]
  192. # вертикально записываем всегда большее количество чисел
  193. if len(n) > len(e):
  194.     # переворачиваем лист
  195.     table = [*zip(*table)]
  196. sumTable(n, e, table)
  197.  
Add Comment
Please, Sign In to add comment