这里分别介绍怎么利用sympy.dsolve求解常微分方程和常微分方程组。

#首先利用sympy.dsolve求解单个的常微分方程:

#代码

from sympy import Function, dsolve, Derivative, symbols

from sympy.abc importt

#sympy.abc表示This module exports all latin and greek letters as Symbols。上行代码意思是导入字母t,因为t字母在dsolve函数中要被使用,而dsolve函数中的x这里不需要导入是因为在下一行会声明x变量

x = Function('x')

#上行代码等效于x = symbols('x', cls=Function),意思是声明x为因变量函数

result=dsolve(Derivative(x(t), t, 4) - 22*Derivative(x(t), t, 2) - 24*x(t))

#result=dsolve(Derivative(x, t, 4) - 22*Derivative(x, t, 2) - 24*x),这样写是不可以的

#Derivative(x(t), t, i)可以写成diff(x(t), t, i),或者写成Derivative(x(t), t, t, t, t)和diff(x(t), t, t, t, t)都表示函数x(t)对t的四阶导数,注意如果要使用diff函数,在第一行代码中要加入from sympy import diff。此外,diff()除了作为函数使用,还可以作为一个表达式的属性,如x(t)对t的四阶导数可以表示为x(t).diff(t).diff(t).diff(t).diff(t)

print (result)

#result=Eq(x(t), C1*exp(-t*sqrt(11 + sqrt(145))) + C2*exp(t*sqrt(11 + sqrt(145))) + C3*sin(t*sqrt(-11 + sqrt(145))) + C4*cos(t*sqrt(-11 + sqrt(145))))

#其次利用sympy.dsolve求解常微分方程组:

#代码

from sympy import Function, dsolve, Derivative, symbols, Eq

#from sympy.abc importt

t=symbols('t')

x, y=symbols('x, y', cls=Function)

#注意这里的x和y之间的逗号可以省略,即可以写成x, y=symbols('x y', cls=Function)。这行代码等效于x=Function('x')和y=Function('y')

eq=(Eq(Derivative(x(t),t, 2), 12*(x(t) + y(t))), Eq(Derivative(y(t),t, 2), 12*x(t) + 10*y(t)))

#注意这里使用了Eq()函数,所以在第一行导入了from sympy import Eq。Eq()函数内的逗号相当于是等于号,等号左边和右边分别为微分方程左边和右边的表达式,如对于本例的第一个微分方程,除了写成Eq(Derivative(x(t),t, 2),12*(x(t)+y(t)))外,还可以写成Eq(Derivative(x(t),t, 2)-12*(x(t)+y(t)), 0),注意这后面的0不能省略。

#同样地,对于第一个例子求解单个微分方程的情况,如果要使用Eq函数,则应该写成eq=Eq(Derivative(x(t), t, 4) - 22*Derivative(x(t), t, 2) - 24*x(t), 0)和result=dsolve(eq),并且要在第一行代码导入Eq函数。

#如果在该例中,我们不想使用Eq()函数,则上行代码应该写为eq=(Derivative(x(t), t, 2)-12*(x(t) + y(t)), Derivative(y(t), t, 2)- 12*x(t) - 10*y(t))

#简而言之就是,如果要使用Eq函数,则需要写成微分方程等号左右两边的表达式,当右边为0时,也需要写出来;如果不使用Eq函数,则只需要写出微分方程等号左边的表达式,此时等号右边应为0,且不需要写出来。

result=dsolve(eq)

print (result)

#result=[Eq(x(t), 12*C1*exp(t*CRootOf(l**4 - 22*l**2 - 24, 0)) + 12*C2*exp(t*CRootOf(l**4 - 22*l**2 - 24, 1)) + 12*C3*exp(t*CRootOf(l**4 - 22*l**2 - 24, 2)) + 12*C4*exp(t*CRootOf(l**4 - 22*l**2 - 24, 3))), Eq(y(t), C1*(-12 + CRootOf(l**4 - 22*l**2 - 24, 0)**2)*exp(t*CRootOf(l**4 - 22*l**2 - 24, 0)) + C2*(-12 + CRootOf(l**4 - 22*l**2 - 24, 1)**2)*exp(t*CRootOf(l**4 - 22*l**2 - 24, 1)) + C3*(-12 + CRootOf(l**4 - 22*l**2 - 24, 2)**2)*exp(t*CRootOf(l**4 - 22*l**2 - 24, 2)) + C4*(-12 + CRootOf(l**4 - 22*l**2 - 24, 3)**2)*exp(t*CRootOf(l**4 - 22*l**2 - 24, 3)))]

#CRootOf(表达式, i)应该就是“表达式=0”的第i+1个根(CRootOf(表达式, i)相当于会形成“表达式=0”的根的列表),这一点我还不确定,可以进一步讨论。至于为什么CRootOf中的表达式看着像数字,但却不直接计算出来而是写成式子的形式这一点,我的学Python比较好的同学说是为了语言的形式简便所以利用了表达式的形式,但是我觉得CRootOf中的表达式的I像是复数符号,这一点我还不确定,可以进一步讨论。

我们注意到其实第一个例子的单个微分方程就是第二个例子的微分方程组通过求导和互相代入得到的,因此第一个例子中求出来的x(t)应该和第二例子求出来的x(t)等价,有兴趣的可以验证这一点(应该会使用到欧拉方程exp(It)=cost+Isint,其中I为复数符号),这一点我还不确定,可以进一步讨论。

python解常微分方程_Python-sympy.dsolve求解常微分方程(组)相关推荐

  1. python解多项式方程_python – SymPy不能求解四阶多项式方程

    我有一个四阶多项式方程,我需要找到所有的根. 简单的例子: from sympy import (Symbol,solve,I) a=4+5*I; b=3+7*I; c=12-56*I; d=33+5 ...

  2. 利用sympy库求解常微分方程:dsolve()函数

    [小白从小学Python.C.Java] [计算机等级考试+500强双证书] [Python-数据分析] [sympy库的使用] 使用sympy库求解常微分方程 .dsolve()方法 选择题 下列说 ...

  3. python解常微分方程龙格库_求解常微分方程组初值问题的龙格库塔法分析及其C代码...

    求解常微分方程组初值问题的 龙格库塔法分析及其 C 代码 1 .概 述 由高等数学的知识可知,一些特殊类型的常微分方程(组)能够求出给定初 始值的解析解, 而在科学与工程问题中遇到的常微分方程 (组) ...

  4. 如何利用python解方程_Python 解方程的三种方法

    # 首发于我的博客 The North. 新年第一篇,搞起. 这回写一个好久之前想做,一直搁着没做的东西-- Python 解方程(其实是放假回家,趁着家里电脑重装 LOL 的时间过来写一篇). 咱这 ...

  5. python 解方程_python如何解方程的三种方法

    python求解方程组的三种方法: Numpy求解方程组x + 2y = 3 4x + 5y = 6 当然我们可以手动写出解析解,然后写一个函数来求解,这实际上只是用 Python 来单纯做" ...

  6. 求解显示常微分方程MATLAB,用matlab求解常微分方程

    实验六 用matlab 求解常微分方程 1.微分方程的概念 未知的函数以及它的某些阶的导数连同自变量都由一已知方程联系在一起的方程称为微分方程.如果未知函数是一元函数,称为常微分方程.常微分方程的一般 ...

  7. python计算矩阵方程_python/sympy求解矩阵方程的方法

    sympy版本:1.2 假设求解矩阵方程 AX=A+2X 其中 求解之前对矩阵方程化简为 (A−2E)X=A 令 B=(A−2E) 使用qtconsole输入下面程序进行求解 In [26]: fro ...

  8. python解不定积分_python快速求解不定积分和定积分

    欢迎点击「算法与编程之美」↑关注我们! 本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列博客. 基本概念 定积分的定义如下: 不定积分定义如下: 如果想了解更 ...

  9. python解非线性方程_python解非线性方程的问题

    废话不多说,上代码 方法1: from sympy import * t=symbols('t') eq=eq(10**20*exp(-12000/t)/(0.01+10**14*exp(-12000 ...

最新文章

  1. Hibernate 的 session.load()使用方法
  2. 英特尔反驳质疑:芯片供应充足、10nm量产没问题
  3. 【总结】SAP 供应商寄售/客户寄售
  4. Linux下统计局域网流量
  5. C++学习笔记之二:通过结构体来理解类
  6. 内构函数java_Android JNI参数传递
  7. css圆角box(宽度自适应)(百度知道挖出)
  8. 一些知名科技公司的开源机器学习框架/平台
  9. Mac OSX 下 mysql 影响关系的问题处理
  10. 上位机plc编程入门_图解PLC编程入门
  11. H.264码流分析器,雷霄骅版本人修改版
  12. 2021/7/27 Ubuntu18.04 安装 PCL记录
  13. 【音频】G711编码原理
  14. 弘辽科技:直通车总集篇(下篇)
  15. canvas_requestAnimationFrame帧率显示fps
  16. Vue脚手架安装流程详解
  17. 短信API整合在spring里面(3)
  18. matlab绘图 作业,实验作业2 - -MATLAB作图
  19. opencv安装过程出现opencv_world300d.dll加载失败
  20. 30位中外大师的摄影箴言

热门文章

  1. Elasticsearch Painless Script详解
  2. HUE 提交Schedule 时区问题
  3. 揭秘!业界创新的代码仓库加密技术
  4. 怕入错行?这群技术人写了本“择业指南”
  5. 微软KV Store Faster如何巧妙实现1.6亿ops
  6. 数据人看Feed流-架构实践
  7. UI2CODE再进化!结合Redux的框架升级!
  8. 基于Blink构建亲听项目以及全链路debug项目实时响应能力
  9. 如何提高阿里云上应用的可用性(二)
  10. 带您探究云存储的奥秘,三分钟帮您快速了解OSS