【问题标题】:python sympy lambdify not working inside functionpython sympy lambdify 在函数内部不起作用
【发布时间】:2021-11-18 19:27:31
【问题描述】:

我正在尝试编写一个以文字函数作为参数的函数:

def derive(x, y):
    x = symbols(x)
    y = symbols(y)
    return lambdify(x, y)    

derive(5, 'x**2')

这会返回一个语法错误:

  File "<lambdifygenerated-32>", line 1
    def _lambdifygenerated(25.0):
                           ^
SyntaxError: invalid syntax

如果我写(在函数范围之外):

f = lambdify(x, x**2) f(5)

它有效。 感谢您对此提供的任何帮助。

【问题讨论】:

  • 你想达到什么目的?你为什么称你的函数为derive?为什么您认为使用lambdify 会对您的方法有用?写像x = symbols(x) 这样的东西非常令人困惑,应该避免;请不要在那里重用变量名。
  • 我想以这种方式编写函数的原因是:在机器学习中,计算给定函数的导数有几个步骤(使用 pytorch)。因此我想创建上述函数(虽然不完整),其中一个参数是要区分的函数。例如,derive(5, x**2) 将给出 2*x=10。

标签: sympy lambdify


【解决方案1】:

在 sympy 中,您可以通过 diff() 获得函数的导数。 .subs(x, 5)x 填写值5。一个例子:

from sympy.abc import x

f = x**2
print(f.diff(x).subs(x,5))

这是计算给定函数在给定值下的导数的函数的样子。 evalf() 可用于消除符号部分(例如给出 2*piSqrt(5) 的数字近似值,这是 sympy 标准希望保持其精确符号形式的)。

def derive_and_evaluate(x, f, xval):
    return f.diff(x).subs(x, xval).evalf()

derive_and_evaluate(x, x**2, 5)

如果您需要很多 x 值的相同导数,您可以这样做:

from sympy import lambdify

g = lambdify(x, f.diff(x)) # now `g` is a numpy function with one parameter

或者,如果您想要一个执行推导并转换为 numpy 形式的函数:

def derive_and_lambdify(x, f):
    return lambdify(x, f.diff(x))

g = derive_and_lambdify(x, x**2)
print(g(5))

从那时起,您可以像其他 numpy 函数一样使用g。这是一个更详细的示例:

from sympy import lambdify, sin
from sympy.abc import x

f = sin(1 / (1 + x ** 2))
g = lambdify(x, f.diff(x))

import numpy as np
from matplotlib import pyplot as plt

xs = np.linspace(-5, 5, 100)
ys = g(xs)
plt.plot(xs, ys)
plt.show()

【讨论】:

  • 优秀。比问题要求的更有价值和更有价值的信息。非常感谢。
  • 我在 stackoveflow 上看不到“接受答案”的选项。
猜你喜欢
  • 2022-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多