Sympy: с помощью метода execute (), чтобы найти равенство - PullRequest
0 голосов
/ 28 января 2020

В настоящее время я начинаю учиться python заменить некоторые коммерческие программы, которые я использую для университетской работы, потому что я пытаюсь использовать больше программ с открытым исходным кодом. В основном я пытаюсь сделать в python то, что уже делал в Wolfram-Mathematica, код которого вы можете увидеть здесь: Mathematica Code . Область, к которой я применяю это волноводная оптика.

Проблема, с которой я столкнулся, заключается в том, что, когда я пытаюсь воспроизвести 10-ю строку в Mathematica в Python. По сути, вы должны решить уравнение «b» для эффективного показателя преломления (Neff), считав значение b с графика. В этом случае значение равно 0,18, но использование его в качестве равенства в последней строке в Python дает мне пустой список, поэтому элемент с индексом 1. не существует.

import sympy as sp
sp.init_printing()

nAir=1;nInP = 3.17; nInGaAsP = 3.37;wl=1.55e-6;
n,theta,n0,n1,n2,Neff,d,Lambda = sp.symbols('n theta n0 n1 n2 Neff d lambda')

k0=2*sp.pi/Lambda
k=k0*n
beta=sp.cos(theta)*k
V=k0*d*sp.sqrt(n1**2-n0**2)
a=((n0**2-n2**2)/(n1**2-n0**2))
b=(Neff**2-n0**2)/(n1**2-n0**2)

aysmm1 = a.subs({n0:nInP,n1:nInGaAsP,n2:nAir})
aysmm1

d1=400e-9
Vparam1=V.subs({Lambda:wl,d:d1,n1:nInP,n0:nInGaAsP})

sp.solve(b.subs({n0:nInP,n1:nInGaAsP})==0.18,Neff)[1]

Единственный Обходной путь, который я нашел, состоит в том, чтобы заменить последнюю строку на

sp.solve(b.subs({n0:nInP,n1:nInGaAsP})-0.18,Neff)[1]

, поскольку она автоматически предполагает, что данное выражение равно 0. Но мне было интересно, есть ли способ использовать sp. решить функцию с равенством, как показано в первом фрагменте кода. И, может быть, есть способ автоматически предположить, что Neff больше 0? Так что мне не нужно указывать индекс списка?

Заранее спасибо.

PS: Кто-нибудь знает, можно ли использовать греческие буквы в качестве символов в Python, как я? в Mathematica для лямбда?

...