Увеличение амплитуды в методе verlet при обратной разнице - PullRequest
0 голосов
/ 29 февраля 2020

Я столкнулся с проблемой увеличения колебаний на генераторе с простой гармоникой c, использующим обратную разницу. вот мой код в 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

Ответы [ 2 ]

2 голосов
/ 04 марта 2020

Полагаю, из вашего кода вы пытаетесь реализовать схему speed-Verlet . Вот его реализация для простого генератора с дифференциальным уравнением:

                               <img src="https://i.stack.imgur.com/QoeZp.png" width="150">               
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

0 голосов
/ 01 марта 2020

Я не совсем уверен, чего вы пытаетесь достичь, равно как и ваша математика верна. Но если предположить, что вы хотите решить числовую проблему:

//coefficients of:
k = 2.;
m = 1.;

// with an initial condition of:
t(1) = 0.;
x(1) = 10.;
v(1) = 0.;

// time paramters:
N = 50;
tf = 10;
h = tf / 50.;


for ii = 2:N
    t(ii) = t(ii - 1) + h;
    x(ii) = x(ii - 1) - 2 * (k / m) * v(ii - 1) * h
    v(ii) = v(ii - 1) - h * (k / m) * x(ii - 1)
    disp(x(ii))
end


plot(t, x, 'b');

, то вы получите:

                   <img src="https://i.stack.imgur.com/diPIY.png" width="400">               

, что кажется неправильным, но в любом случае. Пожалуйста, проверьте свою математику снова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...