Загрузка данных


import numpy as np
import matplotlib.pyplot as plt


# Диапазон оси X (от 20 до 70, 500 точек)
x = np.linspace(20, 70, 500)

#Параметры для трёх функций
tri_params = {'a': 30, 'b': 45, 'c': 60}           # Треугольник
trap_params = {'a': 30, 'b': 40, 'c': 50, 'd': 60} # Трапеция
gauss_params = {'c': 45, 'sigma': 4}               # Гаусс



def triangular(x, a, b, c):
    """Треугольная функция: растёт до b, потом падает"""
    y = np.zeros_like(x)
    # Левая сторона (рост)
    left = (x >= a) & (x < b)
    y[left] = (x[left] - a) / (b - a)
    # Правая сторона (спад)
    right = (x >= b) & (x <= c)
    y[right] = (c - x[right]) / (c - b)
    return y

def trapezoidal(x, a, b, c, d):
    """Трапеция: растёт, держится на 1, падает"""
    y = np.zeros_like(x)
    # Рост
    rise = (x >= a) & (x < b)
    y[rise] = (x[rise] - a) / (b - a)
    # Плато (верх)
    flat = (x >= b) & (x <= c)
    y[flat] = 1.0
    # Спад
    fall = (x > c) & (x <= d)
    y[fall] = (d - x[fall]) / (d - c)
    return y

def gaussian(x, c, sigma):
    """Гауссова функция: колокол с центром в c"""
    return np.exp(-((x - c) ** 2) / sigma)

def get_centroid(x, y):
    """Находит центр тяжести: сумма(x*y) / сумма(y)"""
    if np.sum(y) == 0:
        return 0
    return np.sum(x * y) / np.sum(y)



#Треугольная функция ---
y1 = triangular(x, **tri_params)
c1 = get_centroid(x, y1)

plt.figure(figsize=(8, 5))
plt.plot(x, y1, 'b-', linewidth=2, label='Треугольная')
plt.plot([30, 45, 60], [0, 1, 0], 'bo')  # Узловые точки
plt.axvline(c1, color='black', linestyle='--', label=f'Центроид = {c1:.2f}')
plt.title('Треугольная функция')
plt.xlabel('Возраст')
plt.ylabel('μ(x)')
plt.ylim(-0.1, 1.1)
plt.grid(True, alpha=0.5)
plt.legend()
plt.show()

print(f"✓ Центроид треугольной: {c1:.4f}")

#Трапециевидная функция
y2 = trapezoidal(x, **trap_params)
c2 = get_centroid(x, y2)

plt.figure(figsize=(8, 5))
plt.plot(x, y2, 'g-', linewidth=2, label='Трапециевидная')
plt.plot([30, 40, 50, 60], [0, 1, 1, 0], 'go')  # Узловые точки
plt.axvline(c2, color='black', linestyle='--', label=f'Центроид = {c2:.2f}')
plt.title('Трапециевидная функция')
plt.xlabel('Возраст')
plt.ylabel('μ(x)')
plt.ylim(-0.1, 1.1)
plt.grid(True, alpha=0.5)
plt.legend()
plt.show()

print(f"✓ Центроид трапеции: {c2:.4f}")

#Гауссова функция ---
y3 = gaussian(x, **gauss_params)
c3 = get_centroid(x, y3)

plt.figure(figsize=(8, 5))
plt.plot(x, y3, 'r-', linewidth=2, label='Гауссова')
plt.plot(45, 1, 'ro')  # Центр
plt.axvline(c3, color='black', linestyle='--', label=f'Центроид = {c3:.2f}')
plt.title('Гауссова функция')
plt.xlabel('Возраст')
plt.ylabel('μ(x)')
plt.ylim(-0.1, 1.1)
plt.grid(True, alpha=0.5)
plt.legend()
plt.show()

print(f"✓ Центроид гауссовой: {c3:.4f}")