Runge-Kutta vs Taylor algorithm

42 Views Asked by At

I am doing a task for my Numerical Methods subject, they ask use Runge-Kutta and Taylor methods to estimate the solutions of a differential system (Chua Circuit) Whose field is determined by:

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

To apply the algorithms I have developed two functions:

> 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

And

> 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

The problem is that if I assign the same 't' to both functions I obtain different results, but if I apply 't' to Taylor and 't/2' to Runge-Kutta I get really similar results.

I would like to know why is that happening.

Is it because my algorithm is wrong?

0

There are 0 best solutions below