Симпатическое Мнимое Число
Я путаюсь с написанием некоторого кода 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 ответа:
Поскольку 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))