查找符号中复数绝对值的导数根



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

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

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.

这基本上意味着复数是 SympyAdd类的一个实例,并且没有微分方法,但到目前为止我无法重现它。

打印e.subs(a,5).subs(b,1)还表明它不能替代abDerivative()内。

抱歉,有些事情有点模糊,我昨天最初对整个事情进行了故障排除,忘记保存代码。如果整件事不是 Sympy 中的错误,而是我的错误,我真诚地道歉,并希望指出如何正确完成它的方向。

整个事情在Anaconda 5.1.0下运行,并在Visual Studio中进行调试/管理。如果您对我的确切实现感兴趣,该项目托管在 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是一个数值求解器。

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

最新更新