Если вы собираетесь интегрировать заранее - что является хорошей идеей и абсолютно правильным способом go, когда вы можете - тогда вы можете просто записать уравнения как функции t для всего:
x'' = -kx/m
x'' + (k/m)x = 0
r^2 + k/m = 0
r^2 = -(k/m)
r = i*sqrt(k/m)
x(t) = A*e^(i*sqrt(k/m)t)
= A*cos(sqrt(k/m)t + B) + i*A*sin(sqrt(k/m)t + B)
= A*cos(sqrt(k/m)t + B)
Из начальных условий мы знаем, что
x(0) = 12 = A*cos(B)
v(0) = 0 = -sqrt(k/m)*A*sin(B)
Второе из этих уравнений верно, только если мы выберем A = 0 или B = 0 или B = Pi.
- если A = 0, то первое уравнение не имеет решения.
- если B = 0, первое уравнение имеет решение A = 12.
- если B = Pi, первое уравнение имеет решение A = -12.
Мы, вероятно, предпочитаем B = 0 и A = 12. Это дает
x(t) = 12*cos(sqrt(k/m)t)
v(t) = -12*sqrt(k/m)*sin(sqrt(k/m)t)
a(t) = -12*(k/m)cos(sqrt(k/m)t)
Таким образом, в любое дополнительное время t [n + 1] = t [n] + dt, мы можем просто вычислить точное положение, скорость и ускорение для t [n] без какого-либо накопления дрейфа или неточности.
Все это говорит, если вы заинтересованы в том, как численно найти x (t) и v (t) и a (t) при произвольном обыкновенном дифференциальном уравнении, ответ гораздо сложнее. Есть много хороших способов сделать то, что можно назвать численной интеграцией. Метод Эйлера самый простой:
// initial conditions
t[0] = 0
x[0] = …
x'[0] = …
…
x^(n-1)[0] = …
x^(n)[0] = 0
// iterative step
x^(n)[k+1] = f(x^(n-1)[k], …, x'[k], x[k], t[k])
x^(n-1)[k+1] = x^(n-1)[k] + dt * x^(n)[k]
…
x'[k+1] = x'[k] + dt * x''[k]
x[k+1] = x[k] + dt * x'[k]
t[k+1] = t[k] + dt
Чем меньше значение dt, которое вы выбираете, тем дольше он работает в течение фиксированного промежутка времени, но тем точнее результаты, которые вы получаете. Это в основном делает римановскую сумму функции и всех ее производных вплоть до наивысшей, участвующей в ОДУ.
Более точная версия этого, как правило Симпсона, делает то же самое, но принимает среднее значение над последний квант времени (а не значение любой конечной точки; в приведенном выше примере используется начало интервала). Гарантируется, что среднее значение за интервал будет ближе к истинному значению за интервал, чем любая конечная точка (если только функция не была постоянной в течение этого интервала, и в этом случае Симпсон по крайней мере так же хорош).
Вероятно, Лучшими стандартными методами численного интегрирования для ODE (при условии, что для большей стабильности вам не нужны какие-то методы типа leapfrog) являются методы Runge Kutta. Адаптивный метод временного шага Рунге-Кутты с достаточным порядком обычно делает свое дело и дает вам точные ответы. К сожалению, математика для объяснения методов Рунге-Кутты, вероятно, слишком сложна и трудоемка, чтобы освещать ее здесь, но вы можете найти информацию об этих и других передовых методах в Интернете или, например, в «Числовых рецептах», серии книг по численным методам, которая содержит множество очень полезные примеры кода.
Даже методы Рунге Кутты работают, в основном, путем уточнения предположения о значении функции во временном кванте. Они просто делают это более изощренными способами, которые гарантированно уменьшают ошибку на каждом шаге.