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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 93, средняя оценка - 4.71
getbraine
Сообщений: n/a
#1

Решение системы диффуров методом Рунге-Кутта - C++

15.03.2008, 14:16. Просмотров 12698. Ответов 1
Метки нет (Все метки)

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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include <stdio.h>
#include <stdafx.h>
#include <math.h>
#include <iostream>
 
using namespace std;
double f(int i,double x,double y[4]){
    switch (i){
        case 1:return y[4];break;
        case 2: return y[1];break;
        case 3:return y[2];break;
        case 4:return y[3];break;
        default : break;
    }
}
/*************************************************************************
Один шаг метода Рунге-Кутта четвертого порядка для решения
системы дифферециальных уравнений.
 
procedure SystemRungeKuttStep(
    const   x   :   Real;
    const   h   :   Real;
    const   n   :   Integer;
    var     y   :   array of Real);
 
Алгоритм совершает один шаг метода для системы
диффуров y[i]'=F(i,x,y) для i=1..n
 
Начальная точка имеет кординаты (x,y[1], ..., y[n])
 
После выполнения алгоритма в переменной y содержится состояние
системы в точке x+h
*************************************************************************/
void step(double x,double h,int n,double y[4])
{
    int i=0;
    double yt[4];
    double k1[4];
    double k2[4];
    double k3[4];
    double k4[4];
 
    for(i = 1; i <= n; i++)
    {
        k1[i] = h*f(i, x, y);
    }
    for(i = 1; i <= n; i++)
    {
        yt[i] = y[i]+0.5*k1[i];
    }
    for(i = 1; i <= n; i++)
    {
        k2[i] = h*f(i, x+h*0.5, yt);
    }
    for(i = 1; i <= n; i++)
    {
        yt[i] = y[i]+0.5*k2[i];
    }
    for(i = 1; i <= n; i++)
    {
        k3[i] = h*f(i, x+h*0.5, yt);
    }
    for(i = 1; i <= n; i++)
    {
        yt[i] = y[i]+k3[i];
    }
    for(i = 1; i <= n; i++)
    {
        k4[i] = h*f(i, x+h, yt);
    }
    for(i = 1; i <= n; i++)
    {
        y[i] = y[i]+(k1[i]+2.0*k2[i]+2.0*k3[i]+k4[i])/6;
    }
}
/*************************************************************************
Алгоритм решает систему диффуров y[i]'=F(i,x,y) для i=1..n
методом Рунге-Кутта 4 порядка.
 
Начальная точка имеет кординаты (x,y[1], ..., y[n])
 
До конечной точки мы добираемся через n промежуточных
с постоянным шагом h=(x1-x)/m
 
Результат помещается в переменную result[4]
*************************************************************************/
void solvesystemrungekutta(double x,double x1,int steps,double result[4]){
    
    for(int i = 1; i <= steps-1; i++)
    {
        step(x+i*(x1-x)/steps, (x1-x)/steps,4, result);
    }
}
 
int _tmain(){
    //первая координата 
    double temporaryresult[4];
    solvesystemrungekutta(2,3,3,temporaryresult);
    for(int i=1;i<=4;i++){
        printf("Htpekmnf",temporaryresult[i],'\n');
    }
    char c=getchar();
    return 0;
}
подскажите как приспособить этот алгоритм для решения системы диффуров
d2_x/dt_2=-GMx/(x^2+y^2)^(3/2)
d2_y/dy_2=-GMy/(x^2+y^2)^(3/2)
?
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.03.2008, 14:16
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Решение системы диффуров методом Рунге-Кутта (C++):

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

Решение дифференциального уравнения методом Рунге-Кутта - C++
решить уравнение v'=u/m*m'. обе производные меняются по времени масса уменьшается, а скорость увеличивается, u=const

Решение задачи Коши методом Рунге-Кутта - C++
Решение задачи Коши методом Рунге-Кутта и сравнить результат с MATLAB не могу найти ошибку, работает практически исправно, только где...

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

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

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

1
Phoeni}{
0 / 0 / 0
Регистрация: 11.03.2008
Сообщений: 4
17.03.2008, 19:06 #2
Насколько я помню из теории численного решения дифференциальных уравнений для решения системы методом Рунге-Кутта необходимо представить систему в форме Коши, т.е. в левой части производные должны иметь первый порядок.
dx1/dt = f1(x1,x2,x3)
dx2/dt = f2(x1,x2,x3)
dx3/dt = f3(x1,x2,x3)

В вашем случае необходимо произвести подстановку
dx/dt = z, тогда dz/dt = d2_x/dt_2
dy/dt = l, соответственно dl/dt = d2_y/dt_2
Далее все решается стандартным алгоритмом.
Совет попробуйте для начала в MathCade.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.03.2008, 19:06
Привет! Вот еще темы с ответами:

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

Численно решить ОДУ методом Рунге-Кутта 4 порядка - C++
Доброго времени суток. Мне нужно численно решить ОДУ методом Рунге-Кутта 4 порядка. Уравнение имеет вид: p'=-A-B*p, p(0)=p0. Проблема...

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

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


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

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

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