In [86]:
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import random
import sympy as sp
import pandas as pd

sp.init_printing(use_unicode=True, wrap_line=False, no_global=True)

np.set_printoptions(precision=3)

rnd = random.Random('123')
rand = rnd.random

In [2]:
print('Задача 1. Моделирование непрерывной случайной величины с помощью обратной функции.')
print('Дана плотность распределения')
print(' ')


# Строим график плотности распределения
# Количество реализаций
num = 50
a = 2.0
b = 5.0
#  Задаём  интервала по x
x1 = np.linspace(-10, 3) 
x1_2 = np.zeros(num)
x1_2[:] = 2.0
x2 = np.linspace(a, b)  
x2_3 = np.zeros(num)
x2_3[:] = 5.0
x3 = np.linspace(5, 15) 
x1_2
#  Считаем значения функций на всех интервалах
y1 = np.zeros(num)
y1[:] = 0.0
y1_2 = np.linspace(0, (1 / 39) * (x1_2[0]**2))#0:step_y:(1/63)*x1_2.^2
y2 = np.zeros(num)
y2[:] = (1/39) * (x2**2)
y2_3 = np.linspace(0, (1 / 39) * (x2_3[0]**2)) #0:step_y:(1/63)*x2_3.^2
y3 = np.zeros(num) 
#
plt.figure(1)

plt.plot(x1, y1,'r-')
plt.plot(x1_2, y1_2,'r-')
plt.plot(x2, y2,'r-')
plt.plot(x2_3, y2_3,'r-')
plt.plot(x3, y3,'r-')

plt.ylabel('f_ksi(x)')
plt.xlabel('x')
plt.hold(True)
plt.grid(True)
 
x = sp.Symbol('x')

F_x = sp.integrate((1/39) * (x**2), (x, 3, x))
print('F_x:')
sp.pretty_print(F_x)


Задача 1. Моделирование непрерывной случайной величины с помощью обратной функции.
Дана плотность распределения
 
F_x:
                     3                    
0.00854700854700855⋅x  - 0.230769230769231

In [7]:
print(sp.cancel(F_x))
arg_x = 0.00529100529100529
arg_b = 0.142857142857143


0.00854700854700855*x**3 - 0.230769230769231

In [3]:
# Строим график функции распределения
#  Задаём  интервала по x
x1 = np.linspace(-10, 2) 
x2 = np.linspace(2, 5) 
x3 = np.linspace(5, 15) 
 
#  Считаем значения функций на всех интервалах
y1 = np.zeros(x1.shape)
y2 = np.zeros(x2.shape)
y2[:] = (1/117) * (x2**3-8)
y3 = np.ones(x3.shape) 

plt.figure(1)

plt.plot(x1, y1,'r-')
plt.plot(x2, y2,'r-')
plt.plot(x3, y3,'r-')

plt.ylabel('F_ksi(x)')
plt.xlabel('x')
plt.grid(True)
plt.hold(True) 
print('-------------------------- ')
# Количество реализаций
print('Количество реализаций n:')
n1 = 100
print(n1)

#  # Массив псевдослучайных чисел
print('Массив псевдослучайных чисел альфа:')
genalpha1 = np.random.uniform(size=100) # rand(100,1)

print(genalpha1)

# Получим n-реализаций случайной величины кси с помощью моделирующей
# Массив n-реализаций случайной величины кси A
print('Массив n-реализаций случайной величины кси A:')
A1 = ((117) * genalpha1 + 8) ** (1/3) 

print(A1)


-------------------------- 
Количество реализаций n:
100
Массив псевдослучайных чисел альфа:
[ 0.945  0.029  0.413  0.133  0.117  0.407  0.064  0.752  0.973  0.537
  0.692  0.546  0.782  0.609  0.526  0.47   0.395  0.735  0.692  0.396
  0.522  0.703  0.621  0.681  0.809  0.241  0.96   0.636  0.682  0.526
  0.515  0.367  0.665  0.251  0.872  0.373  0.271  0.004  0.868  0.807
  0.819  0.565  0.469  0.587  0.262  0.798  0.536  0.768  0.015  0.55
  0.584  0.787  0.648  0.27   0.443  0.719  0.791  0.839  0.863  0.966
  0.962  0.384  0.724  0.62   0.524  0.674  0.175  0.276  0.067  0.5    0.216
  0.306  0.302  0.825  0.658  0.576  0.876  0.678  0.805  0.772  0.36
  0.207  0.591  0.933  0.446  0.977  0.073  0.029  0.313  0.651  0.104
  0.573  0.422  0.625  0.511  0.719  0.671  0.131  0.241  0.086]
