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₂
我有一个微分方程,我用 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₂