Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.62
DenProx
Техник
310 / 168 / 5
Регистрация: 09.10.2009
Сообщений: 3,057
#1

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

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

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

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

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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.06.2012, 08:27
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Функция для численного интегрирования системы дифференциальных уравнений методом Рунге - Кутта (C++):

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

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

Метод Рунге-Кутта для системы уравнений - C++
Написал метод рунге-кутта для динамо риккитаке, но проблема в том, что данные мне формулы не зависят от (т) и я не знаю куда ставить шаг,...

Метод Рунге-Кутта для системы из 5 уравнений - C++
Нужно написать программу для решения системы дифуров. Задано 5 уравнений, необходимо вывести таблицу значений х1...х5 в зависимости от t....

Решение системы диффуров методом Рунге-Кутта - C++
#include <stdio.h> #include <stdafx.h> #include <math.h> #include <iostream> using namespace std; double f(int i,double...

Решение системы дифференциальных уравнений методом Эйлера - C++
В интернете нашел похожий код, но для 1 уравнения, может кто помочь сделать для 2? Тоесть для системы #include "stdafx.h" ...

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

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

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

как-то не сходится
0
DenProx
Техник
310 / 168 / 5
Регистрация: 09.10.2009
Сообщений: 3,057
20.06.2012, 14:58  [ТС] #9
да мне тоже показалось оно странным ...
0
vndtta
90 / 67 / 13
Регистрация: 17.10.2011
Сообщений: 235
Завершенные тесты: 1
20.06.2012, 15:09 #10
Цитата Сообщение от DenProx Посмотреть сообщение
а если представить в виде y={Y,y,y',y'',...}, тогда получится ?) я бы был рад любому решению данной задачи)
я вот ни как не могу подогнать под теорию такой формат

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

это вообще окончательный вариант прототипа? или кое-что поменять можно?
0
DenProx
Техник
310 / 168 / 5
Регистрация: 09.10.2009
Сообщений: 3,057
20.06.2012, 18:20  [ТС] #11
да я думаю можно поменять, преподу главное чтоб работало)
0
vndtta
90 / 67 / 13
Регистрация: 17.10.2011
Сообщений: 235
Завершенные тесты: 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];
}
1
DenProx
Техник
310 / 168 / 5
Регистрация: 09.10.2009
Сообщений: 3,057
21.06.2012, 08:59  [ТС] #13
Цитата Сообщение от vndtta Посмотреть сообщение
тут мне кажется надо еще добавить количество k в зависимости от m
а k - это что тут получается?
0
vndtta
90 / 67 / 13
Регистрация: 17.10.2011
Сообщений: 235
Завершенные тесты: 1
21.06.2012, 09:55 #14
Цитата Сообщение от DenProx Посмотреть сообщение
а k - это что тут получается?
k это прирост на разбиении, типа y'(x)*delta
0
DenProx
Техник
310 / 168 / 5
Регистрация: 09.10.2009
Сообщений: 3,057
21.06.2012, 12:44  [ТС] #15
vndtta, хорошо) а данное решение можно считать конечным? или еще есть что то, что требует доработки ?
0
21.06.2012, 12:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.06.2012, 12:44
Привет! Вот еще темы с ответами:

Численное интегрирование системы дифференциальных уравнений методом Адамса - C++
как перевести код из С в С++ код на решение численного интегрирования системы дифференциальных уравнений методом Адамса. #include...

Программа для численного интегрирования с различными методами интегрирования - C++
программа для численного интегрирования с различными методами интегрирования с использованием пользовательских функций C ++. 2 sin...

Метод Рунге Кутты для системы уравнений - C++
Добрый день! Столкнулся с проблемой, при решении задачи, а именно : Реализовать решение системы оду с количеством уравнений N,...

Какое условие поставить на выходе из цикла в методе Рунге Кутта 4 порядка для системы ДУ 1 порядка? - C++
Пока имеется вот такой код для решения системы ДУ 1 порядка, если имеется ошибка исправьте пожалуйста, Вопрос: как мне получить ответ, мне...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.