Python | 热层 | 大气层 | 运动轨迹 | 弹射角度 | 耦合微分方程 | 电磁 | 螺旋运动 | 重力弹弓 | 流体晃动 | 微分方程 | 模型 | 双摆运动 | 非线性 | 相空图 | 绝热 | 无粘流 | 流体力学 | 自由表面 | 简谐运动 | 化学 | 物理模型 | 交流 | 直流 | 电阻电容
🏈指点迷津 | Brief🎯要点
🎯计算地球大气层中热层金属坠物运动轨迹 | 🎯计算炮弹最佳弹射角度耦合微分方程 | 🎯计算电磁拉莫尔半径螺旋运动 | 🎯计算航天器重力弹弓运动力学微分方程 | 🎯计算双摆的混沌运动非线性微分方程,绘制相空图 | 🎯计算绝热和无粘流流体力学微分方程 | 🎯计算容器流体晃动自由表面简谐运动数学模型 | 🎯计算化学物质的伦纳德-琼斯势物理模型 | 🎯分析直流交流电阻电容电路
📜欧拉法 | 本文 - 用例
📜MATLAB雨刮通风空调模糊器和发电厂电力聚变器卷积神经
📜Python物理量和化学量数值计算
📜Python流感常微分方程房室数学模型
📜C++计算资本市场收益及成本分配数学方程
📜Python计算物理粒子及拉格朗日和哈密顿动力学
📜C代码快速傅里叶变换-分类和推理-常微分和偏微分方程
📜Python物理学有限差分微分求解器和动画波形传播
📜Julia评估劳动力市场经济数学模型价值策略选择
📜Python嵌入式动态用户调制解调响应式射频信号
📜Python机器人动力学和细胞酶常微分方程
📜Python | C# | MATLAB 库卡机器人微分运动学 | 欧拉-拉格朗日动力学 | 混合动力控制
📜Python | C++ | MATLAB机器人正逆向运动学动力学求解器及算法
📜Python微磁学磁倾斜和西塔规则算法
📜Python烟雾液体弹性力微分模拟 | 出租车往返速度微分计算
🍇Python欧拉法
令 dtdS(t)=F(t,S(t)) 为显式定义的一阶常微分方程。也就是说,F 是一个函数,它返回给定时间和状态值的状态的导数或变化。另外,令 t 为区间 [t0,tf]的数字网格,间距为h。不失一般性,我们假设 t0=0,并且对于某个正整数 N,tf=Nh。
S(t) 在 tj附近的线性近似为
S(tj+1)=S(tj)+(tj+1−tj)dtdS(tj) 还可以写为:
S(tj+1)=S(tj)+hF(tj,S(tj)) 这个公式称为显式欧拉公式,它允许我们在给定 S\left(t_j\right) 状态的情况下计算 S(tj+1)状态的近似值。从给定的初始值S0=S(t0)开始,我们可以使用这个公式对状态进行积分直到S(tf);这些 S(t) 值是微分方程解的近似值。显式欧拉公式是解决初值问题最简单、最直观的方法。在任何状态(tj,S(tj)),它在该状态下使用F“指向”下一个状态,然后朝该方向移动h的距离。尽管有更复杂和更准确的方法来解决这些问题,但它们都具有相同的基本结构。因此,我们明确列举了使用显式欧拉公式解决初始值问题的步骤。
假设我们有一个函数 F(t,S(t)) 计算 dtdS(t),一个数值网格 t,区间 [t0,tf],初始状态值S0=S(t0)。我们可以使用以下步骤计算 t 中每个 tj 的 S(tj)。
将 S0=S(t0)存储在数组 S中。
计算S(t1)=S0+hF(t0,S0)
将 S1=S(t1) 存储在S中
计算S(t2)=S1+hF(t1,S1)
将S2=S(t1)存储在 S中。
计算S(tf)=Sf−1+hF(tf−1,Sf−1)
将 Sf=S(tf)存储在S中
当使用具有这种结构的方法时,我们称该方法集成了常微分方程的解。
初始条件为f0=−1的微分方程dtdf(t)=e−t有精确解f(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处的信息来计算tj+1处的状态。也就是说, S(tj+1) 可以根据我们拥有的值(即tj 和S(tj))显式地编写。隐式欧拉公式可以通过在tj+1周围取 S(t) 的线性近似并在tj处计算来导出:
S(tj+1)=S(tj)+hF(tj+1,S(tj+1)) 这个公式很奇特,因为它要求我们知道 S(tj+1) 才能计算 S(tj+1)!不过,有时候我们可以用这个公式来近似求解初值问题。在详细介绍如何使用隐式欧拉公式解决这些问题之前,我们先给出另一个隐式公式,称为梯形公式,它是显式和隐式欧拉公式的平均值:
S(tj+1)=S(tj)+2h(F(tj,S(tj))+F(tj+1,S(tj+1))) 为了说明如何求解这些隐式解,请再次考虑已简化为一阶的摆方程。
Last updated