本质上,我想做的是取一个复数的绝对值,该复数在实部和虚部都有一个参数,并得出该参数。然后我想知道导数对于该参数的哪个值为零。所以本质上我想知道带有参数的复数绝对值的最小值/最大值。
我在使用 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)
还表明它不能替代a
和b
在Derivative()
内。
抱歉,有些事情有点模糊,我昨天最初对整个事情进行了故障排除,忘记保存代码。如果整件事不是 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
默认情况下,a
和b
允许是复数,这使得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]
.当然,在更复杂的情况下,您可能需要数值求解器;但是,请确保除要求解的变量之外的所有内容都具有数值。