Форум программистов, компьютерный форум CyberForum.ru

Функция для численного интегрирования системы дифференциальных уравнений методом Рунге - Кутта - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.62
DenProx
Техник
 Аватар для DenProx
306 / 164 / 4
Регистрация: 09.10.2009
Сообщений: 3,006
20.06.2012, 08:27     Функция для численного интегрирования системы дифференциальных уравнений методом Рунге - Кутта #1
Доброго времени суток. У меня есть вот такая задачка:

Разработать функцию для численного интегрирования системы дифференциальных уравнений методом Рунге - Кутта. Прототип функции:

C++
1
void runge_k(void f(double *y, double *ys, double t), double *y, int n, duble tn, double tk, int m, double delt);
где:

f - функция вычисления правых частей системы дифференциальных уравнений;
y - массив размера n значений зависимых переменных;
ys - массив размера n значений производных;
n - порядок системы дифференциальных уравнений;
t - независимая переменная;
tn - начальное значение интервала интегрирования;
tk - конечное значение интервала интегрирования;
m - начальное число разбиений отрезка интегрирования ;
delt - шаг интегрирования.

Шаг интегрирования для метода использовать 0,0001.


Очень нужна ваша помощь! Помогите решить, пожалуйста!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.06.2012, 08:27     Функция для численного интегрирования системы дифференциальных уравнений методом Рунге - Кутта
Посмотрите здесь:

C++ Решение системы диффуров методом Рунге-Кутта
Решение обычных деференциальных уравнений методами Ейлера, Рунге-Кутта C++
Разработать схему алгоритма для решения задачи численного интегрирования тремя методами C++
C++ Решение задачи Коши методом Рунге-Кутта
Решение системы дифференциальных уравнений методом Эйлера C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vndtta
66 / 43 / 5
Регистрация: 17.10.2011
Сообщений: 146
Завершенные тесты: 1
20.06.2012, 10:52     Функция для численного интегрирования системы дифференциальных уравнений методом Рунге - Кутта #2
Цитата Сообщение от DenProx Посмотреть сообщение
Доброго времени суток. У меня есть вот такая задачка:

Разработать функцию для численного интегрирования системы дифференциальных уравнений методом Рунге - Кутта. Прототип функции:

C++
1
void runge_k(void f(double *y, double *ys, double t), double *y, int n, duble tn, double tk, int m, double delt);
где:

f - функция вычисления правых частей системы дифференциальных уравнений;
y - массив размера n значений зависимых переменных;
ys - массив размера n значений производных;
n - порядок системы дифференциальных уравнений;
t - независимая переменная;
tn - начальное значение интервала интегрирования;
tk - конечное значение интервала интегрирования;
m - начальное число разбиений отрезка интегрирования ;
delt - шаг интегрирования.

Шаг интегрирования для метода использовать 0,0001.


Очень нужна ваша помощь! Помогите решить, пожалуйста!
тут много чего непонятно
например:
что делает функция void f(..) (вычисляет производную? ys)
куда результат записать?
для чего нужно интегрируемый отрезок разбивать (m)
как вычислить количество операций в методе если порядок больше 4?
DenProx
Техник
 Аватар для DenProx
306 / 164 / 4
Регистрация: 09.10.2009
Сообщений: 3,006
20.06.2012, 11:01  [ТС]     Функция для численного интегрирования системы дифференциальных уравнений методом Рунге - Кутта #3
в задании еще написано применить эту функцию для интегрирования дифференциального уравнения 3-го порядка:

y^3 + 2y'' + 3y' + y = 5 + x^2

в интервале x [0,2] с шагом delta X = 0,1
и начальными условиями: x=0; y(0) =1; y'(0) = 0,1 ; y''(0) = 0

к сожалению это вся информация которая у меня есть...
vndtta
66 / 43 / 5
Регистрация: 17.10.2011
Сообщений: 146
Завершенные тесты: 1
20.06.2012, 13:58     Функция для численного интегрирования системы дифференциальных уравнений методом Рунге - Кутта #4
Цитата Сообщение от DenProx Посмотреть сообщение
в задании еще написано применить эту функцию для интегрирования дифференциального уравнения 3-го порядка:

y^3 + 2y'' + 3y' + y = 5 + x^2

в интервале x [0,2] с шагом delta X = 0,1
и начальными условиями: x=0; y(0) =1; y'(0) = 0,1 ; y''(0) = 0

к сожалению это вся информация которая у меня есть...
а ну вроде теперь больше ясности

тогда y[] - это массив значений производных
а порядок метода тогда четвертый по умолчанию
щас подумаю как сделать

только все равно не понятно как возвращать значение

