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

关于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 关于腾讯云服务器中,PHP页面无法打开的问题
  • ¥60 如何把照片修复成原始拍摄图
  • ¥80 Exited too quickly (process log may have details)
  • ¥15 爬知乎登录之后内容加载不出来
  • ¥15 怎么用protues测量通频带
  • ¥15 zepelin使用sparkInterpreter 异常
  • ¥15 paho mqtt 接收不到消息
  • ¥15 函数r关于两个分量y,z方向上的图像,分开画r随y的图像,r随z的图像
  • ¥15 如何用Matlab求Pearcey函数的数值积分?