目录
1.Python解微分方程数值解
Python解微分方程要用到几个库:numpy, matplotlib.pyplot, scipy.integrate,没有的话就
pip install 相应的库就行,本次用的python为3.6.8
我们先来看一下简单的微分方程
对于Python求解微分方程只需要跳相应的库即可
from typing import List
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint
# 一阶微分方程的例子
def diff_equation(y_list: List[float], x: float):
y1, y2, y3 = y_list
return np.array([y2 * y3, -y1 * y3, -0.51 * y1 * y2]) # 微分方程格式,左边一定是dy/dx,返回右边
x = np.linspace(0, 12, 100) # 初始点是0,终点是12,其中有100个点
result = odeint(diff_equation, [0, 1, 1], x) # 中间那个是y初值
plt.plot(x, result[:, 0], label='y1') # result整个矩阵的第一列
plt.plot(x, result[:, 1], label='y2')
plt.plot(x, result[:, 2], label='y3')
plt.legend()
plt.grid() # 网格
plt.show() # 这是y=f(x)的图像
结果展示
2.验证火箭发射模型
掌握了解方程之后我们就可以来验证火箭发射模型了
高阶微分方程,我们可以化为微分方程组来解,在这里书上义给出微分方程组,但只给出了0~t1阶段即火箭燃料还有的阶段,t1~t2为燃料耗尽的时间阶段,其中r=18,t1~t2的微分方程组为 -g+(-k*x2*x2/m),这里的m是火箭净重量。
为了验证以下表格
代码如下
from typing import List
import matplotlib.pyplot as plt
import numpy as np
from scipy.integrate import odeint
def get_acceleration(x: np.ndarray, result: np.ndarray, time: float, f: float, m: float, g: float,
k: float) -> np.ndarray:
"""
获取火箭发射的加速度
:param x: 距离数组
:param result:
:param time: 时间
:param f: 外力
:param m: 质量
:param g :重力加速度
:param k : 阻力系数
:return: 加速度数组
"""
temp = []
# 重力加速度
result = result[:, 1]
for i in range(np.size(result)):
if x[i] < time:
temp.append(-g + (f - k * pow(result[i], 2)) / (m - x[i] * 18))
else:
temp.append(-g + (- k * pow(result[i], 2)) / 520)
return np.array(temp)
def diff_equation1(x_list: List[float], x: float):
x1, x2 = x_list
temp = ((27000 - 0.3 * x2 * x2) / (1600 - x * 18)) if x <= 60 else -0.3 * x2 * x2 / 520
return np.array([x2, -9.8 + temp]) # 微分方程格式,左边一定是dy/dx,返回右边
def diff_equation2(x_list: List[float], x: float):
x1, x2 = x_list
temp = ((27000 * 2 - 0.3 * x2 * x2) / (1600 - x * 18)) if x <= 60 else -0.3 * x2 * x2 / 520
return np.array([x2, -9.8 + temp]) # 微分方程格式,左边一定是dy/dx,返回右边
def diff_equation3(x_list: List[float], x: float):
x1, x2 = x_list
temp = ((27000 - 0.3 * x2 * x2) / (2680 - x * 18)) if x <= 120 else -0.3 * x2 * x2 / 520
return np.array([x2, -9.8 + temp]) # 微分方程格式,左边一定是dy/dx,返回右边
def diff_equation(x_list: List[float], x: float):
x1, x2 = x_list
temp = ((27000 * 2 - 0.3 * x2 * x2) / (2680 - x * 18)) if x <= 120 else -0.3 * x2 * x2 / 520
return np.array([x2, -9.8 + temp]) # 微分方程格式,左边一定是dy/dx,返回右边
x = np.linspace(0, 140, 10000) # 初始点是0
x1 = np.linspace(0, 80, 10000)
result = odeint(diff_equation, [0., 0.], x) # 中间那个是y0初值,即x=0时y=1
result1 = odeint(diff_equation1, [0., 0.], x1)
result2 = odeint(diff_equation2, [0., 0.], x1)
result3 = odeint(diff_equation3, [0., 0.], x)
# 加速度
plt.plot(x, get_acceleration(x, result, 120, 27000 * 2, 2680, 9.8, 0.3), label='a3(t)')
plt.plot(x1, get_acceleration(x1, result2, 60, 27000 * 2, 1600, 9.8, 0.3), label='a2(t)')
plt.plot(x, get_acceleration(x, result3, 120, 27000, 2680, 9.8, 0.3), label='a1(t)')
plt.plot(x1, get_acceleration(x1, result1, 60, 27000, 1600, 9.8, 0.3), label='a0(t)')
# 路程
# plt.plot(x, result[:, 0], label='x3(t)')
# plt.plot(x1, result1[:, 0], label='x2(t)')
# plt.plot(x, result2[:, 0], label='x1(t)')
# plt.plot(x1, result3[:, 0], label='x0(t)')
# 速度
# plt.plot(x, result[:, 1], label='v3(t)')
# plt.plot(x1, result1[:, 1], label='v2(t)')
# plt.plot(x, result2[:, 1], label='v1(t)')
# plt.plot(x1, result3[:, 1], label='v0(t)')
# plt.xlim(left=0)
# plt.ylim(bottom=0)
plt.legend()
plt.grid() # 网格
plt.show() # 这是微分方程的图像
结果展示
x的关系图
v的关系图
a的关系图
闲着没事干写的,写的不是很好,有疑问可以发我邮箱[email protected]
感谢ssw小伙伴的指正!
妈妈,他们抛弃了我 像歌唱一样抛弃了我
妈妈,我是多么爱你 当你沉默的时候我爱你
只是那些猛烈的情绪
在睡不着的时候折磨着我
我那早已死去的父亲
在没有星星的夜晚看着你
妈妈,我会在夏天开放吗
像你曾经的容颜那样
妈妈,这种失落会持久吗
这个世界会好吗
忘记一些隐秘的委屈
在回头观望的时候迷失了自己
我的正在老去的身体
从某一天开始就在渐渐死去
妈妈我爱你
妈妈,我居然爱上了她
像歌唱一样就爱上了她
妈妈,当你又回首一切
这个世界会好吗
妈妈,我是多么恨你
当我歌唱的时候我恨你