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

Метод Рунге-Кутта - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
ruster
0 / 0 / 0
Регистрация: 20.10.2013
Сообщений: 4
25.10.2013, 13:00     Метод Рунге-Кутта #1
Помогите написать метод Рунге Кутта для решение систем диф. уравнений из 4 уравнений.
dx/dt=Px=f1(t,x,y,Px,Py)
dy/dt=Py=f2(t,x,y,Px,Py)
dPx/dt=-(w^2)*x-2axy=f3(t,x,y,Px,Py)
dPy/dt=-(w^2)*y-ax^2+by^2=f4(t,x,y,Px,Py)

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
void Rugge_Kutte2(double h,double &Xo,double &Yo,double &PXo,double &PYo,double a,double b)
{
//вместо t везде нули, так как в f1,f2,f3,f4 оно не на что не влияет
    k11=h*f1(0,Xo,Yo,PXo,PYo,a,b);
    k21=h*f2(0,Xo,Yo,PXo,PYo,a,b);
    k31=h*f3(0,Xo,Yo,PXo,PYo,a,b);
    k41=h*f4(0,Xo,Yo,PXo,PYo,a,b);
 
    k12=h*f1(0,Xo+h/2,Yo+k21/2,PXo+k31/2,PYo+k41/2,a,b);
    k22=h*f2(0,Xo+h/2,Yo+k21/2,PXo+k31/2,PYo+k41/2,a,b);
    k32=h*f3(0,Xo+h/2,Yo+k21/2,PXo+k31/2,PYo+k41/2,a,b);
    k42=h*f4(0,Xo+h/2,Yo+k21/2,PXo+k31/2,PYo+k41/2,a,b);
 
    k13=h*f1(0,Xo+h/2,Yo+k22/2,PXo+k32/2,PYo+k42/2,a,b);
    k23=h*f2(0,Xo+h/2,Yo+k22/2,PXo+k32/2,PYo+k42/2,a,b);
    k33=h*f3(0,Xo+h/2,Yo+k22/2,PXo+k32/2,PYo+k42/2,a,b);
    k43=h*f4(0,Xo+h/2,Yo+k22/2,PXo+k32/2,PYo+k42/2,a,b);
 
    k14=h*f1(0,Xo+h/2,Yo+k23,PXo+k33,PYo+k43,a,b);
    k24=h*f2(0,Xo+h/2,Yo+k23,PXo+k33,PYo+k43,a,b);
    k34=h*f3(0,Xo+h/2,Yo+k23,PXo+k33,PYo+k43,a,b);
    k44=h*f4(0,Xo+h/2,Yo+k23,PXo+k33,PYo+k43,a,b);
    
    Xo=Xo+(k11+2*k12+2*k13+k14)/6;
    Yo=Yo+(k31+2*k32+2*k33+k34)/6;
    PXo=PXo+(k21+2*k22+2*k23+k24)/6;
    PYo=PYo+(k41+2*k42+2*k43+k44)/6;
 
}
Он почему то работает неправильно
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.10.2013, 13:00     Метод Рунге-Кутта
Посмотрите здесь:

Метод Рунге-Кутта. C++
метод Рунге-Кутта C++
C++ Метод Рунге-Кутта 4-го порядка
C++ ДУ. Метод Рунге-Кутта. Погрешность.
метод Рунге-Кутта C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5954 / 5559 / 1788
Регистрация: 18.12.2011
Сообщений: 14,207
Завершенные тесты: 1
25.10.2013, 13:20     Метод Рунге-Кутта #2
Как раз t убирать нельзя, его надо передать как ссылочный параметр функции .
Ваша функция для текущего t будет вычислять значения в точке t+h.
ruster
0 / 0 / 0
Регистрация: 20.10.2013
Сообщений: 4
25.10.2013, 13:26  [ТС]     Метод Рунге-Кутта #3
Цитата Сообщение от zss Посмотреть сообщение
Как раз t убирать нельзя, его надо передать как ссылочный параметр функции .
Ваша функция для текущего t будет вычислять значения в точке t+h.
Так сами функции не зависят от t , так что если я вместо 0, напишу t+h/2, то для данного случая ничего не ихменятся, так как в уравнений нет параметра t
zss
Модератор
Эксперт С++
 Аватар для zss
5954 / 5559 / 1788
Регистрация: 18.12.2011
Сообщений: 14,207
Завершенные тесты: 1
25.10.2013, 13:32     Метод Рунге-Кутта #4
Функции не зависят. Но решение в целом зависит.

Добавлено через 3 минуты
В принципе, можете не передавать.
Но тогда в вызывающей программе организуйте цикл по t
от нуля до желаемого конечного с шагом h
ruster
0 / 0 / 0
Регистрация: 20.10.2013
Сообщений: 4
25.10.2013, 14:26  [ТС]     Метод Рунге-Кутта #5
Цитата Сообщение от zss Посмотреть сообщение
Функции не зависят. Но решение в целом зависит.

Добавлено через 3 минуты
В принципе, можете не передавать.
Но тогда в вызывающей программе организуйте цикл по t
от нуля до желаемого конечного с шагом h
Да я так и делаю, но что то результат неправильный, ну может в чем то другом ошибка, в чем не пойму,
Но спасибо за ответы)
Yandex
Объявления
25.10.2013, 14:26     Метод Рунге-Кутта
Ответ Создать тему
Опции темы

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