总的来说,您的想法是正确的。对于在长度的积分区间上p
达到全局误差水平的顺序方法,您将需要幅度范围内的步长tol
T
h=pow(tol/T,1.0/p).
然而,不仅离散化误差会随着N=T/h
步骤累积,而且浮点误差也会累积。这给出了有用步长大小的下限h=pow(T*mu,1.0/(p+1))
。
示例:对于T=1
,mu=1e-15
和tol=1e-6
1 阶的欧拉方法需要大约的步长,h=1e-6
因此需要步长N=1e+6
和函数评估。可以预期合理结果的步长范围以 为界h=3e-8
。
改进的 Euler 或 Heun 方法具有 2 阶,这意味着步长1e-3
、N=1000
步长和2N=2000
函数评估,有用步长的下限是1e-3
。
经典的 Runge-Kutta 方法的阶数为 4,它给出了所需的步长大约为h=3e-2
大约N=30
步长和4N=120
函数评估。下界是1e-3
。
因此,使用高阶方法可以获得显着的收益。同时,步长减小导致全局误差较低的范围也随着阶数的增加而显着变窄。但与此同时,可实现的精度也会提高。因此,一个人必须有意识地关心何时达到这一点,以便独自离开。
球示例中 RK4 的实现,通常用于 ODE 的数值积分,适用于 ODE 系统x'=f(t,x)
,其中x
是可能非常大的状态向量
通过使速度成为状态向量的成员,将二阶 ODE(系统)转换为一阶系统。x''=a(x,x')
变成[x',v']=[v, a(x,v)]
. 然后,代理系统的大向量由对的集合组成,[x,v]
或者,如果需要,作为所有组件的集合和所有x
组件的集合的串联v
。
在基于代理的系统中,将属于代理的状态向量的分量存储为代理的内部变量是合理的。然后通过迭代代理集合并计算适合内部变量的操作来执行向量操作。
考虑到在LOGO语言中函数调用没有显式参数,所以求值dotx = f(t,x)
需要先确定正确的值,t
然后x
再调用函数求值f
save t0=t, x0=x
evaluate k1 = f_of_t_x
set t=t0+h/2, x=x0+h/2*k1
evaluate k2=f_of_t_x
set x=x0+h/2*k2
evaluate k3=f_of_t_x
set t=t+h, x=x0+h*k3
evaluate k4=f_of_t_x
set x=x0+h/6*(k1+2*(k2+k3)+k4)