Python—微分方程

结合Python中Scipy,专注创建可以解决问题的方程

目录

  1. 一阶常微分方程

  2. 二阶常微分方程

  3. 三阶常系数微分方程组

  4. 修正贝塞尔微分方程

  5. 伯努利方程

一阶常微分方程

加速度、速度、时间

计算物体速度的时候,若加速度不断变化,如何确定速度和时间的关系?假设加速度随速度和时间变化的关系是:

即:

我们利用Scipy求解该方程:

import numpy as np   import matplotlib.pyplot as plt      from scipy.integrate import odeint      # v是速度,t是时间   def dvdt(v, t):       return v + 6*t      v0 = 0   t = np.linspace(0, 2, 100)      # 结果res是 N行1列的二维数组(因为是一元方程)   res = odeint(dvdt, v0, t)      # 转置之后第一行就是各个时间点的速度   res_v = res.T[0]      # 绘制速度和时间的关系   plt.plot(t, res_v)   plt.show()   

由下图结果易得加速度随时间逐渐增大。

图1

二阶常微分方程

,,

# 二阶ODE的求解   import matplotlib.pyplot as plt   import numpy as np   from scipy.integrate import odeint         def dSdx(x, S):       x, v = S       return [v, -v ** 2 + np.sin(x)]         x_0 = 0   v_0 = 3   S_0 = (x_0, v_0)   t = np.linspace(0, 1, 100)   sol = odeint(dSdx, y0=S_0, t=t, tfirst=True)   x_sol = sol.T[0]   v_sol = sol.T[1]   l1, = plt.plot(t, x_sol)   l2, = plt.plot(t, v_sol)   plt.legend((l1, l2), ['x', 'v'])   plt.show()   

图2

这个二阶ODE描述了速度v相对于位置x的变化率。变量S是一个元组(x, v),它表示系统在给定点(x, v)的状态。通过使用龙格-库塔法或欧拉法等适当的方法对该系统进行数值求解,我们可以确定函数v(x),它表示速度作为位置的函数。

三阶常系数微分方程组

对于该方程组:

利用Scipy求解编程如下:

# 将三阶常系数微分方程组x‘’‘=-x1’‘^3+x2'+x1+sin(t)和x1'''=-2x2'^2+x2   # 对于上式,这里定义新变量v1、v2和a1、a2,并将方程组向量化可以得到      import matplotlib.pyplot as plt   import numpy as np   from scipy.integrate import odeint         def dSdt(t, S):       x1, v1, a1, x2, v2, a2 = S       return [v1,               a1,               -2 * v2 ** 2 + x2,               v2,               a2,               -a1 ** 3 + v2 + v1 + np.sin(t)]         x1_0 = 0   v1_0 = 0   a1_0 = 0   x2_0 = 0   v2_0 = 0   a2_0 = 0   v_0 = 0   S_0 = (x1_0, v1_0, a1_0, x1_0, v1_0, a1_0)   t = np.linspace(0, 1, 100)   sol = odeint(dSdt, y0=S_0, t=t, tfirst=True)   plt.subplot(1, 2, 1)   l1, = plt.plot(t, sol.T[0], 'r')   plt.title('x1')   plt.subplot(1, 2, 2)   l2, = plt.plot(t, sol.T[3], 'b')   plt.title('x2')   plt.show()   

图3

修正贝塞尔微分方程

贝塞尔方程是齐次线性二阶变系数方程:

其解称为贝塞尔函数,该函数数学物理中具有重要作用。由表示其中的一个解并称之为阶贝塞尔函数。幂级数展开后如下,当和时:

