在python中使用Abs查找函数的派生

 honey爱一个人好难 发布于 2023-02-07 18:02

我想y=Abs(0.5-0.5*sqrt(1-4*x))使用python 计算0.1的导数。这是我的代码:

x=Symbol('x')
y=Abs(0.5-0.5*sqrt(1-4*x))
deriv=y.diff(x)
d=lambdify(x,deriv,'numpy')
print d(0.1)

这是我得到的:

Traceback (most recent call last):
  File "/home/milossimic/g4/s1/.../optimize.py", line 100, in 
    print d(0.1)
  File "", line 1, in 
NameError: global name 'Derivative' is not defined

我是一个新手,sympy而且numpy,所以我想我使用了错误的方法来确定衍生物。

编辑:我打印了派生,这就是我得到的:

阅读此http://docs.sympy.org/dev/modules/functions/elementary.html之后,我尝试了fdiff()

x=Symbol('x')
y=Abs(0.5-0.5*sqrt(1-4*x))
deriv=y.fdiff()
d=lambdify(x,deriv,'numpy')
print d(0)

但是,在尝试了其他值以计算导数之后,我发现结果deriv实际上是-1、0或1 sign(-0.5*sqrt(-4*x + 1) + 0.5)

我该怎么办?

numpy和sympy都被导入:

from sympy import *
import numpy as np

如果我尝试查找不在Abs下的函数的派生,则没有问题。

1 个回答
  • 这比任何其他问题都更是一个数学问题。

    >>> import sympy
    >>> x = sympy.symbols('x')
    >>> def f(x):
    ...  return abs(x)
    ... 
    >>> dx = f(x).diff(x)
    >>> dx
    (re(x)*Derivative(re(x), x) + im(x)*Derivative(im(x), x))/Abs(x)
    

    注意,有一个实部和一个虚部。abs(x)在每个实数x处都是可微的,但为零。但是,涉及到复杂的值时存在一些问题(由于我不知道复杂的差异,所以无法解释)。我猜想sympy没有实现,因此返回Derivative(f)而不是f的实际导数。

    如果您只使用实数,则只需使用x = sympy.symbols('x', real=True)

    >>> import sympy
    >>> x = sympy.symbols('x', real=True)
    >>> def f(x):
    ...  return abs(0.5-0.5*(1-4*x)**0.5)
    ... 
    >>> dx = f(x).diff(x)
    >>> dx
    (1.0*(-0.5*re((-4*x + 1)**0.5) + 0.5)*re((-4*x + 1)**(-0.5)) - 0.5*im((-4*x + 1)**(-0.5))*im((-4*x + 1)**0.5))/Abs(-0.5*(-4*x + 1)**0.5 + 0.5)
    >>> dx_ = sympy.lambdify(x, dx)
    >>> dx_(0.1)
    1.2909944487358056
    

    2023-02-07 18:06 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有