🍠Python重力弹弓流体晃动微分方程模型和交直流电阻电容电路

Python | 热层 | 大气层 | 运动轨迹 | 弹射角度 | 耦合微分方程 | 电磁 | 螺旋运动 | 重力弹弓 | 流体晃动 | 微分方程 | 模型 | 双摆运动 | 非线性 | 相空图 | 绝热 | 无粘流 | 流体力学 | 自由表面 | 简谐运动 | 化学 | 物理模型 | 交流 | 直流 | 电阻电容

🏈指点迷津 | Brief

🎯要点

🎯计算地球大气层中热层金属坠物运动轨迹 | 🎯计算炮弹最佳弹射角度耦合微分方程 | 🎯计算电磁拉莫尔半径螺旋运动 | 🎯计算航天器重力弹弓运动力学微分方程 | 🎯计算双摆的混沌运动非线性微分方程,绘制相空图 | 🎯计算绝热和无粘流流体力学微分方程 | 🎯计算容器流体晃动自由表面简谐运动数学模型 | 🎯计算化学物质的伦纳德-琼斯势物理模型 | 🎯分析直流交流电阻电容电路

📜欧拉法 | 本文 - 用例

📜MATLAB雨刮通风空调模糊器和发电厂电力聚变器卷积神经

📜Python物理量和化学量数值计算

📜Python流感常微分方程房室数学模型

📜C++计算资本市场收益及成本分配数学方程

📜Python计算物理粒子及拉格朗日和哈密顿动力学

📜C代码快速傅里叶变换-分类和推理-常微分和偏微分方程

📜Python物理学有限差分微分求解器和动画波形传播

📜Julia评估劳动力市场经济数学模型价值策略选择

📜Python嵌入式动态用户调制解调响应式射频信号

📜Python机器人动力学和细胞酶常微分方程

📜Python | C# | MATLAB 库卡机器人微分运动学 | 欧拉-拉格朗日动力学 | 混合动力控制

📜Python | C++ | MATLAB机器人正逆向运动学动力学求解器及算法

📜Python微磁学磁倾斜和西塔规则算法

📜Python烟雾液体弹性力微分模拟 | 出租车往返速度微分计算

🍇Python欧拉法

dS(t)dt=F(t,S(t))\frac{d S(t)}{d t}=F(t, S(t)) 为显式定义的一阶常微分方程。也就是说,FF 是一个函数,它返回给定时间和状态值的状态的导数或变化。另外,令 tt 为区间 [t0,tf]\left[t_0, t_f\right] 的数字网格,间距为h h。不失一般性,我们假设 t0=0t_0=0,并且对于某个正整数 Ntf=NhN,t_f=N h

S(t)S(t)tjt_j 附近的线性近似为

S(tj+1)=S(tj)+(tj+1tj)dS(tj)dtS\left(t_{j+1}\right)=S\left(t_j\right)+\left(t_{j+1}-t_j\right) \frac{d S\left(t_j\right)}{d t}

还可以写为:

S(tj+1)=S(tj)+hF(tj,S(tj))S\left(t_{j+1}\right)=S\left(t_j\right)+h F\left(t_j, S\left(t_j\right)\right)

这个公式称为显式欧拉公式,它允许我们在给定 S\left(t_j\right) 状态的情况下计算 S(tj+1)S\left(t_{j+1}\right) 状态的近似值。从给定的初始值S0=S(t0)S_0=S\left(t_0\right)开始,我们可以使用这个公式对状态进行积分直到S(tf)S\left(t_f\right);这些 S(t)S(t) 值是微分方程解的近似值。显式欧拉公式是解决初值问题最简单、最直观的方法。在任何状态(tj,S(tj))\left(t_j, S\left(t_j\right)\right),它在该状态下使用F“指向”下一个状态,然后朝该方向移动hh的距离。尽管有更复杂和更准确的方法来解决这些问题,但它们都具有相同的基本结构。因此,我们明确列举了使用显式欧拉公式解决初始值问题的步骤。

假设我们有一个函数 F(t,S(t))F(t, S(t)) 计算 dS(t)dt\frac{d S(t)}{d t},一个数值网格 tt,区间 [t0,tf]\left[ t_0, t_f\right],初始状态值S0=S(t0)S_0=S\left(t_0\right)。我们可以使用以下步骤计算 tt 中每个 tjt_jS(tj)S\left(t_j\right)

  • S0=S(t0)S_0=S\left(t_0\right) 存储在数组 SS中。

  • 计算S(t1)=S0+hF(t0,S0)S\left(t_1\right)=S_0+h F\left(t_0, S_0\right)

  • S1=S(t1)S_1=S\left(t_1\right) 存储在S S

  • 计算S(t2)=S1+hF(t1,S1)S\left(t_2\right)=S_1+h F\left(t_1, S_1\right)

  • S2=S(t1) S_2=S\left(t_1\right)存储在 SS​ 中。

  • ...

  • 计算S(tf)=Sf1+hF(tf1,Sf1)S\left(t_f\right)=S_{f-1}+h F\left(t_{f-1}, S_{f-1}\right)

  • Sf=S(tf)S_f=S\left(t_f\right) 存储在S S

  • SS 是初始值问题的近似解

当使用具有这种结构的方法时,我们称该方法集成了常微分方程的解。

初始条件为f0=1f_0=-1的微分方程df(t)dt=et\frac{d f(t)}{d t}=e^{-t}有精确解f(t)=etf(t)=-e^{-t} 。使用显式欧拉公式,以 0.1 为增量,在 0 和 1 之间近似求解此初始值问题。绘制近似解和精确解之间的差异。

代码处理:

 import numpy as np
 import matplotlib.pyplot as plt
 ​
 plt.style.use('seaborn-poster')
 %matplotlib inline
 ​
 ​
 f = lambda t, s: np.exp(-t) 
 h = 0.1 
 t = np.arange(0, 1 + h, h) 
 s0 = -1 
 ​
 s = np.zeros(len(t))
 s[0] = s0
 ​
 for i in range(0, len(t) - 1):
     s[i + 1] = s[i] + h*f(t[i], s[i])
 ​
 plt.figure(figsize = (12, 8))
 plt.plot(t, s, 'bo--', label='Approximate')
 plt.plot(t, -np.exp(-t), 'g', label='Exact')
 plt.title('Approximate and Exact Solution \
 for Simple ODE')
 plt.xlabel('t')
 plt.ylabel('f(t)')
 plt.grid()
 plt.legend(loc='lower right')
 plt.show()

在上图中,我们可以看到每个点都是基于前一个点以线性方式进行的近似。从初始值,我们最终可以得到数值网格上解的近似值。如果我们对 h=0.01 重复该过程,我们会得到更好的近似解:

 h = 0.01 
 t = np.arange(0, 1 + h, h) 
 s0 = -1 
 ​
 s = np.zeros(len(t))
 s[0] = s0
 ​
 for i in range(0, len(t) - 1):
     s[i + 1] = s[i] + h*f(t[i], s[i])
 ​
 plt.figure(figsize = (12, 8))
 plt.plot(t, s, 'b--', label='Approximate')
 plt.plot(t, -np.exp(-t), 'g', label='Exact')
 plt.title('Approximate and Exact Solution \
 for Simple ODE')
 plt.xlabel('t')
 plt.ylabel('f(t)')
 plt.grid()
 plt.legend(loc='lower right')
 plt.show()

显式欧拉公式之所以被称为“显式”,是因为它只需要tj t_j 处的信息来计算tj+1 t_{j+1} 处的状态。也就是说, S(tj+1)S\left(t_{j+1}\right) 可以根据我们拥有的值(即tj t_jS(tj) S\left(t_j\right) )显式地编写。隐式欧拉公式可以通过在tj+1 t_{j+1} 周围取 S(t)S(t) 的线性近似并在tj t_j 处计算来导出:

S(tj+1)=S(tj)+hF(tj+1,S(tj+1))S\left(t_{j+1}\right)=S\left(t_j\right)+h F\left(t_{j+1}, S\left(t_{j+1}\right)\right)

这个公式很奇特,因为它要求我们知道 S(tj+1)S\left(t_{j+1}\right) 才能计算 S(tj+1)S\left(t_{j+1}\right)!不过,有时候我们可以用这个公式来近似求解初值问题。在详细介绍如何使用隐式欧拉公式解决这些问题之前,我们先给出另一个隐式公式,称为梯形公式,它是显式和隐式欧拉公式的平均值:

S(tj+1)=S(tj)+h2(F(tj,S(tj))+F(tj+1,S(tj+1)))S\left(t_{j+1}\right)=S\left(t_j\right)+\frac{h}{2}\left(F\left(t_j, S\left(t_j\right)\right)+F\left(t_{j+1}, S\left(t_{j+1}\right)\right)\right)

为了说明如何求解这些隐式解,请再次考虑已简化为一阶的摆方程。

Last updated