может представить y[] так: y={Y,y,y',y'',...}?
DenProx
Техник
 Аватар для DenProx
306 / 164 / 4
Регистрация: 09.10.2009
Сообщений: 3,006
20.06.2012, 14:03  [ТС]     Функция для численного интегрирования системы дифференциальных уравнений методом Рунге - Кутта #5
vndtta, хм, я думаю так и нужно) хотя не уверен ...
vndtta
66 / 43 / 5
Регистрация: 17.10.2011
Сообщений: 146
Завершенные тесты: 1
20.06.2012, 14:19     Функция для численного интегрирования системы дифференциальных уравнений методом Рунге - Кутта #6
Цитата Сообщение от DenProx Посмотреть сообщение
vndtta, хм, я думаю так и нужно) хотя не уверен ...
тогда способа как вернуть расчитанное значение я не знаю
DenProx
Техник
 Аватар для DenProx
306 / 164 / 4
Регистрация: 09.10.2009
Сообщений: 3,006
20.06.2012, 14:45  [ТС]     Функция для численного интегрирования системы дифференциальных уравнений методом Рунге - Кутта #7
а если представить в виде y={Y,y,y',y'',...}, тогда получится ?) я бы был рад любому решению данной задачи)
vndtta
66 / 43 / 5
Регистрация: 17.10.2011
Сообщений: 146
Завершенные тесты: 1
20.06.2012, 14:55     Функция для численного интегрирования системы дифференциальных уравнений методом Рунге - Кутта #8
Цитата Сообщение от vndtta Посмотреть сообщение
тогда способа как вернуть расчитанное значение я не знаю
щас пытался функцию f определить

условие какое-то странное

выходит что 1^3 +2*0+3*0.1+1=5+0^2;

как-то не сходится
DenProx
Техник
 Аватар для DenProx
306 / 164 / 4
Регистрация: 09.10.2009
Сообщений: 3,006
20.06.2012, 14:58  [ТС]     Функция для численного интегрирования системы дифференциальных уравнений методом Рунге - Кутта #9
да мне тоже показалось оно странным ...
vndtta
66 / 43 / 5
Регистрация: 17.10.2011
Сообщений: 146
Завершенные тесты: 1
20.06.2012, 15:09     Функция для численного интегрирования системы дифференциальных уравнений методом Рунге - Кутта #10
Цитата Сообщение от DenProx Посмотреть сообщение
а если представить в виде y={Y,y,y',y'',...}, тогда получится ?) я бы был рад любому решению данной задачи)
я вот ни как не могу подогнать под теорию такой формат

там либо функции f нужно как-то указать размерность, либо нужно задать массив функций f

это вообще окончательный вариант прототипа? или кое-что поменять можно?
DenProx
Техник
 Аватар для DenProx
306 / 164 / 4
Регистрация: 09.10.2009
Сообщений: 3,006
20.06.2012, 18:20  [ТС]     Функция для численного интегрирования системы дифференциальных уравнений методом Рунге - Кутта #11
да я думаю можно поменять, преподу главное чтоб работало)
vndtta
66 / 43 / 5
Регистрация: 17.10.2011
Сообщений: 146
Завершенные тесты: 1
21.06.2012, 08:46     Функция для численного интегрирования системы дифференциальных уравнений методом Рунге - Кутта #12
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
void runge_k(
    void f(double *y, double *ys, double t),
    double *y, int n,
    duble tn, double tk,
    int m, double delt)
{
    double k1[n],k2[n],k3[n],k4[n],Yh[n+1];
    double h=delt;
    double* ys=y+n+1;
    double X;
    for(X=tn;X<tk;X+=h){
        f(y,ys,X);
        
        for( int i=0;i<n;i++) k1[i]=h*y[i+1];
        for( int i=0;i<n;i++) Yh[i]=y[i]+0.5*k1[i];         
        f(Yh,Yh+n+1,X+h*0.5);
        
        for( int i=0;i<n;i++) k2[i]=h*Yh[i+1];
        for( int i=0;i<n;i++) Yh[i]=y[i]+0.5*k2[i];
        f(Yh,Yh+n+1,X+h*0.5);
        
        for( int i=0;i<n;i++) k3[i]=h*Yh[i+1];
        for( int i=0;i<n;i++) Yh[i]=y[i]+k3[i];
        f(Yh,Yh+n+1,X+h);
        
        for( int i=0;i<n;i++) k4[i]=h*Yh[i+1];
        
        for( int i=0;i<n;i++) y[i]+=1./6.*(k1[i]+2*k2[i]+2*k3[i]+k4[i]);
    }
    h=tk-X;
    f(y,ys,X);
    
    for( int i=0;i<n;i++) k1[i]=h*y[i+1];
    for( int i=0;i<n;i++) Yh[i]=y[i]+0.5*k1[i];         
    f(Yh,Yh+n+1,X+h*0.5);
    
    for( int i=0;i<n;i++) k2[i]=h*Yh[i+1];
    for( int i=0;i<n;i++) Yh[i]=y[i]+0.5*k2[i];
    f(Yh,Yh+n+1,X+h*0.5);
    
    for( int i=0;i<n;i++) k3[i]=h*Yh[i+1];
    for( int i=0;i<n;i++) Yh[i]=y[i]+k3[i];
    f(Yh,Yh+n+1,X+h);
    
    for( int i=0;i<n;i++) k4[i]=h*Yh[i+1];
    
    for( int i=0;i<n;i++) y[i]+=1./6.*(k1[i]+2*k2[i]+2*k3[i]+k4[i]);
}
код неахти конечно
тут мне кажется надо еще добавить количество k в зависимости от m

и еще надо подставить твою функцию
для начала перепишем уравнеие в таком виде
y''=-3/2y'-1/2y-1/2y^3+1/2x^2+5/2;

C++
1
2
3
4
5
void f(double *y,double *ys, x)
{
    //int n=(ys-y)/sizeof(double);
    *ys=2.5+0.5*x^2-0.5*y[1]-0.5*y[1]^3-1.5y[2];
}
DenProx
Техник
 Аватар для DenProx
306 / 164 / 4
Регистрация: 09.10.2009
Сообщений: 3,006
21.06.2012, 08:59  [ТС]     Функция для численного интегрирования системы дифференциальных уравнений методом Рунге - Кутта #13
Цитата Сообщение от vndtta Посмотреть сообщение
тут мне кажется надо еще добавить количество k в зависимости от m
а k - это что тут получается?
vndtta
66 / 43 / 5
Регистрация: 17.10.2011
Сообщений: 146
Завершенные тесты: 1
21.06.2012, 09:55     Функция для численного интегрирования системы дифференциальных уравнений методом Рунге - Кутта #14
Цитата Сообщение от DenProx Посмотреть сообщение
а k - это что тут получается?
k это прирост на разбиении, типа y'(x)*delta
DenProx
Техник
 Аватар для DenProx
306 / 164 / 4
Регистрация: 09.10.2009
Сообщений: 3,006
21.06.2012, 12:44  [ТС]     Функция для численного интегрирования системы дифференциальных уравнений методом Рунге - Кутта #15
vndtta, хорошо) а данное решение можно считать конечным? или еще есть что то, что требует доработки ?
vndtta
66 / 43 / 5
Регистрация: 17.10.2011
Сообщений: 146
Завершенные тесты: 1
21.06.2012, 14:30     Функция для численного интегрирования системы дифференциальных уравнений методом Рунге - Кутта #16
Цитата Сообщение от DenProx Посмотреть сообщение
vndtta, хорошо) а данное решение можно считать конечным? или еще есть что то, что требует доработки ?
нет, нельзя

