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

Find root of derivative of absolute value of complex number in sympy

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

我在使用 sympy 时遇到了一个问题,但不太清楚如何解决 it/if 这最终还是一个问题。在我将其报告为错误之前,我想在这里问一下。 好的,这基本上就是我想做的(实现有点复杂,但错误是一样的)

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(1) 调用 f 会产生相同的错误。错误是:

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。 我自己编写这些方法会很好,但是由于函数是在 运行 时间动态构建的(这是一个电气工程工具箱),所以不可能简单地插入这些东西;只能靠sympy了

我还遇到了一个错误,大致如下:

Add doesn't contain Derivative Attribute.

这基本上意味着复数是 sympy 的 Add class 的一个实例并且没有微分方法,但我无法重现它现在。

打印 e.subs(a,5).subs(b,1) 也表明它不会在 Derivative().

中替换 ab

抱歉,有些地方有点模糊,我昨天本来就排查了整个事情,忘记保存代码了。如果整个事情不是 Sympy 的错误,而是我的错误,我真诚地道歉,并很乐意指出如何正确完成它的方向。

整个过程在 Anaconda 5.1.0 下是 运行,在 Visual Studio 下是 debugged/managed。如果您对我的具体实施感兴趣,该项目托管在 https://github.com/SV-97/iphipy

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

第 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 是一个 numeric 求解器。

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