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

关于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 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题