简谐运动 - Verlet - 外力 - Matlab

时间:2015-04-23 20:23:39

标签: matlab verlet-integration

我在没有用力的情况下完成了我以前为Verlet方法所做的代数 - 这导致了下面你看到的相同代码,但忽略了“+(2 * F / D)”术语外力。正如预期的那样,该算法可以准确地工作,但是对于以下参数:

m = 7; k = 8; b = 0.1; params = [m,k,b];

(步长h = 0.001)

远远高于0.00001的力量太大了。我怀疑我错过了使用代数的技巧。

我的问题是,是否有人能够在我的Verlet方法中添加一个强制术语来发现缺陷

% verlet.m
% uses the verlet step algorithm to integrate the simple harmonic
% oscillator.

% stepsize h, for a second-order ODE

function vout = verlet(vinverletx,h,params,F)

% vin is the particle vector (xn,yn)
x0 = vinverletx(1);
x1 = vinverletx(2);


% find the verlet coefficients
D = (2*params(1))+(params(3)*h);
A = (2/D)*((2*params(1))-(params(2)*h^2));
B=(1/D)*((params(3)*h)-(2*params(1)));

x2 = (A*x1)+(B*x0)+(2*F/D);

vout = x2;

% vout is the particle vector (xn+1,yn+1)
end

1 个答案:

答案 0 :(得分:1)

正如在上一个问题的答案中所写,当摩擦进入等式时,系统不再保守而且名称" Verlet"不再适用。它仍然是

的有效离散化
m*x''+b*x'+k*x = F

(有一些轻微错误,后果很大)。

离散化采用一阶和二阶的中心差分

x'[k]  = (x[k+1]-x[k-1])/(2*h) + O(h^2)
x''[k] = (x[k+1]-2*x[k]+x[k-1])/(h^2) + O(h^2)

导致

(2*m+b*h)*x[k+1] - 2*(2*m+h^2*k) * x[k] + (2*m-b*h)*x[k-1] = 2*h^2 * F[k] + O(h^4)

错误:正如您所看到的,您在h^2的字词中遗漏了因子F