def f(x):
    return (x + 3)**2

def df(x):
    return 2 * (x + 3)

# Step 2: Initialize parameters
x = 2                # starting point
learning_rate = 0.1  # step size
epochs = 30          # number of iterations

# Step 3: Gradient Descent loop
for i in range(epochs):
    grad = df(x)                    # compute gradient
    x = x - learning_rate * grad    # update x
    print(f"Iteration {i+1}: x = {x:.4f}, f(x) = {f(x):.4f}")

print("\nLocal minima occurs at x =", round(x, 4))
print("Minimum value of function =", round(f(x), 4))