我有非常丑陋的符号函数,我想对其进行一些操作,然后对它们进行羔羊化。其中,我需要取共轭的导数。我的问题:导数和共轭分别工作,但是当我尝试对共轭的导数进行羔羊化时,它会抛出以下错误:
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.
当您尝试生成代码(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 是真实的,问题不仅更难,而且是不可能的)