Решение для дифференциального уравнения совершенно различно в boost :: odeint и scipy.integrate - PullRequest
4 голосов
/ 26 апреля 2019

Я пытаюсь перенести мой быстрый прототип с Python на C ++.Я пытаюсь проверить обозначения с помощью простого дифференциального уравнения, но результаты сильно отличаются для начального значения [2,0].Python снижается, в то время как решение C ++ сильно растет.

Он работал для примера, найденного здесь: Как включить изменяющиеся во времени параметры из справочной таблицы в boost :: odeint, c ++

но это не работает для моего примера

TransferF::TransferF(const double& deltaT) : dt(deltaT), t(0.0), y(2)
{
    // initial values
    y[0] = 2.0;  //  x1 
    y[1] = 0.0;  //  x2
}


void TransferF::ode(const state_type &x, state_type &y, double t)
{
    y[0] = x[0];
    y[1] = x[1];
    y[2] = (-2*y[1] - y[0] + 1) / (pow(y[0],2));
}

и то же самое в py:

def modelt(x,t):
    y = x[0]
    dydt = x[1]
    dy2dt2 = (-2*dydt - y + 1)/ (y **2)
    return [dydt,dy2dt2]

x3 = odeint(modelt,[2,0],timev)

Я ожидал те же результаты для временного ряда, но решение питоновпадает, C ++ поднимается.

1 Ответ

1 голос
/ 26 апреля 2019

Код C ++ имеет тонкую несогласованность. Выходной вектор y должен содержать только производные y', y", а не саму функцию y:

void TransferF::ode(const state_type &x, state_type &y, double t)
{
    y[0] = x[1];
    y[1] = (-2*x[1] - x[0] + 1) / (pow(x[0],2));
}
...