import numpy as np
from scipy.optimize import fsolve

# 定义微分方程的右侧函数
def f(t, y):
    return t**2 + t - y

# 梯形法的数值求解函数
def trapezoidal_method(f, y0, t0, tn, h):
    t_values = np.arange(t0, tn + h, h)
    y_values = [y0]
    y_current = y0
    
    for i in range(1, len(t_values)):
        t_n = t_values[i - 1]
        t_n1 = t_values[i]
        
        # 初步猜测 y_n1 使用 Euler 法
        y_guess = y_current + h * f(t_n, y_current)
        
        # 定义非线性方程的根，使得其为零
        def equation(y_n1):
            return y_n1 - y_current - (h / 2) * (f(t_n, y_current) + f(t_n1, y_n1))
        
        # 使用 fsolve 解非线性方程
        y_n1 = fsolve(equation, y_guess)[0]
        
        # 更新 y_current 并添加到结果中
        y_values.append(y_n1)
        y_current = y_n1
    
    return t_values, y_values

# 参数设置
y0 = 0          # 初始条件
t0 = 0          # 起始时间
tn = 0.5        # 终止时间
h = 0.1         # 步长

# 计算数值解
t_values, y_values = trapezoidal_method(f, y0, t0, tn, h)

# 输出每一步的结果
for t, y in zip(t_values, y_values):
    print(f"y({t:.1f}) = {y:.6f}")