plotmatlab-figurechaos

chen's chaotic system solution using differential transform method


I am calculating the solution of Chen's chaotic system using differential transform method. The code that I am using is:

x=zeros(1,7);
x(1)=-0.1;
y=zeros(1,7);
y(1)=0.5;
z=zeros(1,7);
z(1)=-0.6;
for k=0:5
    x(k+2)=(40*gamma(1+k)/gamma(2+k))*(y(k+1)-x(k+1));
    sum=0;
    for l=0:k
        sum=sum+x(l+1)*z(k+1-l);
    end
    y(k+2)=(gamma(1+k)/gamma(2+k))*(-12*x(k+1)-sum+28*y(k+1));
    sum=0;
    for l=0:k
        sum=sum+x(l+1)*y(k+1-l);
    end
    z(k+2)=(gamma(1+k)/(1+k))*(sum-3*z(k+1));
end
s=fliplr(x);
t=0:0.05:2;
a=polyval(s,t);
plot(t,a)

What this code does is calculate x(k), y(k) and z(k) these are the coefficients of the polynomial that is approximating the solution. The solution x(t) = sum_0^infinity x(k)t^k, and similarly the others. But this code doesn't give the desired output of a chaotic sequence the graph of x(t) that I am getting is:

enter image description here


Solution

  • This is not an answer, but a clearer and more correct (programmatically speaking) to write your loop:

    for k = 1:6
        x(k+1)=(40*1/k)*(y(k)-x(k));
        temp_sum = sum(x(1:k).*z(k:-1:1),2);
        y(k+1) = (1/k)*(-12*x(k)-temp_sum+28*y(k));
        temp_sum = sum(x(1:k).*y(k:-1:1),2);
        z(k+1) = (1/k)*(temp_sum-3*z(k));
    end
    

    The most important issue here is not overloading the built-in function sum (I replaced it with temp_sum. Other things include vectorization of the inner loops (using sum...), indexing that starts in 1 (instead of writing k+1 all the time), and removing unnecessary calls to gamma (gamma(k)/gamma(k+1) = 1/k).