当试图使用SymPy求解这样的系统时(其中R2是实数,Z3是虚数,其他变量都是复杂的):
I1, I2, I3, Z3 = symbols("I1, I2, I3, Z3", real = False)
R2 = symbols("R2", real = True)
f1 = I2 * R2 - 220
f2 = I3 * Z3 - 220
f3 = Abs(I1) - 4
f4 = Abs(I2) - 2
f5 = Abs(I3) - 3
solve([f1, f2, f3, f4, f5], [I1, I2, I3, R2, Z3])我遇到了一个错误,比如:
NotImplementedError: solving Abs(I1) when the argument is not real or imaginary.我去看了SymPy的文档,并确保Abs()函数能够返回复数的模块,而且如果所有变量都是真实的,那么它就工作得很好。
那么,为什么会出现这个错误呢?我该怎么解我的方程?谢谢!
发布于 2020-05-16 11:54:42
在这种情况下,可以使用复数的Abs定义来获得解决方案:
_abs = Abs # save definition
Abs = lambda x: sqrt(re(x)**2 + im(x)**2)
I1, I2, I3, Z3 = symbols("I1, I2, I3, Z3", real=False)
R2 = symbols("R2", real = True)
f1 = I2 * R2 - 220
f2 = I3 * Z3 - 220
f3 = Abs(I1) - 4
f4 = Abs(I2) - 2
f5 = Abs(I3) - 3
eq=solve([f1, f2, f3, f4, f5], [I1, I2, I3, R2, Z3])
Abs = _abs # restore definition这给了我们
[{
re(I1): (I1**2 + 16)/(2*I1),
im(I1): I*(16 - I1**2)/(2*I1),
re(I2): (R2**2 + 12100)/(110*R2),
im(I2): I*(R2**2 - 12100)/(110*R2),
re(I3): (9*Z3**2 + 48400)/(440*Z3),
im(I3): I*(9*Z3**2 - 48400)/(440*Z3),
I2: 220/R2,
I3: 220/Z3}]但我认为你需要3个额外的条件来明确地解决真实的和想象的成分。
从f1你知道I2必须是真实的,所以im(I2) = 0所以R2 = sqrt(12100)。你还有其他两个条件吗?
也许solve拒绝处理Abs的复杂论点的原因就是这个原因:除非你知道它是真实的或想象的,否则你不会得到一个明确的解决方案。
https://stackoverflow.com/questions/61833932
复制相似问题