Я некоторое время искал в интернете методы интеграции для физического движка, который я пытаюсь написать для забавы (должен полюбить занудство там: P). Я нашел метод Эйлера, RK4 и Verlet (а также версию с поправкой на время). Я также пытался придумать некоторые из моих собственных методов. Мне было интересно, знаете ли вы о других, которые вы нашли интуитивно понятным или полезным. Спасибо.
РЕДАКТИРОВАТЬ: Спасибо за всю вашу помощь до сих пор. Что касается пояснения: возможно, я имею в виду числовую интеграцию. Удивительно, но во всех моих исследованиях я не нашел столько технического имени для того, что я пытаюсь сделать! Возможно, описание моей конкретной проблемы сделает мой вопрос более ясным. Допустим, я хочу смоделировать шар, движущийся через круговое (или сферическое, как только я реализую 3d) гравитационное поле. Этот шар будет сталкиваться с векторами силы, которые могут быть использованы для вычисления соответствующего вектора ускорения для точки, в которой находится шар на этом конкретном тике. Из вашего урока физики вы знаете, что скорость = ускорение * время, но моя проблема в том, что технически шарик находится в этой точке только на мгновение, математически представленный в исчислении как dt. Очевидно, что я не могу использовать бесконечно малое число в C ++, поэтому я должен аппроксимировать решение, используя методы мгновенной интеграции (термин, который я слышал в некоторых чтениях, но могу ошибаться) или то, что, по вашему мнению, называется числовой интеграцией (вы, вероятно, правильно, поэтому я изменил название).
Вот моя (успешная) попытка реализации метода численного интегрирования Эйлера:
//For console output. Note: I know I could just put "using namespace std;" but I hate doing that.
#include <iostream>
using std::cout;
using std::system;
using std::endl;
//Program entry
int main (void)
{
//Variable decleration;
double time = 0;
double position = 0;
double velocity = 0;
double acceleration = 2;
double dt = 0.000001; //Here is the "instantanious" change in time I was talking about.
double count = 0; //I use count to make sure I am only displaying the data at whole numbers.
//Each irritation of this loop is one tick
while (true)
{
//This next bit is a simplified form of Euler's method. It is what I want to "upgrade"
velocity += acceleration * dt;
position += velocity * dt;
if (count == 1/dt) //"count == 1/dt" will only return true if time is a whole number.
{
//Simple output to console
cout << "Time: " << time << endl;
cout << "Position: " << position << endl;
cout << "------------------" << endl;
system ("pause");
count = 0; //To reset the counter.
}
//Update the counters "count" and "time"
count++;
time += dt;
}
return 1; //Program exit
}
Поскольку ускорение является постоянным, а этот дифференциал на самом деле разрешимым (почему я использую его для тестирования, решение - позиция = время ^ 2, это довольно точно, но если вы сделаете его немного более сложным, например, изменяя ускорение с течением времени, алгоритм очень быстро теряет точность. И снова спасибо!