SymPy `subs` 什么都不做

SymPy `subs` Not Doing Anything

我有一个微分方程,我用 sympy.solvers.ode.dsolve 求解,我出来了

                ___________           ___________
           -x⋅╲╱ E - V_max        x⋅╲╱ E - V_max 
ψ(x) = C₁⋅ℯ                 + C₂⋅ℯ               

来自(我在最后放了一些我用来生成这个等式的代码):

                         2          
                        d           
-ψ(x)⋅E + ψ(x)⋅V_max + ───(ψ(x)) = 0
                         2          
                       dx           

一切都很好,当我知道 C₁C₂ 恰好相等并想用一个代替另一个时,问题就来了。所以我尝试像

psi_high.subs( sp.Symbol( "C_2" ), sp.Symbol( "C_1" ) )

不过结果和以前一样

                ___________           ___________
           -x⋅╲╱ E - V_max        x⋅╲╱ E - V_max 
ψ(x) = C₁⋅ℯ                 + C₂⋅ℯ               

我认为这可能是内存问题,对 sympy.Symbol 对象的引用不仅必须引用具有相同 value/symbol 的 sympy.Symbol 对象,而且还必须引用是相同的底层对象。

这只是猜测(但我可以说,执行 psi_high.subs( x, 0 ) 并且有效),但我的问题是如何解决它?

奇怪的是,它似乎有效 (我确实尝试过使用 sympy.symbols 函数并将符号引用包含在元组和列表中,如问题中所示)

谢谢!

well_length = sq.Quantity( 'L' )
highest_potential = sq.Quantity( "V_max" )
x = sp.Symbol( 'x' )
m = sq.Quantity( 'm' )
hbar = sq.Quantity( "hbar" )
total_energy = sq.Quantity( 'E' )
inverse_total_energy = 1.0 / total_energy
psi_symbol = ud.lookup( "GREEK SMALL LETTER PSI" )
psi = sp.Function( "psi" )
second_derivative = sp.Derivative( psi( x ), x, 2 )
make_shrodinger_left = lambda potential, psi_parameter : ( second_derivative + ( psi( psi_parameter ) * potential ) )
make_shrodinger_right = lambda psi_parameter : total_energy * psi( psi_parameter )
make_psi_equal = lambda input_value, value : sp.Eq( psi( sp.Eq( x, input_value ) ), value )
set_equal = lambda to_set, value : sp.Eq( to_set, value )
shrodinger_left_high = sp.simplify( make_shrodinger_left( highest_potential, x ) )
shrodinger_right = make_shrodinger_right( x )
high_diff = sp.simplify( set_equal( shrodinger_left_high - shrodinger_right, 0 ) )

这是一个更简单的例子:

In [3]: eq = Eq(f(x).diff(x, 2), 0)

In [4]: eq
Out[4]: 
  2          
 d           
───(f(x)) = 0
  2          
dx           

In [5]: sol = dsolve(eq)

In [7]: sol
Out[7]: f(x) = C₁ + C₂⋅x

我们可以检查这些符号:

In [8]: sol.free_symbols
Out[8]: {C₁, C₂, x}

In [9]: [s.name for s in sol.free_symbols]
Out[9]: ['C2', 'C1', 'x']

请注意,符号名称中没有下划线。那么我们要做的是:

In [10]: sol.subs(Symbol("C1"), Symbol("C2"))
Out[10]: f(x) = C₂⋅x + C₂