Решается дифура второго порядка методом Рунге-Кутты 4-ого порядка.
Для большинства линейный дифуров или вообще не зависящих от самой функции всё идёт хорошо. Однако для уравнений вида:
y'' = -w^2*sin(y) (w - const), или даже частного случая y''=-y решение получается не правильным. начальные условия y(0) = y0, y'(0) = 0.
Проверка делается основываясь на периодичности функции период, при данных условиях, первой функции близок к 3. У второй период 2pi. (Уравнение имеет аналитическое решение y = cos(x) ). У функции, получаемой решением уравнения период около 20.
В почему так может быть? Вот отрывок кода(С++), реализующий этот метод:
int s=1;
if(x0 > x2) s*= -1;
double xi = x0;
double yi = y0;
double y1i = y1;
h = 0.000001;
while(absol(xi-x2)>= h){
m[0] = h*func(xi,yi,w);
k[0] = h*y1i;
m[1] = h*func(xi + h/2, y1 + k[0]/2,w);
k[1] = h*(y1i + m[0]/2);
m[2] = h*func(xi + h/2, y1 + k[1]/2,w);
k[2] = h*(y1i + m[1]/2);
m[3] = h*func(xi + h, y1 + k[2],w);
k[3] = h*(y1i + m[2]);
y1i = y1i + (m[0] + 2*m[1] + 2*m[2] + m[3]) / 6;
yi = yi + (k[0] + 2*k[1] + 2*k[2] + k[3]) / 6;
xi = xi + s*h;
};
Кстати, Метод Эйлера даёт результат, выдерживающий проверку на период.
Примечание:
absol - модуль. fabs неутраивает из-за перегруженности, компилятор ругается через раз, лучше путь будет так.
y1i - фактически первая производная, т.к. дифур второго порядка сводится к системе заменой (у данном случае) y1 = ф'.
Примечание:
Нет, обычная функция. Это ещё не готовый вариант.
Двигается всё это вправо(ну на проверяемых тестах, но спасибо, что сказали). Поэтому s там не влияет. Вариант с пере присваиванием h не прокатит, т.к. оно используется не только в этой подпрограмме( здесь поместил, чтобы показать, что это)
Вопрос всё равно остаётся открытым: почему решение может получатся не корректным. Причём именно для этих функций, для других, которые я проверял( это были линейные дифуры, либо вообще не зависили от самой функции) всё работало корректно.
RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.
Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.
Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.