Advertisement
Danila_lipatov

kop-1

Apr 15th, 2024
713
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.73 KB | None | 0 0
  1. import numpy as np
  2. # from scipy import stats as st
  3. # import math
  4. # import pandas as pd
  5. # from statistics import variance     #podpravlennoe
  6. import matplotlib.pyplot as plt
  7. from scipy.integrate import odeint
  8. from skimage.measure import block_reduce
  9.  
  10. # Определяем систему Лоренца
  11. def lorenz_system(state, t, sigma, ksi, r, epsilon, rho):
  12.     x, y, z = state
  13.     dxdt = y - rho * x + sigma * y * z
  14.     dydt = r * y - x * z + z
  15.     dzdt = ksi * x * y - epsilon * z
  16.     return dxdt, dydt, dzdt
  17.  
  18. # Вычислите фрактальную размерность, используя метод подсчета ящиков
  19. def box_counting(state, grid_size):
  20.  
  21.  
  22.     # Reshape the state array into a 3D grid
  23.     grid = np.zeros((grid_size, grid_size, grid_size))
  24.     state_min = np.min(state, axis=0)
  25.     state_max = np.max(state, axis=0)
  26.     state_range = state_max - state_min
  27.     state_scaled = (state - state_min) / state_range
  28.     grid_indices = (state_scaled * (grid_size - 1)).astype(int)
  29.     for i in range(len(state)):
  30.         x, y, z = grid_indices[i]
  31.         grid[x, y, z] = 1
  32.     box_counts = []
  33.     scales = []
  34.     for scale in range(1, grid_size):
  35.         scales.append(scale)
  36.         box_size = (grid_size // scale)
  37.         block_size = (scale, scale, scale)
  38.         block_counts = block_reduce(grid, block_size=block_size, func=np.sum)
  39.         box_count = np.sum(block_counts > 0)
  40.         box_counts.append(box_count)
  41.     # Рассчитываем наклон логарифмического графика подсчета ящиков по сравнению с масштабами
  42.     log_box_counts = np.log(box_counts)
  43.     log_scales = np.log(scales)
  44.     slope, intercept = np.polyfit(log_scales, log_box_counts, 1)
  45.  
  46.     return slope
  47.  
  48. if __name__ == '__main__':
  49.     # Задаем начальные условия и вектор времени
  50.     state0 = [1, 2, 3]
  51.     t = np.arange(0, 100, 0.01)
  52.     sigma = 2.7
  53.     r = 1.7
  54.     epsilon = 9
  55.     rho = 3
  56.     ksi = 2
  57.  
  58.     # Решаем дифференциальное уравнение
  59.     state = odeint(lorenz_system, state0, t, args=(sigma, ksi, r, epsilon, rho))
  60.     # Строим аттрактор Лоренца
  61.     # fig = plt.figure()
  62.     # ax = fig.gca(projection='3d')
  63.     fig = plt.figure(figsize=(16, 12.5))
  64.     ax = fig.add_subplot(2, 2, 1, projection="3d")
  65.     ax.plot(state[:, 0], state[:, 1], state[:, 2])
  66.     ax.set_xlabel('x')
  67.     ax.set_ylabel('y')
  68.     ax.set_zlabel('z')
  69.     ax.set_title('Lorenz Attractor')
  70.     plt.show()
  71.     # Используем сокращение блоков для расчета количества блоков для разных размеров сетки
  72.     # Вычисляем поточечную фрактальную размерность
  73.     pointwise_fractal_dimension = box_counting(state, grid_size=100)
  74.     # Вычисляем корреляционную фрактальную размерность
  75.     correlation_fractal_dimension = box_counting(np.diff(state, axis=0), grid_size=100) # Рассчитать информационную фрактальную размерность
  76.     X = state.T
  77.     X_d = np.diff(X, axis=1)
  78.     info_fractal_dimension = np.sum(np.log(np.abs(X_d))) / np.sum(np.log(1.0 / np.abs(np.diff(t))))
  79.     # Вывод фрактальных размерностей
  80.     print(f"The pointwise fractal dimension of the Lorenz attractor is approximately {pointwise_fractal_dimension:.2f}")
  81.     print(
  82.         f"The correlation fractal dimension of the Lorenz attractor is approximately {correlation_fractal_dimension:.2f}")
  83.     print(f"The informational fractal dimension of the Lorenz attractor is approximately {info_fractal_dimension:.2f}")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement