当前位置: 首页 > news >正文

如何用Python求解微分方程组

文章目录

    • odeint简介
    • 示例

odeint简介

scipy文档中将odeint函数和ode, comples_ode这两个类称为旧API,是scipy早期使用的微分方程求解器,但由于是Fortran实现的,尽管使用起来并不方便,但速度没得说,所以有的时候还挺推荐使用的。

其中,odeint的参数如下

scipy.integrate.odeint(func, y0, t, args=(), Dfun=None, col_deriv=0, full_output=0, ml=None, mu=None, rtol=None, atol=None, tcrit=None, h0=0.0, hmax=0.0, hmin=0.0, ixpr=0, mxstep=0, mxhnil=0, mxordn=12, mxords=5, printmessg=0, tfirst=False)

其中func为待求解函数;y0为初值;t为自变量列表,其他参数都有默认选项,可以不填,而且这些参数非常多,其中常用的有

  • args func中除了t之外的其他变量
  • Dfun func的梯度函数,当此参数不为None时,若将col_deriv设为True,则可提升效率。
  • full_output 如果为True,则额外返回一个参数字典
  • ml=None, mu=None, rtol=None, atol=None, tcrit=None, h0=0.0, hmax=0.0, hmin=0.0, ixpr=0, mxstep=0, mxhnil=0, mxordn=12, mxords=5,
  • printmessgTrue时打印信息。
  • tfirst 当为False时,func的格式为func(y,t...),否则格式为func(t, y...)

示例

对于常微分方程

θ ′ ′ ( t ) + b θ ′ ( t ) + c sin ⁡ θ ( t ) = 0 b = 0.25 ; c = 5 θ ( 0 ) = π − 0.1 ; θ ′ ( 0 ) = 0 \theta''(t)+b\theta'(t)+c\sin\theta(t)=0\\ b=0.25;\quad c=5\\ \theta(0)=\pi-0.1;\quad \theta'(0)=0 θ′′(t)+bθ(t)+csinθ(t)=0b=0.25;c=5θ(0)=π0.1;θ(0)=0

将其中的二阶导数项用一个新变量替代, ω ( t ) = θ ′ ( t ) \omega(t)=\theta'(t) ω(t)=θ(t),则常微分方程可拆分成微分方程组

θ ′ ( t ) = ω ( t ) ω ′ ( t ) = − b ω ( t ) − c sin ⁡ θ ( t ) \begin{aligned} \theta'(t)&=\omega(t)\\ \omega'(t)&=-b\omega(t)-c\sin\theta(t) \end{aligned} θ(t)ω(t)=ω(t)=(t)csinθ(t)

y = [ θ , ω ] y=[\theta, \omega] y=[θ,ω],则 y ′ = [ θ ′ , ω ′ ] y'=[\theta', \omega'] y=[θ,ω],据此可设计函数func

import numpy as np
def pend(y, t, b, c):
    th, om = y
    dydt = [om, -b*om - c*np.sin(th)]
    return dydt

然后调用并求解

from scipy.integrate import odeint
y0 = [np.pi-0.1, 0]
t = np.linspace(0, 10, 101)
sol = odeint(pend, y0, t, args=(0.25, 5))

然后绘制一下结果

import matplotlib.pyplot as plt
plt.plot(t, sol[:,0], label="theta")
plt.plot(t, sol[:,1], label="omega")
plt.legend()
plt.show()

在这里插入图片描述

这个形状还是比较离奇的。

相关文章:

  • 初识C++需要了解的一些东西(2)
  • 【面试题】面试官:如果后端给你 1w 条数据,你如何做展示?
  • 伯努利方程示例 Python 计算(汽水流体和喷泉工程)
  • 想要成为高级网络工程师,只需要具备这几点
  • 【Python练习】序列结构
  • 【微信小程序】-- 网络数据请求(十九)
  • 十大经典排序算法(上)
  • 【再谈动态规划】
  • 宇宙最强-GPT-4 横空出世:最先进、更安全、更有用
  • 刷题专练之链表(一)
  • Linux基础命令大全(上)
  • 总结:电容在电路35个基本常识
  • 2021电赛国一智能送药小车(F题)设计报告
  • 对于从事芯片行业的人来说,有哪些知识是需要储备的?
  • 【linux】Linux基本指令(上)
  • DataBase in Android
  • HTTP 简介
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • js中forEach回调同异步问题
  • js中的正则表达式入门
  • log4j2输出到kafka
  • node入门
  • oschina
  • PHP 的 SAPI 是个什么东西
  • python docx文档转html页面
  • Quartz初级教程
  • React 快速上手 - 07 前端路由 react-router
  • Redis的resp协议
  • scala基础语法(二)
  • 对象引论
  • 多线程 start 和 run 方法到底有什么区别?
  • 坑!为什么View.startAnimation不起作用?
  • 如何在 Tornado 中实现 Middleware
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 应用生命周期终极 DevOps 工具包
  • 鱼骨图 - 如何绘制?
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • #Ubuntu(修改root信息)
  • $jQuery 重写Alert样式方法
  • (12)Linux 常见的三种进程状态
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (二)linux使用docker容器运行mysql
  • (黑马C++)L06 重载与继承
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (算法)Travel Information Center
  • (五)MySQL的备份及恢复
  • (一)Kafka 安全之使用 SASL 进行身份验证 —— JAAS 配置、SASL 配置
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转)Windows2003安全设置/维护
  • .md即markdown文件的基本常用编写语法
  • .net 流——流的类型体系简单介绍
  • .NET设计模式(2):单件模式(Singleton Pattern)
  • .NET应用架构设计:原则、模式与实践 目录预览