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