新手小张 2021-07-31 20:27 采纳率: 50%
浏览 118
已结题

关于Python库Sympy求解微分方程时返回值的类型及求解过程中的错误的问题

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的函数这种情况,所以导致最后传入具体数值时出错。
至于实际原因为何?

  • 写回答

2条回答 默认 最新

  • 新手小张 2021-07-31 20:46
    关注

    存在多组解所以返回值是列表

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 8月8日
  • 已采纳回答 7月31日
  • 创建了问题 7月31日

悬赏问题

  • ¥15 请问Ubuntu要怎么安装chrome呀?
  • ¥15 视频编码 十六进制问题
  • ¥15 Xsheii7我安装这个文件的时候跳出来另一个文件已锁定文件的无一部分进程无法访问。这个该怎么解决
  • ¥15 unity terrain打包后地形错位,跟建筑不在同一个位置,怎么办
  • ¥15 FileNotFoundError 解决方案
  • ¥15 uniapp实现如下图的图表功能
  • ¥15 u-subsection如何修改相邻两个节点样式
  • ¥30 vs2010开发 WFP(windows filtering platform)
  • ¥15 服务端控制goose报文控制块的发布问题
  • ¥15 学习指导与未来导向啊