微分方程
一、涉及的库&基本语法语句有:
1. import sympy as sp
用于求解微分方程(组)的通解或特解,只能求一个或一组两个方程的解
① x = sp.Symbol(‘x’) 定义自变量
② f = sp.Function(‘f’) 定义函数
③ equation = sp.Eq(方程左边, 方程右边)
④ ans = sp.dsolve(equation, f(x))
当要求特解时,则为:
ans = sp.dsolve(equation, f(x), ics={f(x0): 相应的y值})
当要求微分方程组(一组两式)解时,则为:
ans = sp.dsolve([equation1, equation2])
⑤ sp.pprint(ans) sympy自带的输出形式
⑥ sp可以用以引出数学特殊符号
sp.exp(指数) 或 sp.sin(x)
2. import numpy as np
① 在作图时生成数列的函数
x = np.linspace(start, stop, num of steps)
此函数用于生成数列,start与因变量初始值相对应
Eg:x = np.linspace(0,1,100)
x = np.arrange(start, stop, length of steps)
与上式效果相同
② np可以用以引出数学特殊符号,与sp的功能相同
np.exp(指数) 或 np.sin(x)
3. import matplotlib.pyplot as plt
绘图的包
① 生成图像:
plt.plot(自变量, 解决变量)
需要生成标签时:
plt.plot(自变量, 解决变量, label=’名称’)
Eg: solution = odient(f, y0, x)
plt.plot(x, solution, label=’x’)
② plt.xlim(a, b) 控制图中坐标轴范围
plt.ylim(a, b)
③ plt.legend() 在图中展示标签
④ plt.title(‘标题’) 在图中展示图名
⑤ plt.grid() 画格子
⑥ plt.show() 输出图像
4. from scipy.integrate import odient
在生成图像时解微分方程的包
① solution = odient(函数名, 因变量初始值, 自变量, tfirst=True/False, args=([常数1, 常数2]))
Eg:solution = odient(f, y0, x, tfirst=True)
args部分可以不加;tfirst部分也可以不加,True代表定义的函数中自变量
在前,False反之
5. from scipy.integrate import solve_ivp
知道语法但不知道怎么用……总之是用来画图的
ans = solve_ivp(函数名, 自变量范围, 因变量初始值, args=(常数1, 常数2))
args=()部分不可以省略!
二、一些全局的视角概念
1. 关于函数的定义
① 对于进行绘图的题目,定义函数的形式为:
def f(u, t):
x, y = u
dxdt = 3*x-x*y
dydt = 2*x-y+e**t
dudt = [dxdt, dydt]
return dudt
② 对于求通解/特解的题目,定义函数的形式为:
x = sp.Symbol(‘x’)
f = sp.Function(‘f’)
y = f(x)
equation = y.diff(x, 2) + sp.exp(2*y) # y.diff(x, 2)即y对x求两次导
2.关于最后求解的公式
① 对于进行绘图的题目,最后求解的公式为:
solution = odeint(f, u0, t)
② 对于求通解/特解的题目,最后求解的公式为:
ans = sp.dsolve(equation, y, ics={f(1): 2 * sp.exp(1)})
3. 中间的其他部分
① 对于求特解通解的题目,equation语句后面直接跟ans=sp.dsolve语句
② 对于进行绘图的题目,中间还有如下一段:
u0 = [0, 0]
t = np.linspace(0, 10, 100)
用来定义因变量的初始值和决定图中取点的情况
三、总结
求解:x′(t)=4∗x(t)−2∗y(t) 方程组,包括图像和通解
y′(t)=2∗x(t)−y(t)
# 求通解
import sympy as sp
# 定义自变量、因变量和函数
t = sp.symbols("t")
f1 = sp.Function("f1")
f2 = sp.Function("f2")
x = f1(t)
y = f2(t)
# 将两个等式带入
equation1 = x.diff(t, 1)- 4 * x + 2 * y
equation2 = y.diff(t, 1)- 2 * x + y
# 求解公式
ans = sp.dsolve([equation1, equation2], [x, y])
print(ans)
sp.pprint(ans)
# 作出图像
import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt
# 定义函数
def f(t, u):
x, y = u
dxdt = 4 * x - 2 * y
dydt = 2 * x - y
dudt = [dxdt, dydt]
return dudt
# 对自变量和因变量的处理
u0 = [1, 1]
t = np.linspace(0, 1, 100)
# 求解函数
solution = odeint(f, u0, t, tfirst=True)
# 作图
plt.plot(t, solution[:,0], label='x')
plt.plot(t, solution[:,1], label='y')
plt.legend()
plt.grid()
plt.xlim(0, 1)
plt.show()