Runge-Kutta 与 Taylor 算法

Runge-Kutta vs Taylor algorithm

提问人:Pablo Borrego 提问时间:11/5/2023 最后编辑:Lutz LehmannPablo Borrego 更新时间:11/7/2023 访问量:26

问:

我正在为我的数值方法科目做一项任务,他们要求使用 Runge-Kutta 和 Taylor 方法来估计微分系统(Chua 电路)的解,其场由下式确定:

F(x,y,z)=\[2\*(y-0.5\*x+ (1/2)*abs(x+1)-abs(x-1)), x-y+z, -2*y\],

为了应用这些算法,我开发了两个函数:

> def taylor(F, ini , t, n):
> k = [0] * (n + 1)
> k[0] = ini
> h = (t - 0)/n  
> for i in range(n):
> xk, yk, zk = k[i]        
> f1x, f1y, f1z = F
> f2xx = f1x.diff(x)(xk, yk, zk)
> f2xy = f1x.diff(y)(xk, yk, zk)
> f2xz = f1x.diff(z)(xk, yk, zk)
> f2yy = f1y.diff(y)(xk, yk, zk)
> f2yz = f1y.diff(z)(xk, yk, zk)
> f2zz = f1z.diff(z)(xk, yk, zk)
> 
> k[i+1] = [xk + (h/2)*f1x(xk, yk, zk) + ((h**2)/6)*(f2xx + 2*f2xy + 2*f2xz + f2yy + 2*f2yz + f2zz),
> yk + (h/2)*f1y(xk, yk, zk) + ((h**2)/6)*(f2yy + 2*f2yz + f2zz),
> zk + (h/2)*f1z(xk, yk, zk)]
> return k

> def Runge_Kutta(F,ini,t,n):
> k = [0] * (n + 1)
> k[0] = ini
> h = (t - 0)/n
> for i in range(n):
> xk, yk, zk = k[i]
> 
> K1 = F(xk, yk, zk)
> K2 = F(xk + (h/2) * K1[0], yk + (h/2) * K1[1], zk + (h/2) * K1[2])
> K3 = F(xk + (h/2) * K2[0], yk + (h/2) * K2[1], zk + (h/2) * K2[2])
> K4 = F(xk + h * K3[0], yk + h * K3[1], zk + h * K3[2])
> 
> x_nuevo = xk + (h/6) * (K1[0] + 2*K2[0] + 2*K3[0] + K4[0])
> y_nuevo = yk + (h/6) * (K1[1] + 2*K2[1] + 2*K3[1] + K4[1])
> z_nuevo = zk + (h/6) * (K1[2] + 2*K2[2] + 2*K3[2] + K4[2])
> 
> k[i+1] = [x_nuevo, y_nuevo, z_nuevo]
> 
> return k

问题是,如果我为两个函数分配相同的“t”,我会得到不同的结果,但是如果我将“t”应用于 Taylor,将“t/2”应用于 Runge-Kutta,我会得到非常相似的结果。

我想知道为什么会这样。

是因为我的算法错了吗?

数值方法 Runge-Kutta Taylor 级数

评论

1赞 Lutz Lehmann 11/7/2023
这是一个数学问题。在泰勒展开中,系数为 和 ,线性项或一阶项中的不同因子解释了您的观测值。我很惊讶你计算标记为二阶导数的东西的方式不会产生错误。F的一阶导数,即它的雅可比式,通常不是对称的,只有当F本身是一个梯度场时。将符号计算和大规模数值计算紧密地混合在一起总是一个坏主意。您只需应用一次符号运算,然后进行计算。用 sympy 表达式制作一个 numpy 函数。hh**2/2

答: 暂无答案