梯度(2d)搜索函数returns None。问题是什么?

The gradient (2d) search function returns None. What is the problem?

我有一个函数应该 return 渐变。

def numerical_derivative_2d(func, epsilon):
    def grad_func(x):
        grad_func = (func(x + np.array([epsilon, 0])) - func(x)) / epsilon, (func(x + np.array([0, epsilon])) - func(x)) / epsilon
    return grad_func

但是在计算特定点的梯度时,我得到None。

t1 = lambda x: (
            -1 / ((x[0] - 1)**2 + (x[1] - 1.5)**2 + 1)
            * np.cos(2 * (x[0] - 1)**2 + 2 * (x[1] - 1.5)**2))
t2 = numerical_derivative_2d(t, 0.1)
t3 = t2([3, 4])

对象类:t1-function,t2-function,t3-None(我想得到一个二维点)

请告诉我如何更改此行

    grad_func = (func(x + np.array([epsilon, 0])) - func(x)) / epsilon, (func(x + np.array([0, epsilon])) - func(x)) / epsilon

让它发挥作用?

PS。我知道有计算梯度的内置方法。但这是其中一门课程的家庭作业。想了解错误,按模板做。

PPS.This 可能是不必要的,但我将给出一个按我预期工作的单个变量函数的任务示例。

def numerical_derivative_1d(func, epsilon):
    def deriv_func(x):
        return (func(x + epsilon) - func(x)) / epsilon      
    return deriv_func

def polynom_to_prime(x):
    return 20 * x**5 + x**3 - 5 * x**2 + 2 * x + 2.0

t2 = numerical_derivative_1d(polynom_to_prime, 1e-5)
t3 = t2(3)

并且 t3 是一个数字(点),而不是 None

def grad_func(x) 中,你什么都不 return。在该函数内部,grad_func 是一个局部变量。考虑这样写:

def numerical_derivative_2d(func, epsilon):
    def grad_func(x):
        return (func(x + np.array([epsilon, 0])) - func(x)) / epsilon, (func(x + np.array([0, epsilon])) - func(x)) / epsilon
    return grad_func