тут еще надо инициализировать массив y заданными значениями(ну это уже в теле программы а не в функции)
y[0]=0 - это первообразная в точке tn, Y(n);
y[1]=y(tn);
y[2]=y'(tn);
...
y[n]=y'''''''''''''''''''''''''''''''''''''''''''''''''''''(tn);( n-1 производная )
y[n+1] - считаем функцией f

тут метод рунге-кутты четвертого порядка, откуда порядок взять я не знаю
может вообще второго порядка достаточно
еще не понятно как использовать m
DenProx
Техник
 Аватар для DenProx
306 / 164 / 4
Регистрация: 09.10.2009
Сообщений: 3,006
21.06.2012, 14:40  [ТС]     Функция для численного интегрирования системы дифференциальных уравнений методом Рунге - Кутта #17
хм... а что делать?)
vndtta
66 / 43 / 5
Регистрация: 17.10.2011
Сообщений: 146
Завершенные тесты: 1
21.06.2012, 16:48     Функция для численного интегрирования системы дифференциальных уравнений методом Рунге - Кутта #18
Цитата Сообщение от DenProx Посмотреть сообщение
хм... а что делать?)
уточни как-нибудь что за m

ты по-моему еще задание не правильно написал,
мне кажется там не y^3 а y'''
DenProx
Техник
 Аватар для DenProx
306 / 164 / 4
Регистрация: 09.10.2009
Сообщений: 3,006
21.06.2012, 20:35  [ТС]     Функция для численного интегрирования системы дифференциальных уравнений методом Рунге - Кутта #19
vndtta, написал как препод дал 1 в 1 хотя наверно он как раз таки и о печатался , или имел ввиду y'''.

p.s. только что наткнулся на подобную задачу, только решение методом Адамса рассматривается:

120366.rar
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.07.2012, 12:42     Функция для численного интегрирования системы дифференциальных уравнений методом Рунге - Кутта
Еще ссылки по теме:

C++ Численное интегрирование системы дифференциальных уравнений методом Адамса
C++ Сложности с решением системы дифференциальных уравнений
C++ Написать программу для решения системы уравнений методом Гаусса (c++)

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
DenProx
Техник
 Аватар для DenProx
306 / 164 / 4
Регистрация: 09.10.2009
Сообщений: 3,006
02.07.2012, 12:42  [ТС]     Функция для численного интегрирования системы дифференциальных уравнений методом Рунге - Кутта #20
помогите кто ни будь доделать программку! пожалуйста!
Yandex
Объявления
02.07.2012, 12:42     Функция для численного интегрирования системы дифференциальных уравнений методом Рунге - Кутта
Ответ Создать тему
Опции темы

Текущее время: 01:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru