【问题标题】:Is there a way to define a function through symbolic derivation?有没有办法通过符号推导来定义函数?
【发布时间】:2017-05-31 14:10:43
【问题描述】:

有没有办法通过符号推导来定义函数?例如,

def f(x):return x**x
def df(x) : return diff(f(x),x)

这段代码不起作用,因为df(1) 是不可能的(diff(f(1),1) 没有意义。)但是有没有办法利用“diff”的结果?打印df(x)时,有一个漂亮的函数形式,变量x,很整洁。

【问题讨论】:

  • 一切皆有可能。所以问题应该是:是否已经有一个内置的机制呢?没有。有没有图书馆可以做到这一点?不太可能,因为这需要对 Python 的内部结构(即函数对象)进行一些非常核心的黑客攻击。 Python 函数毕竟不是数学函数。如果你真的需要,那么我建议使用一些专门的数学语言(例如 maple)。
  • 你对diff的定义在哪里?
  • diff 是一个 python 命令,它进行符号微分。

标签: python function diff sympy


【解决方案1】:

不需要 Maple 或 Mathematica。 Python有同情心。

import numpy as np
from sympy import symbols, diff, lambdify

x = symbols('x')

def f(x):
    return x**x

def df(x):
    return diff(f(x))

print(df(x))

这将返回符号导数x**x*(log(x) + 1)。现在,这取决于你想用它做什么。似乎您想计算数值而不必知道导数是x**x*(log(x) + 1)。 sympy 推荐的计算许多数值的方法是使用它的lambdify

df_numeric = lambdify(x, df(x), modules=['numpy'])
df_numeric(5)

这给出了 8154.4934763565643。您可以对照常规的手动功能对其进行检查:

def df_manual(n):
    return n**n*(np.log(n) + 1)

df_manual(5)

【讨论】:

  • 你也可以print(df(x).subs(x,5))。这首先对 x 进行推导,然后在结果中将 x 替换为 1。
  • @Hannebambel 是的!我刚刚提到了lambdify,因为我假设提问者会将该函数用于许多值。但是subs 对于一次性结果来说是可以的,正如文档在比较两者时提到的那样(对于任何阅读的人来说都是一个有用的链接):docs.sympy.org/latest/modules/numeric-computation.html
  • 答案和评论都回答了我的问题!谢谢
  • 完美地绘制了原始函数及其导数。
  • “modules=['numpy']”在lambdify里面的作用是什么? lambdify(x, df(x), modules=['numpy'])
猜你喜欢
  • 2020-06-15
  • 2023-03-13
  • 2023-03-21
  • 1970-01-01
  • 2013-05-24
  • 1970-01-01
  • 1970-01-01
  • 2019-03-26
  • 1970-01-01
相关资源
最近更新 更多