input: Write a python function to perform gradient descent on a given function with initial parameters and learning rate.
  assert gradient_descent(lambda x, y: np.square(x) + 2 * np.square(y), 0, 0, 10, 1000) == (0, 0)
  assert gradient_descent(lambda x, y: np.square(x) + 2 * np.square(y), 1, 1, 0.1, 1000) == (0, 0)
  assert gradient_descent(lambda x, y: np.square(x) + 2 * np.square(y), -1, -1, 0.1, 1000) == (0, 0)
output: import numpy as np
  
  def gradient_descent(f, x0, y0, lr, iterations):
      x, y = x0, y0
      
      for _ in range(iterations):
          grad_x = (f(x + 1e-5, y) - f(x - 1e-5, y)) / (2 * 1e-5)
          grad_y = (f(x, y + 1e-5) - f(x, y - 1e-5)) / (2 * 1e-5)
          
          x -= lr * grad_x
          y -= lr * grad_y
      
      return round(x, 6), round(y, 6)