Рунге-Кутта ведет себя странно, когда начальное значение отрицательноеC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Рунге-Кутта ведет себя странно, когда начальное значение отрицательное

Сообщение Anonymous »

У меня есть следующий алгоритм RK4 на C++ для решения дифференциальных уравнений первого порядка:
using ODE_Function = std::function;

template //"length" is the number of data points
double* rk4(ODE_Function fxn, double y0, double x0, double h) {

double* y = new double[length];

y[0] = y0; //initialize output array
double x = x0; //n is our discretized x variable

//main loop
for (int n = 1; n < length; n++) {//y0 is already known, so we start from the second data point

double k1 = fxn(x, y[n-1]);
double k2 = fxn(x + h/2, y[n-1] + h*k1/2);
double k3 = fxn(x + h/2, y[n-1] + h*k2/2);
double k4 = fxn(x + h, y[n-1] + h*k3);

y[n] = y[n-1] + h/6*(k1 + 2*k2 + 2*k3 + k4);
x += h;
}

return y;
}

Однако это ведет себя странно, когда x0 отрицательно...
В частности, в следующих случаях теоретически должны выдаваться результаты, соответствующие тенденции (- x^2)-2(x+1), просто просмотр из разных «окна». Но это делает только финальный. Первый результат дает отрицательную экспоненту, а второй по какой-то причине приводит к положительной экспоненте.
double fxn(double x, double y) {
return x*x + y;
}
int main() {
const int length = 100;
double y0 = -2;
double x0 = -1; //LOOK HERE
double h = 0.1;

double* result = rk4(fxn, y0, x0, h);
}

double fxn(double x, double y) {
return x*x + y;
}
int main() {
const int length = 100;
double y0 = -2;
double x0 = -5; //LOOK HERE
double h = 0.1;

double* result = rk4(fxn, y0, x0, h);
}

double fxn(double x, double y) {
return x*x + y;
}
int main() {
const int length = 100;
double y0 = -2;
double x0 = 0; //LOOK HERE
double h = 0.1;

double* result = rk4(fxn, y0, x0, h);
}


Подробнее здесь: https://stackoverflow.com/questions/786 ... s-negative
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Рунге-Кутта ведет себя странно, когда начальное значение отрицательное
    Anonymous » » в форуме C++
    0 Ответы
    27 Просмотры
    Последнее сообщение Anonymous
  • JsonCpp не защищает от переполнения uint64 и ведет себя странно
    Anonymous » » в форуме C++
    0 Ответы
    47 Просмотры
    Последнее сообщение Anonymous
  • Почему в моем эскизе p5.js элемент ввода ведет себя странно в Android (мобильном) Chrome и Firefox? [закрыто]
    Anonymous » » в форуме Android
    0 Ответы
    34 Просмотры
    Последнее сообщение Anonymous
  • Пока цикл ведет себя странно при использовании вектора::size() [дубликат]
    Anonymous » » в форуме C++
    0 Ответы
    38 Просмотры
    Последнее сообщение Anonymous
  • URL-навигация ведет себя странно
    Anonymous » » в форуме Php
    0 Ответы
    29 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»