Массив n-реализаций случайной величины кси A:
[ 4.913  2.247  3.833  2.865  2.787  3.818  2.492  4.578  4.958  4.137
  4.464  4.158  4.634  4.294  4.112  3.979  3.784  4.546  4.464  3.788
  4.103  4.485  4.321  4.442  4.683  3.308  4.937  4.351  4.445  4.112
  4.088  3.706  4.411  3.343  4.791  3.723  3.413  2.04   4.784  4.679
  4.699  4.201  3.975  4.249  3.383  4.663  4.136  4.608  2.139  4.168
  4.241  4.643  4.377  3.409  3.911  4.515  4.65   4.735  4.776  4.946
  4.94   3.756  4.527  4.319  4.107  4.428  3.054  3.427  2.512  4.051
  3.217  3.527  3.513  4.711  4.396  4.225  4.799  4.436  4.676  4.616
  3.687  3.182  4.256  4.894  3.92   4.964  2.545  2.249  3.548  4.383
  2.721  4.218  3.856  4.328  4.078  4.516  4.422  2.856  3.306  2.623]

In [19]:
print('-------------------------- ')
print('Задача 2. Моделирование непрерывной случайной величины с кусочно-линейной плотностью.')
print('Дана плотность распределения.')
print(' ')
A = np.array([-3, 0.05])
B = np.array([-1, 0.05])
C = np.array([ 2, 0.25])
D = np.array([ 4, 0.05])
E = np.array([7, 0.05])
figure = np.array([A, B, C, D, E])
print(figure.shape, figure)
plt.figure(3)
plt.plot(figure[:,0], figure[:, 1], 'r-')
plt.grid(True)
plt.axis('on')


-------------------------- 
Задача 2. Моделирование непрерывной случайной величины с кусочно-линейной плотностью.
Дана плотность распределения.
 
(5, 2) [[-3.    0.05]
 [-1.    0.05]
 [ 2.    0.25]
 [ 4.    0.05]
 [ 7.    0.05]]
Out[19]:
$$\left ( -4.0, \quad 8.0, \quad 0.05, \quad 0.3\right )$$

In [54]:
print('Зададим функцию распределения')
def rand_alpha(a):
    if a <= 0.1:
        return (a - 0.05) / 0.05
    
    elif 0.1 < a <= 0.55:
        return -1.75 + 5 * np.sqrt(-0.0975 + 1.2*a)
    
    elif 0.55 < a <= 0.85:
        return 4.5 - 5 * np.sqrt(0.69 - 0.8*a)
    
    else:
        return (a - 0.65) / 0.05
print('Создаём 100 реализаций alpha')
alpha = np.random.uniform(size=100)
print(alpha)

print('Для зажаный alpha получаем ksi')
ksi = np.vectorize(rand_alpha)(alpha)
print(ksi)
print('Ksi max:', np.max(ksi))
print('Ksi min:', np.min(ksi))


Зададим функцию распределения
Создаём 100 реализаций alpha
[ 0.59   0.679  0.763  0.49   0.954  0.538  0.66   0.923  0.619  0.85
  0.885  0.436  0.648  0.196  0.441  0.802  0.624  0.687  0.77   0.419
  0.752  0.287  0.749  0.478  0.527  0.355  0.786  0.729  0.727  0.306
  0.833  0.99   0.551  0.265  0.505  0.553  0.118  0.754  0.711  0.127
  0.578  0.211  0.842  0.969  0.536  0.838  0.312  0.477  0.787  0.819
  0.405  0.289  0.161  0.515  0.311  0.318  0.132  0.591  0.218  0.041
  0.359  0.311  0.676  0.072  0.625  0.668  0.618  0.397  0.897  0.292
  0.326  0.819  0.256  0.759  0.741  0.689  0.294  0.177  0.336  0.35
  0.527  0.721  0.882  0.019  0.326  0.472  0.218  0.899  0.502  0.635
  0.968  0.614  0.429  0.385  0.776  0.061  0.469  0.544  0.005  0.606]
Для зажаный alpha получаем ksi
[ 2.165  2.583  3.087  1.75   6.089  1.951  2.487  5.463  2.292  3.994
  4.704  1.51   2.427  0.107  1.536  3.402  2.316  2.628  3.143  1.432
  3.011  0.737  2.995  1.702  1.907  1.118  3.265  2.863  2.856  0.844
  3.732  6.804  2.003  0.595  1.813  2.014 -0.698  3.03   2.76  -0.576
  2.113  0.225  3.864  6.39   1.944  3.796  0.88   1.694  3.273  3.571
  1.364  0.746 -0.203  1.859  0.878  0.915 -0.515  2.17   0.274 -0.185
  1.138  0.873  2.57   0.435  2.322  2.527  2.29   1.328  4.948  0.763
  0.958  3.573  0.542  3.063  2.942  2.639  0.778 -0.056  1.016  1.089
  1.908  2.818  4.643 -0.616  0.958  1.673  0.277  4.984  1.801  2.367
  6.358  2.271  1.48   1.269  3.188  0.216  1.662  1.976 -0.894  2.236]
Ksi max: 6.80443612664
Ksi min: -0.894453537893

In [62]:
plt.plot(figure[:,0], figure[:, 1] * 100 - 5, 'r-')
plt.hist(ksi, bins=10)


Out[62]:
(array([  7.,   9.,  18.,  22.,  19.,  12.,   4.,   4.,   1.,   4.]),
 array([-0.894, -0.125,  0.645,  1.415,  2.185,  2.955,  3.725,  4.495,
         5.265,  6.035,  6.804]),
 <a list of 10 Patch objects>)

In [ ]:


In [67]:
print('---------------------------------')
print('Задача 3. Моделирование трехмерного нормального вектора.')
print(' ')

# Количество реализаций
print('Количество реализаций n:')
n2 = 100
print(n2)

print('Вектор математических ожиданий a.')
a = np.array([-1, 4, 3])
print(a)


print(' ')
print('Ковариационная матрица C.')
C = np.array([
        np.array([6, 2, 1]),
        np.array([-2, 6, 1]),
        np.array([1, 1, 5])
    ])
print(C)

print(' ')
# создадим матрицу, заполненую нулями.
B = np.zeros((3,3))

B[0,0] = np.sqrt(C[0,0])
print('B11 = ', B[0,0])

B[0,1] = C[0,1] / B[0,0]
print('B12 = ', B[0,1])

B[1,1] = np.sqrt(C[1,1] - B[0,1]**2)
print('B22 = ', B[1,1])

B[0,2] = C[0,2] / B[0,0]
print('B13 = ', B[0,2])

B[1,2] = (C[1,2] - B[0,1] * B[0,2]) / B[1,1]
print('B23 = ', B[1,2])

B[2,2] = np.sqrt(C[2,2] - (B[0,2]**2) - (B[1,2]**2))
print('B33 = ', B[2,2])

print('\r\nВерхнетреугольная матрица B.')
print(B)


---------------------------------
Задача 3. Моделирование трехмерного нормального вектора.
 
Количество реализаций n:
100
Вектор математических ожиданий a.
[-1  4  3]
 
Ковариационная матрица C.
[[ 6  2  1]
 [-2  6  1]
 [ 1  1  5]]
 
B11 =  2.44948974278
B12 =  0.816496580928
B22 =  2.30940107676
B13 =  0.408248290464
B23 =  0.288675134595
B33 =  2.17944947177

Верхнетреугольная матрица B.
[[ 2.449  0.816  0.408]
 [ 0.     2.309  0.289]
 [ 0.     0.     2.179]]

In [91]:
print(' ')
print('Найдем ksi.')

#  Массив псевдослучайных чисел
# print('Массив псевдослучайных чисел альфа1:')
alpha = np.random.uniform(size=100)
# print(alpha1)

# print('Массив псевдослучайных чисел альфа1:')
alpha2 = np.random.uniform(size=100)
# print(alpha2)

# print('Массив псевдослучайных чисел альфа1:')
alpha3 = np.random.uniform(size=100)
# print(alpha3)
n2 = 100

alpha = np.random.uniform(size=(100,3))
omega = np.zeros((n2, 3))

w = np.zeros((n2, 3))
ksi = np.zeros((n2,3))
for i in range(n2):#i=1:n2
    omega[i,0] = 1 - 2*alpha[i, 0]
    gamma1 = 1 - 2*alpha[i, 0]
    gamma2 = 1 - 2*alpha[i, 1]
    D = (gamma1**2) + (gamma2**2)
    omega[i,1] = gamma1 * np.sqrt((1-omega[i,0]**2) / D)
    omega[i,2] = gamma2 * np.sqrt((1-omega[i,0]**2) / D)
    
    cnt = 0
    for j in range(3):  #j=1:3:
        ksi[i,j] = omega[i,j] * B[j, j] + a[j]
        cnt = cnt+1
     

print('N-реализаций вектора ksi')
# print(ksi)
pksi = pd.DataFrame(ksi, index=None)
pksi.to_excel('lab3_task_3.xlsx')


 
Найдем ksi.
N-реализаций вектора ksi

In [ ]: