1、在使用sympy库进行求解微分方程时,出现sympy.desolve函数返回值有时是列表有时是方程的情况。
2、Python代码如下
import sympy as sy
def solveequ(x1,x2,T1,T2,m=2.4772,n=0.0071):
T_e = sy.symbols('T_e', cls=sy.Function)
x = sy.symbols("x")
X1,t1 =sy.symbols('X1 t1')
Q = ((T2-t1)/(x2-X1))*(m+n*(T2+t1)/2)
eq = sy.Eq((m+n*T_e(x))*T_e(x).diff(x),Q)
edge = {}
edge[T_e(X1)] = t1
getT = sy.dsolve(eq,T_e(x), ics=edge)
print(type(getT))
return getT[1].subs([(X1,x1),(t1,T1)])
x = sy.symbols('x')
print(solveequ(0,25,25,175).subs(x,25))
结果
<class 'list'>
Eq(T_e(25), -872.802816901408)
而当我取消X1,t1这两个参数做变量时,见下
def solveequ(x1,x2,T1,T2,m=2.4772,n=0.0071):
T_e = sy.symbols('T_e', cls=sy.Function)
x = sy.symbols("x")
#X1,t1 =sy.symbols('X1 t1')
Q = ((T2-T1)/(x2-x1))*(m+n*(T2+T1)/2)
eq = sy.Eq((m+n*T_e(x))*T_e(x).diff(x),Q)
edge = {}
edge[T_e(x1)] = T1
getT = sy.dsolve(eq,T_e(x), ics=edge)
print(type(getT))
return getT
x = sy.symbols('x')
print(solveequ(0,25,25,175).subs(x,25))
返回
<class 'sympy.core.relational.Equality'>
Eq(T_e(25), 175.0)
并且这时我们还会发现一个问题,所求的解也由-872变成了175。
3、问题出现于将多个参数作为变量,但微分方程只有一个参数的导数。对于返回值一个是列表一个是方程这种情况,猜测可能是因为传入的除包含其导数的变量以外其余变量是按照列表存储的,但是此时对返回值用1索引,结果直观上看就是方程左边的式子,所以说此时还是将整个方程作为了列表格式。
4、还有一个问题,对于两次最终结果不同,也实在搞不明白,关键就出在edge[T_e(x1)] = T1,如果其中的x1和T1当做变量,此时上式在求解微分方程作为边界条件时就会出现x1是T1的函数这种情况,所以导致最后传入具体数值时出错。
至于实际原因为何?