Рунге-Кутта ведет себя странно, когда начальное значение отрицательное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

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