import numpy as np
import matplotlib.pyplot as plt
# Коэффициенты для варианта 16:
# Исходное уравнение: x^3 - B*x^2 + C*x - D = 0, где B = -0.205, C = -10.880, D = 1.469
# После подстановки: x^3 + 0.205*x^2 - 10.880*x - 1.469 = 0
a3 = 1.0
a2 = 0.205
a1 = -10.880
a0 = -1.469
def f(x):
"""Кубическая функция"""
return a3*x**3 + a2*x**2 + a1*x + a0
def fp(x):
"""Первая производная: f'(x) = 3x^2 + 0.41x - 10.880"""
return 3*a3*x**2 + 2*a2*x + a1
def fpp(x):
"""Вторая производная: f''(x) = 6x + 0.41"""
return 6*a3*x + 2*a2
# ----- Нахождение экстремумов аналитически (без золотого сечения) -----
# Решаем квадратное уравнение f'(x) = 0: 3x^2 + 0.41x - 10.880 = 0
A = 3
B_fp = 2*a2 # = 0.41
C_fp = a1 # = -10.880
discriminant = B_fp**2 - 4*A*C_fp
x1 = (-B_fp - np.sqrt(discriminant)) / (2*A)
x2 = (-B_fp + np.sqrt(discriminant)) / (2*A)
# Определяем, где максимум, а где минимум (по знаку второй производной)
if fpp(x1) < 0:
x_max, x_min = x1, x2
else:
x_max, x_min = x2, x1
y_max = f(x_max)
y_min = f(x_min)
print("=== Аналитическое нахождение экстремумов (без золотого сечения) ===")
print(f"Максимум: x = {x_max:.8f}, f(x) = {y_max:.8f}")
print(f"Минимум: x = {x_min:.8f}, f(x) = {y_min:.8f}")
# ----- Корни уравнения -----
coeff = [a3, a2, a1, a0]
roots = np.roots(coeff)
real_roots = [r.real for r in roots if abs(r.imag) < 1e-10]
print("\n=== Корни уравнения f(x) = 0 ===")
for i, r in enumerate(real_roots, 1):
print(f"x{i} = {r:.8f}, f(x) = {f(r):.2e}")
# ----- Построение графика -----
x_vals = np.linspace(-5, 5, 500)
y_vals = f(x_vals)
plt.figure(figsize=(10, 6))
plt.plot(x_vals, y_vals, 'b-', linewidth=2, label='f(x)')
plt.axhline(0, color='black', linestyle='--', linewidth=0.8, alpha=0.7)
plt.axvline(0, color='black', linestyle='--', linewidth=0.8, alpha=0.7)
# Отмечаем экстремумы
plt.plot(x_max, y_max, 'ro', markersize=8, label='Максимум')
plt.plot(x_min, y_min, 'bo', markersize=8, label='Минимум')
# Отмечаем корни
for i, r in enumerate(real_roots):
plt.plot(r, 0, 'gx', markersize=10, label='Корень' if i == 0 else '')
plt.grid(True, alpha=0.3)
plt.title("Кубическая функция: экстремумы и корни (вариант 16)")
plt.xlabel('x')
plt.ylabel('f(x)')
plt.legend()
plt.tight_layout()
plt.show()