Search code examples
numerical-methodsdifferential-equationsscilab

Amplitude increasing in the verlet method in backward difference


I am facing trouble in the increasing oscillation on a simple harmonic oscillator using a backward difference. here is my code in Scilab

function [x] = back(h, tf)
k = 2;
m = 1;
i = 2;

t(i - 1) = 0;
x(i - 1) = 10;
v(i - 1) = 0;
t(i) = t(i - 1) + h
v(i) = v(i - 1) - h * (k / m) * x(i - 1)

while t(i) < tf
    t(i + 1) = t(i) + h
    x(i + 1) = x(i - 1) - 2 * (k / m) * v(i) * h
    i = i + 1
end

plot(t, x, 'b');

endfunction


Solution

  • From your code, I suppose that you are trying to implement the velocity-Verlet scheme. Here is its implementation for a simple oscillator with the differential equation:

                                                  
    
    function [x] = back(h, tf)
      k = 2;
      m = 1;
    
      t = 0:h:tf;
      x(1) = 10;
      v(1) = 0;
    
      for i=2:length(t)
        x(i) = x(i - 1) + v(i - 1) * h - k / m * x(i-1) * h^2 / 2;
        v(i) = v(i - 1) - k / m * (x(i) + x(i-1)) * h / 2;
      end
    
      plot(t, x, 'b');
    endfunction
    
    [x] = back(0.01, 10)
    

    enter image description here