Симпатическое Мнимое Число


Я путаюсь с написанием некоторого кода SymPy для обработки символьных выражений с мнимыми числами.

Для начала я хочу заставить его принять x и y как действительные числа и найти решение, где x=iy. Поэтому я могу сделать это следующим образом.
x, y = sympy.symbols("x y", real=True)  
print(sympy.solve([x-sympy.I*y]))

(SymPy solve принимает список значений, все из которых должны быть равны 0. Итак, x-iy=0 => x=iy). SymPy правильно скажет мне

[{x: 0, y: 0}]

Однако, если я сделаю это (теоретически идентичным) способом:

x, y = sympy.symbols("x y")
print(sympy.solve([x-sympy.I*y, sympy.im(y), sympy.im(x)]))

Тогда теперь сочувствие говорит мне

[{re(y): y, re(x): I*y, im(x): 0, x: I*y, im(y): 0}]
И это технически правильно, но не все для меня сделано. Является ли это просто ограничением в симпатии, или я могу заставить его дать мне x=y=0, ограничивая комплекс x и y таким образом?
2 3

2 ответа:

Поскольку SymPy лучше справляется с упрощением пар вещественных чисел, чем комплексных, помогает следующая стратегия: установить вещественные переменные для вещественных / мнимых частей, а затем сформировать из них комплексные переменные.

from sympy import *
x1, x2, y1, y2 = symbols("x1 x2 y1 y2", real=True)  
x = x1 + I*x2
y = y1 + I*y2

Теперь x и y можно использовать в качестве комплексных переменных в уравнении, таком как ваше

sol = solve([x-I*y, im(y), im(x)])
print(x.subs(sol[0]), y.subs(sol[0])) 

Вывод: 0 0.

Вот пример того, как вы можете решить эту проблему более обобщенно. Я использовал намек на то, что использование реального воображаемого символа будет проблематичным, и использовал функцию collect_const() для выполнения сокращения.

'''
Converts T to Pi Circuit Topology Symbolically
'''

from sympy import simplify, Symbol, pprint, collect_const

 # Use this for your imaginary symbol
j = Symbol('j')

# Circuit symbols
R = Symbol('R')
w = Symbol('w')
L = Symbol('L')
C = Symbol('C')

# Arbitrary Circuit Element Equations
R1 = 1 / (j*w*C)
R2 = R + j*w*L
R3 = R + j*w*L

# Circuit conversion equations
RN = R1 * R2 + R2 * R3 + R1 * R3 
RA = RN / R1
RB = RN / R2
RC = RN / R3

#Print the original circuit element equations
pprint(R1)
print("\n")
pprint(R2)
print("\n")
pprint(R3)

#Print the original solved equation, followed by the appropriately reduced equation
print("\nOriginal\t")
pprint(RA)
print("\nReduced\t")
pprint(collect_const(simplify(RA),j))

print("\nOriginal\t")
pprint(RB)
print("\nReduced\t")
pprint(collect_const(simplify(RB),j))

print("\nOriginal\t")
pprint(RC)
print("\nReduced\t")
pprint(collect_const(simplify(RC),j))