import numpy as np   import matplotlib.pyplot as plt   from scipy.special import jv   from scipy.integrate import odeint         def bessel_equation(y, x):       return [y[1], -y[1] / x - ((x ** 2 - n ** 2) * y[0]) / x ** 2]         x = np.linspace(0.1, 10, 100)  # Define the range of the independent variable x   n = 2  # Bessel equation parameter n   y0 = [jv(n, x[0]), jv(n, x[0]) / x[0]]  # Define the initial conditions using Bessel functions      # Use odeint function for numerical solution   sol = odeint(bessel_equation, y0, x)      # Extract the first component of the solution, i.e., y(x)   y = sol[:, 0]      # Plot the solution curve   plt.plot(x, y)   plt.xlabel('x')   plt.ylabel('y(x)')   plt.title('Solution of the Modified Bessel Equation')   plt.grid(True)   plt.show()   

选择n=2作为贝塞尔方程的参数,绘制该参数下的解曲线:

图4

伯努利方程

其中(和) 被称作伯努利方程,它是一个非线性微分方程,可以通过降阶为一个线性微分方程并可以通过求积分得其解。例如该方程:

import numpy as np   import matplotlib.pyplot as plt   from scipy.integrate import odeint         def bernoulli_equation(y, x):       return y[1], x * y[1] - y[0] + x ** 2         x = np.linspace(0, 5, 100)  # 定义自变量 x 的范围   y0 = [1, 0]  # 定义初始条件,这里假设 y(0) = 1,y'(0) = 0      # 使用 odeint 函数进行数值求解   sol = odeint(bernoulli_equation, y0, x)      # 提取解的第一个分量,即 y(x)   y = sol[:, 0]      # 绘制解的曲线   plt.plot(x, y)   plt.xlabel('x')   plt.ylabel('y(x)')   plt.title('Solution of the Bernoulli Equation')   plt.grid(True)   plt.show()   

图5

当然可以根据不同需求调整自变量的范围和初始条件:

import numpy as np   import matplotlib.pyplot as plt   from scipy.integrate import odeint         def bernoulli_equation(y, x):       return y[1], x * y[1] - y[0] + x ** 2         x = np.linspace(0, 1, 1000)  # 定义自变量 x 的范围   y0 = [1, 0]  # 定义初始条件,这里假设 y(0) = 1,y'(0) = 0      # 使用 odeint 函数进行数值求解   sol = odeint(bernoulli_equation, y0, x)      # 提取解的第一个分量,即 y(x)   y = sol[:, 0]      # 绘制解的曲线   plt.plot(x, y)   plt.xlabel('x')   plt.ylabel('y(x)')   plt.title('Solution of the Bernoulli Equation')   plt.grid(True)   plt.show()   

图6

---------------------------END---------------------------

题外话

“不是只有程序员才要学编程?!”

认真查了一下招聘网站,发现它其实早已变成一项全民的基本技能了。

连国企都纷纷要求大家学Python!
在这里插入图片描述

世界飞速发展,互联网、大数据冲击着一切,各行各业对数据分析能力的要求越来越高,这便是工资差距的原因,学习编程顺应了时代的潮流。

在这个大数据时代,从来没有哪一种语言可以像Python一样,在自动化办公、爬虫、数据分析等领域都有众多应用。

更没有哪一种语言,语法如此简洁易读,消除了普通人对于“编程”这一行为的恐惧,从小学生到老奶奶都可以学会。

《2020年职场学习趋势报告》显示,在2020年最受欢迎的技能排行榜,Python排在第一。
在这里插入图片描述

它的角色类似于现在Office,成了进入职场的第一项必备技能。

如果你也想增强自己的竞争力,分一笔时代的红利,我的建议是,少加点班,把时间腾出来,去学一学Python。

因为,被誉为“未来十年的职场红利”的Python,赚钱、省钱、找工作、升职加薪简直无所不能!

目前,Python人才需求增速高达**174%,人才缺口高达50万,**部分领域如人工智能、大数据开发, 年薪30万都招不到人!在这里插入图片描述

感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。

👉CSDN大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

img
img

二、Python必备开发工具

工具都帮大家整理好了,安装就可直接上手!img

三、最新Python学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

img

四、Python视频合集

观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

五、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。img

六、面试宝典

在这里插入图片描述

在这里插入图片描述

简历模板在这里插入图片描述
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值