Lambdify 不适用于共轭的导数

问题描述 投票:0回答:1

我有非常丑陋的符号函数,我想对其进行一些操作,然后对它们进行羔羊化。其中,我需要取共轭的导数。我的问题:导数和共轭分别工作,但是当我尝试对共轭的导数进行羔羊化时,它会抛出以下错误:

    PrintMethodNotImplementedError: Unsupported by <class 'sympy.printing.numpy.SciPyPrinter'>: <class 'sympy.core.function.Derivative'>
    Set the printer option 'strict' to False in order to generate partially printed code.

详细信息+工作/不工作示例

这是基本功能:

import sympy as sp

a, b = sp.symbols('a b')
def myfunction(x,y):
    return x + 1j * y

myfunctionval = myfunction(a,b)
myfunction_lam = sp.lambdify((a,b), myfunctionval)
print(myfunction_lam(1,2))
>> (1+2j)

这是共轭:

def myfunctionConjugate(x,y):
    return sp.conjugate(x + 1j * y)

myfunctionConjugateval = myfunctionConjugate(a,b)
myfunctionConjugate_lam = sp.lambdify((a,b), myfunctionConjugateval)
print(myfunctionConjugate_lam(1,2))
>> (1-2j)

这是导数:

def myfunctionDerivative(x,y):
    return sp.diff(x + 1j * y, x)

myfunctionDerivativeval = myfunctionDerivative(a,b)
myfunctionDerivative_lam = sp.lambdify((a,b), myfunctionDerivativeval)
print(myfunctionDerivative_lam(1,2))
>> 1

这是导数的共轭,其有效:

def myfunctionDerivativeConjugate(x,y):
    return sp.conjugate(sp.diff(x + 1j * y,x))

myfunctionDerivativeConjugateval = myfunctionDerivativeConjugate(a,b)
myfunctionDerivativeConjugate_lam = sp.lambdify((a,b), myfunctionDerivativeConjugateval)
print(myfunctionDerivativeConjugate_lam(1,2))
>> 1

这是共轭的导数,它不起作用:

def myfunctionConjugateDerivative(x,y):
    return sp.diff(sp.conjugate(x + 1j * y),x)

myfunctionConjugateDerivativeval = myfunctionConjugateDerivative(a,b)
myfunctionConjugateDerivative_lam = sp.lambdify((a,b), myfunctionConjugateDerivativeval)
myfunctionConjugateDerivative_lam(1,2)

并向我抛出这个错误:

---------------------------------------------------------------------------
PrintMethodNotImplementedError            Traceback (most recent call last)
/tmp/ipykernel_13914/1657192206.py in <module>
      3 
      4 myfunctionConjugateDerivativeval = myfunctionConjugateDerivative(a,b)
----> 5 myfunctionConjugateDerivative_lam = sp.lambdify((a,b), myfunctionConjugateDerivativeval)
      6 myfunctionConjugateDerivative_lam(1,2)

~/anaconda3/lib/python3.9/site-packages/sympy/utilities/lambdify.py in lambdify(args, expr, modules, printer, use_imps, dummify, cse, docstring_limit)
    878     else:
    879         cses, _expr = (), expr
--> 880     funcstr = funcprinter.doprint(funcname, iterable_args, _expr, cses=cses)
    881 
    882     # Collect the module imports from the code printers.

~/anaconda3/lib/python3.9/site-packages/sympy/utilities/lambdify.py in doprint(self, funcname, args, expr, cses)
   1169                 funcbody.append('{} = {}'.format(self._exprrepr(s), self._exprrepr(e)))
   1170 
-> 1171         str_expr = _recursive_to_string(self._exprrepr, expr)
   1172 
   1173         if '\n' in str_expr:

~/anaconda3/lib/python3.9/site-packages/sympy/utilities/lambdify.py in _recursive_to_string(doprint, arg)
    964 
    965     if isinstance(arg, (Basic, MatrixBase)):
--> 966         return doprint(arg)
    967     elif iterable(arg):
    968         if isinstance(arg, list):

~/anaconda3/lib/python3.9/site-packages/sympy/printing/codeprinter.py in doprint(self, expr, assign_to)
    170         self._number_symbols = set()
    171 
--> 172         lines = self._print(expr).splitlines()
    173 
    174         # format the output

~/anaconda3/lib/python3.9/site-packages/sympy/printing/printer.py in _print(self, expr, **kwargs)
    329                 printmethod = getattr(self, printmethodname, None)
    330                 if printmethod is not None:
--> 331                     return printmethod(expr, **kwargs)
    332             # Unknown object, fall back to the emptyPrinter.
    333             return self.emptyPrinter(expr)

~/anaconda3/lib/python3.9/site-packages/sympy/printing/codeprinter.py in _print_not_supported(self, expr)
    580     def _print_not_supported(self, expr):
    581         if self._settings.get('strict', False):
--> 582             raise PrintMethodNotImplementedError("Unsupported by %s: %s" % (str(type(self)), str(type(expr))) + \
    583                              "\nSet the printer option 'strict' to False in order to generate partially printed code.")
    584         try:

PrintMethodNotImplementedError: Unsupported by <class 'sympy.printing.numpy.SciPyPrinter'>: <class 'sympy.core.function.Derivative'>
Set the printer option 'strict' to False in order to generate partially printed code.

python sympy derivative lambdify
1个回答
0
投票

当您尝试生成代码(lambdify - 这里提到的

print
是代码的打印)时会发生这种情况,其中包含一些未解决的导数(也就是说,一旦简化和cse完成了它们的工作,在代码中仍然存在导数)结果)

在您的情况下,会发生这种情况,因为

a+ib
的共轭是
conjugate(a) - 1.0*I*conjugate(b)
。在没有任何轨迹信息的情况下,它的导数(例如 a 的共轭)是不可计算的。

(它与“导数共轭”不同,因为

a+ib
的导数只是1,无论
a
轨迹如何。因此,导数被替换为非常可计算的
1
,而dz¯/dz则不是)

所以,并不是说这是完全正常的(它应该引发另一个似乎是内部错误的错误)。但你要求的是一项不可能完成的任务。

但更深刻的原因可能是(我在这里猜测)您决定显式地设置函数参数

a+ib
,以显式地表示实部和虚部。所以,我猜你的意图是
a
b
是实数(并且
a+ib
是复数)。所以共轭(a+ib)就是(a-ib),它的导数(a)也是1(注意,如果a+ib是一个复数,并且你计算关于a的导数,那么,你修复“轨迹”(水平接近 a+ib)。

所以,否则的话,如果我猜对了,并且你的意图是拥有

a+ib
一个由实部 (a) 和虚部 (b) 组成的复合体,那么你应该这么说。

如果是的话,简短的解决方案:使用

创建符号
a, b = sp.symbols('a b', real=True)

然后,一切正常。

(再次强调,我不是 100% 确定这是你想要的,因为这是一个更容易的问题。另一方面,如果不指定 a 和 b 是真实的,问题不仅更难,而且是不可能的)

© www.soinside.com 2019 - 2024. All rights reserved.