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

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

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

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

15.03.2008, 14:16. Просмотров 12360. Ответов 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++ Решение задачи Коши методом Рунге-Кутта
Функция для численного интегрирования системы дифференциальных уравнений методом Рунге - Кутта C++
C++ Метод Рунге-Кутта для системы уравнений
C++ Метод Рунге-Кутта для системы из 5 уравнений
C++ Численно решить ОДУ методом Рунге-Кутта 4 порядка
Решение обычных деференциальных уравнений методами Ейлера, Рунге-Кутта C++
Метод Рунге-Кутта 4 порядка для решения системы дифференциальных уравнений C++
C++ Какое условие поставить на выходе из цикла в методе Рунге Кутта 4 порядка для системы ДУ 1 порядка?
Решение задачи Коши методом Эйлера и Рунге-Кутты C++
C++ Решение диф. уравнения для колебаний методом Рунге—Кутты 4го порядка.(С++)

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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.
Yandex
Объявления
17.03.2008, 19:06     Решение системы диффуров методом Рунге-Кутта
Ответ Создать тему
Опции темы

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