新手小张 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 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法