У меня есть следующий алгоритм 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++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Пока цикл ведет себя странно при использовании вектора::size() [дубликат]
Anonymous » » в форуме C++ - 0 Ответы
- 38 Просмотры
-
Последнее сообщение Anonymous
-