Техник
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
1

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

20.06.2012, 08:27. Показов 8261. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток. У меня есть вот такая задачка:

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

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.


Очень нужна ваша помощь! Помогите решить, пожалуйста!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.06.2012, 08:27
Ответы с готовыми решениями:

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

Метод Рунге-Кутта 4 порядка для решения системы дифференциальных уравнений
Имеется код программы, но по не очевидным для меня причинам работает не корректно, во время отладки...

Решение системы дифференциальных уравнений Методом Рунге-Кутта 4 порядка
В соседней теме я уже выкладывал решение системы дифф. уравнений через ode23....

Реализовать решение системы взаимосвязанных дифференциальных уравнений Т*dy/dt=k*x-y методом Рунге-Кутта
Здравствуйте! помогите пожалуйста! мне нужно в матлабе реализовать решение системы одинаковых...

19
93 / 69 / 22
Регистрация: 17.10.2011
Сообщений: 235
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?
0
Техник
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
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

к сожалению это вся информация которая у меня есть...
0
93 / 69 / 22
Регистрация: 17.10.2011
Сообщений: 235
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'',...}?
0
Техник
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
20.06.2012, 14:03  [ТС] 5
vndtta, хм, я думаю так и нужно) хотя не уверен ...
0
93 / 69 / 22
Регистрация: 17.10.2011
Сообщений: 235
20.06.2012, 14:19 6
Цитата Сообщение от DenProx Посмотреть сообщение
vndtta, хм, я думаю так и нужно) хотя не уверен ...
тогда способа как вернуть расчитанное значение я не знаю
0
Техник
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
20.06.2012, 14:45  [ТС] 7
а если представить в виде y={Y,y,y',y'',...}, тогда получится ?) я бы был рад любому решению данной задачи)
0
93 / 69 / 22
Регистрация: 17.10.2011
Сообщений: 235
20.06.2012, 14:55 8
Цитата Сообщение от vndtta Посмотреть сообщение
тогда способа как вернуть расчитанное значение я не знаю
щас пытался функцию f определить

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

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

как-то не сходится
0
Техник
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
20.06.2012, 14:58  [ТС] 9
да мне тоже показалось оно странным ...
0
93 / 69 / 22
Регистрация: 17.10.2011
Сообщений: 235
20.06.2012, 15:09 10
Цитата Сообщение от DenProx Посмотреть сообщение
а если представить в виде y={Y,y,y',y'',...}, тогда получится ?) я бы был рад любому решению данной задачи)
я вот ни как не могу подогнать под теорию такой формат

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

это вообще окончательный вариант прототипа? или кое-что поменять можно?
0
Техник
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
20.06.2012, 18:20  [ТС] 11
да я думаю можно поменять, преподу главное чтоб работало)
0
93 / 69 / 22
Регистрация: 17.10.2011
Сообщений: 235
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];
}
1
Техник
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
21.06.2012, 08:59  [ТС] 13
Цитата Сообщение от vndtta Посмотреть сообщение
тут мне кажется надо еще добавить количество k в зависимости от m
а k - это что тут получается?
0
93 / 69 / 22
Регистрация: 17.10.2011
Сообщений: 235
21.06.2012, 09:55 14
Цитата Сообщение от DenProx Посмотреть сообщение
а k - это что тут получается?
k это прирост на разбиении, типа y'(x)*delta
0
Техник
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
21.06.2012, 12:44  [ТС] 15
vndtta, хорошо) а данное решение можно считать конечным? или еще есть что то, что требует доработки ?
0
93 / 69 / 22
Регистрация: 17.10.2011
Сообщений: 235
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
0
Техник
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
21.06.2012, 14:40  [ТС] 17
хм... а что делать?)
0
93 / 69 / 22
Регистрация: 17.10.2011
Сообщений: 235
21.06.2012, 16:48 18
Цитата Сообщение от DenProx Посмотреть сообщение
хм... а что делать?)
уточни как-нибудь что за m

ты по-моему еще задание не правильно написал,
мне кажется там не y^3 а y'''
1
Техник
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
21.06.2012, 20:35  [ТС] 19
vndtta, написал как препод дал 1 в 1 хотя наверно он как раз таки и о печатался , или имел ввиду y'''.

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

120366.rar
0
Техник
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
02.07.2012, 12:42  [ТС] 20
помогите кто ни будь доделать программку! пожалуйста!
0
02.07.2012, 12:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.07.2012, 12:42
Помогаю со студенческими работами здесь

Написать программу решения системы двух дифференциальных уравнений методом Рунге-Кутта
Помогите написать программу системы двух дифференциальных уравнений методом Рунге-Кутта по...

Метод Рунге-Кутта 4-порядка для системы дифференциальных уравнений
Есть система дифференциальных уравнений \frac{dM}{d\xi}=\frac{{R}_{1}-2\xi nМ\Pi}{{R}_{2}}\\...

Метод Рунге-Кутта 4-порядка для системы дифференциальных уравнений
Здравствуйте. Помогите мне, пожалуйста. Дана система дифференциальных уравнений и необходимо решить...

Интегрирование дифференциальных уравнений методом Рунге-Кутта
Помогите, пожалуйста, сделать задание : Создайте М-файл метода численного интегрирования...

Решение дифференциальных уравнений четвертого порядка методом Эйлера и методом Рунге-Кутта
Форумчане прошу помочь решить уравнение f :=y+y'*x+y''+y'''*x методами Рунге-Кутта и Эйлера. Если...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru