在sympy中找出复数绝对值的导数的根

时间:2018-06-16 14:10:48

标签: python sympy symbolic-math

本质上我想要做的是获取一个复数的绝对值,该复数在实部和虚部中都有一个参数,并根据该参数得出。然后我想知道该参数的哪个值导数为零。所以基本上我想知道带参数的复数的绝对值的最小值/最大值。

我在使用sympy时遇到了一个问题,并且不知道如何解决它/如果它的问题在他们的最后。在我将其报告为bug之前,我想在这里问一下。 好的,这基本上就是我想做的事情(实现有点复杂,但错误是相同的)

0 import sympy
1 import mpmath
2 sympy.init_printing() # enable pretty printing
3 a,b = sympy.symbols("a,b") # a and b are symbols a and b
4 c = a+ 1j*b # complex number a+ib
5 d = sympy.Abs(c) # absolute value of c
6 e = d.diff(b,1) # derive d in respect to b one time
7 f = sympy.lambdify(b,e) # lambdify e with b as parameter
8 g = mpmath.findroot(f,0) # find root of f starting at 0

错误发生在第8行,但由于f。例如,使用f调用f(1)会产生相同的错误。错误是:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1, in <lambda>
NameError: name 'Derivative' is not defined

我得到了整个工作但只有我自己编写了类似绝对值的方法并避免使用sympy函数。例如,

d = (sympy.re(c)**2 + sympy.im(c)**2)**0.5

工作正常,但

d = sympy.sqrt(sympy.re(c)**2 + sympy.im(c)**2)

给了我一个错误。该错误与我接下来描述的错误基本相同,但使用Sqrt代替Add。 我自己编写这些方法会很好,但由于该函数是在运行时动态构建的(它是一个电子工程工具箱),所以不可能简单地插入这些东西;我不得不依赖同情。

我还得到了一个类似于以下内容的错误:

Add doesn't contain Derivative Attribute.

这实际上意味着复数是Add类的症状的一个实例,并且没有区分方法,但我现在无法重现它。

打印e.subs(a,5).subs(b,1)也表明它不会取代a中的bDerivative()

抱歉,有些事情有点模糊,我昨天整个事情都麻烦了,忘了保存代码。如果整个事情不是Sympy的错误,而是我的错误,我真的道歉,并希望指出它是如何正确完成的方向。

整个过程在Anaconda 5.1.0下运行,并在Visual Studio中进行调试/管理。如果您对我的确切实施感兴趣,该项目将托管在https://github.com/SV-97/iphipy

有趣的文件是Systems.py和Main.py

1 个答案:

答案 0 :(得分:0)

这就是3-4行应该是

a, b = sympy.symbols("a, b", real=True) # a and b are REAL symbols a and b
c = a + I*b   

默认情况下,ab可以是复数,这会使Abs(a+I*b)的计算变得混乱,并且数学上与b的区别可疑。

此外,1j是一个Python浮点数,而I是一个SymPy对象;在符号表达中使用后者。

现在e将计算为b/sqrt(a**2 + b**2)。但mpmath.findroot没有任何内容可以对此表达式执行,因为它包含符号 a,而mpmath.findroot数字解算器。

sympy.solve(e, b)确实会回复[0]。当然,在更复杂的情况下你可能需要一个数值求解器;但是请确保除了要解决的变量之外的所有内容都有一个数值。