编写函数y=RungeKutta(x,h),使用Runge-Kutta
法求解微分方程并分析误差。函数参数含义同上,再编写脚本,通过调用函数分别以不同步长(例如h=1.0,h=0.5,h=0.25)计算y(3),并分析步长和误差之间的关系。
下面是使用 Python 实现的 RungeKutta
函数以及一个脚本,用于求解微分方程并分析误差。这里我们以一个简单的一阶常微分方程 d y d x = y \frac{dy}{dx} = y dxdy=y,初始条件 y ( 0 ) = 1 y(0) = 1 y(0)=1 为例,其解析解为 y ( x ) = e x y(x) = e^x y(x)=ex。
import mathdef RungeKutta(x, h):"""使用四阶 Runge - Kutta 法求解微分方程 dy/dx = y,y(0) = 1:param x: 目标点 x 的值:param h: 步长:return: 在 x 处的数值解"""y = 1 # 初始条件 y(0) = 1steps = int(x / h)for _ in range(steps):k1 = h * yk2 = h * (y + k1 / 2)k3 = h * (y + k2 / 2)k4 = h * (y + k3)y = y + (k1 + 2 * k2 + 2 * k3 + k4) / 6return y# 分别以不同步长计算 y(3) 并分析误差
x = 3
step_sizes = [1.0, 0.5, 0.25]
for h in step_sizes:numerical_solution = RungeKutta(x, h)analytical_solution = math.exp(x)error = abs(numerical_solution - analytical_solution)print(f"步长 h = {h} 时,y({x}) 的数值解: {numerical_solution}, 解析解: {analytical_solution}, 误差: {error}")
代码解释
-
RungeKutta
函数:- 该函数使用四阶 Runge - Kutta 方法求解微分方程 d y d x = y \frac{dy}{dx} = y dxdy=y,初始条件为 y ( 0 ) = 1 y(0) = 1 y(0)=1。
- 函数接受两个参数:
x
是目标点的值,h
是步长。 - 在函数内部,通过迭代计算每个步长上的 k 1 , k 2 , k 3 , k 4 k_1, k_2, k_3, k_4 k1,k2,k3,k4 值,并更新 y y y 的值,最终返回在
x
处的数值解。
-
主脚本:
- 定义目标点
x = 3
和不同的步长step_sizes
。 - 遍历不同的步长,调用
RungeKutta
函数计算数值解,并与解析解 y ( x ) = e x y(x) = e^x y(x)=ex 进行比较,计算误差并打印结果。
- 定义目标点
步长和误差的关系
一般来说,步长越小,四阶 Runge - Kutta 方法的误差越小。这是因为四阶 Runge - Kutta 方法的局部截断误差是 O ( h 5 ) O(h^5) O(h5),全局截断误差是 O ( h 4 ) O(h^4) O(h4),当步长 h h h 减小时,误差会以 h 4 h^4 h4 的速度减小。从打印的结果中可以观察到,随着步长的减小,误差也会显著减小。