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}")