import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import root_scalar, minimize_scalar
def f(x):
# Коэффициенты варианта 16: x^3 + 0.205*x^2 - 10.880*x - 1.469
return x**3 + 0.205*x**2 - 10.880*x - 1.469
# 1. Таблица значений на [-5, 5] с шагом 0.5
print("x f(x)")
for x in np.arange(-5, 5.1, 0.5):
print(f'{x:.3f} {f(x):.3f}')
# 2. Предварительный график
xs = np.linspace(-5, 5, 100)
plt.plot(xs, f(xs))
plt.grid(True)
# 3. Корни через np.roots (коэффициенты: 1, 0.205, -10.880, -1.469)
coeff = [1, 0.205, -10.880, -1.469]
roots_np = np.roots(coeff)
print('\nКорни через np.roots:')
for r in roots_np:
print(f'{r:.6f}')
# 4. Корни через root_scalar (уточнение на интервалах)
r1 = root_scalar(f, bracket=[-3.5, -3.0], method='bisect').root
r2 = root_scalar(f, bracket=[0.0, 0.5], method='bisect').root
r3 = root_scalar(f, bracket=[3.0, 3.5], method='bisect').root
print(f'\nКорни через root_scalar: {r1:.8f}, {r2:.8f}, {r3:.8f}')
# 5. Экстремумы через minimize_scalar
# Минимум (около x = 1.925)
min_res = minimize_scalar(f, bounds=[1.5, 2.2], method='bounded')
# Максимум (около x = -1.886) – минимизируем -f(x)
max_res = minimize_scalar(lambda x: -f(x), bounds=[-2.2, -1.7], method='bounded')
print(f'\nМинимум: x = {min_res.x:.8f}, f(x) = {min_res.fun:.8f}')
print(f'Максимум: x = {max_res.x:.8f}, f(x) = {-max_res.fun:.8f}')
# Отображаем точки на графике
plt.plot(r1, f(r1), 'ro', markersize=8, label='Корни')
plt.plot(r2, f(r2), 'ro', markersize=8)
plt.plot(r3, f(r3), 'ro', markersize=8)
plt.plot(min_res.x, min_res.fun, 'g^', markersize=10, label='Минимум')
plt.plot(max_res.x, -max_res.fun, 'mv', markersize=10, label='Максимум')
plt.legend()
plt.title('Вариант 16: f(x) = x³ + 0.205x² - 10.880x - 1.469')
plt.xlabel('x')
plt.ylabel('f(x)')
plt.show()