在另一个函数内部与外部定义函数之间的区别

时间:2019-01-16 15:40:24

标签: python sympy derivative

我已经编写了一个函数derivative(w1, w2, pt),该函数在点f(x) = w1 * x**3 + w2 * x - 1上评估了函数pt的导数。奇怪的是,我发现根据def f(x)位于derivative(w1, w2, pt)内部还是外部而得到不同的结果。为什么def f(x)的位置很重要/哪个正确?

示例1:

def derivative(w1, w2, pt):
    x = sy.Symbol('x')

    def f(x):
        return w1 * x**3 + w2 * x - 1

    # Get derivative of f(x)
    def df(x):
        return sy.diff(f(x),x)

    # Evaluate at point x
    return df(x).subs(x,pt)   

derivative(5, 8, 2)从中返回68

示例2:

def f(x):
    return w1 * x**3 + w2 * x - 1

def derivative(w1, w2, pt):
    x = sy.Symbol('x')

    # Get derivative of f(x)
    def df(x):
        return sy.diff(f(x),x)

    # Evaluate at point x
    return df(x).subs(x,pt)

derivative(5, 8, 2)从中返回53

2 个答案:

答案 0 :(得分:2)

我认为这是您的全球范围受到污染。看这个例子:

import sympy as sy

def f(x, w1, w2):
    return w1 * x**3 + w2 * x - 1

def derivative(w1, w2, pt):
    x = sy.Symbol('x')

    # Get derivative of f(x)
    def df(x, w1, w2):
        return sy.diff(f(x, w1, w2),x)

    # Evaluate at point x
    return df(x, w1, w2).subs(x,pt)

print(derivative(5, 8, 2))

这只是示例2的修改版本,它返回相同的答案。

答案 1 :(得分:1)

嵌套函数可以访问父函数中的本地名称。定义formGroup.value 外部时,它无法访问本地fw1,因此必须假定它们是 globals < / em>。

如果您未在全局级别定义w2w1,则第二个版本实际上会引发w2

NameError

您没有得到异常意味着您已经已经定义了>>> import sympy as sy >>> def f(x): ... return w1 * x**3 + w2 * x - 1 ... >>> def derivative(w1, w2, pt): ... x = sy.Symbol('x') ... def df(x): ... return sy.diff(f(x),x) ... return df(x).subs(x,pt) ... >>> derivative(5, 8, 2) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 5, in derivative File "<stdin>", line 4, in df File "<stdin>", line 2, in f NameError: name 'w1' is not defined w1,而正是这些这些值用来提供您不正确的答案。

您可以通过将w2w1设置为全局变量来“修复”您的第二个示例。实际上,您作为w2调用的第一个和第二个参数传入的内容并不重要,因为这些derivative()w1参数值被完全忽略

w2

在您的本地设置中,您可能分别将>>> w1 = 5 >>> w2 = 8 >>> derivative('This value is ignored', 'And so is this one', 2) 68 w1分别设置为w24,因为正是这些值5x

53

在第一个示例中,>>> w1 = 4 >>> w2 = 5 >>> derivative('This value is ignored', 'And so is this one', 2) 53 中的本地人提供了w1w2;不管您定义了什么全局名称,都不会使用它们。

如果您想在derivative()之外定义f,并且仍然将derivative()w1传递给w2,那么您还需要传递这些derivative()函数上的相同值:

f()

现在def f(x, w1, w2): return w1 * x**3 + w2 * x - 1 def derivative(w1, w2, pt): x = sy.Symbol('x') # Get derivative of f(x, w1, w2) def df(x): return sy.diff(f(x, w1, w2), x) # Evaluate at point x return df(x).subs(x,pt) 从嵌套的f()函数(而不是全局变量)显式接收w1w2