微分方程
原创大约 2 分钟
微分方程求得的解并不是某个具体的数值,而是函数
。
利用Python求微分方程的通解。
from sympy import *
x = symbols('x')
f = symbols('f', cls=Function)
# 求微分方程通解
diffeq = Eq(f(x).diff(x), 2 * x)
print(dsolve(diffeq, f(x)))
# 实现:y' = -2 * x * y, x0 = 1, y0 = 1/e, y = exp(-x * x)
import numpy as np
import matplotlib.pyplot as plt
import math
# 定义区间
a = 1
b = 5
# 定义初值
x0 = 1
y0 = 1 / math.e
# 迭代步长
n = 50
h = (b - a) / n
# 保存迭代过程产生的数值
y = []
y.append(y0)
# 将自变量离散化
x = np.arange(a, b, h)
# 迭代过程
for i in x:
tmpy = y0 - 2 * i * y0 * h
y.append(tmpy)
y0 = tmpy
# 求解精确解
x1 = np.arange(a, b + h, h)
y1 = math.e ** (-x1 * x1)
plt.plot(x1, y, lw=3, label="欧拉值")
plt.plot(x1, y1, lw=3, label="精确值")
plt.legend()
plt.show()
# 实现:y' = -2 * x * y, x0 = 1, y0 = 1/e, y = exp(-x*x)
import numpy as np
import matplotlib.pyplot as plt
import math
from scipy.integrate import odeint
# 定义区间
a = 1
b = 5
# 定义初值
x0 = 1
y0 = 1 / math.e
# 迭代步长
n = 50
h = (b - a) / n
# 保存迭代过程产生的数值
y = []
y.append(y0)
# 将自变量离散化
x = np.arange(a, b, h)
# 迭代过程
for i in x:
k1 = h * (-2 * i * y0)
k2 = h * (-2 * (i + 0.5 * h) * (y0 + 0.5 * k1))
k3 = h * (-2 * (i + 0.5 * h) * (y0 + 0.5 * k2))
k4 = h * (-2 * (i + h) * (y0 + k3))
tmpy = y0 + 1 / 6 * (k1 + 2 * k2 + 2 * k3 + k4)
y.append(tmpy)
y0 = tmpy
# 求解精确解
x1 = np.arange(a, b + h, h)
y1 = math.e ** (-x1 * x1)
# 定义微分方程
def f(y, x):
return -2 * x * y
y2 = odeint(f, 1 / math.e, x1)
plt.plot(x1, y, lw=3, label="runge-kutta_value")
plt.plot(x1, y1, lw=3, label="exact_value")
plt.plot(x1, y2, lw=3, label="ode_value")
plt.legend()
plt.show()
感谢支持
更多内容,请移步《超级个体》。