Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Monna
0 / 0 / 2
Регистрация: 12.06.2015
Сообщений: 10
#1

Метод Рунге Кутты для системы уравнений - C++

17.05.2016, 05:07. Просмотров 855. Ответов 1
Метки нет (Все метки)

Добрый день!

Столкнулся с проблемой, при решении задачи, а именно :

http://www.cyberforum.ru/cpp-beginners/thread1536720.html
Реализовать решение системы оду с количеством уравнений N, где N можно изменять методом Рунге Кутты 4 порядка.

Есть решение для системы из 2х уравнений :

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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#include "conio.h"
#include "cstdlib"
#include <ctime>
#include < stdio.h >
#include <omp.h>
 
const int N = 1000;
double f1(double *Y0, double *Y, int n)
{
    double yR = 0;
    for (int i = 0; i < n; i++)
    {
        yR += Y0[i] * Y[i];
    }
    return yR;
}
 
double f2(double *Y0, double *Y, int n, double *KN)
{
    double yR = 0;
    for (int i = 0; i < n; i++)
    {
        yR += Y[i] * (Y0[i] + KN[i] / 2);
    }
    return yR;
}
 
double f3(double *Y0, double *Y, int n, double *KN)
{
    double yR = 0;
    for (int i = 0; i < n; i++)
    {
        yR += Y[i] * (Y0[i] + KN[i]);
    }
    return yR;
}
 
double fresult(double Y0, double K1, double K2, double K3, double K4, int n)
{
    double yR;
    yR = Y0 + (K1 + K2 * 2 + K3 * 2 + K4) / 6;
    return yR;
}
 
void randY(double **Y, int n)
{
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            Y[i][j] = rand() % 10;
        }
    }
}
 
void randY0(double *Y, int n)
{
    for (int i = 0; i < n; i++)
    {
        Y[i] = (rand() % 10)*0.1;
    }
}
 
int main()
{
    srand(time(0));
    double start_time;
    double end_time;
    double search_time = 0;
    start_time = omp_get_wtime();
    double *K1, *K2, *K3, *K4;
    double result;
    double dt = 0.01;
    double tS = 0;
    double *Y0;
    double **YR;
    double **Y;
    Y0 = new double[N];
    YR = new double*[101];
    Y = new double*[N];
    for (int i = 0; i < N; i++)
    {
        Y[i] = new double[N];
    }
    for (int i = 0; i < 101; i++)
    {
        YR[i] = new double[N];
    }
    K1 = new double[N];
    K2 = new double[N];
    K3 = new double[N];
    K4 = new double[N];
    randY(Y, N);
    randY0(Y0, N);
 
    YR[0] = Y0;
 
    for (int j = 0; j < 100; j++)
    {
 
        for (int i = 0; i < N; i++)
        {
            K1[i] = dt* f1(YR[j], Y[i], N);
        }
 
        for (int i = 0; i < N; i++)
        {
            K2[i] = dt* f2(YR[j], Y[i], N, K1);
        }
 
 
        for (int i = 0; i < N; i++)
        {
            K3[i] = dt* f2(YR[j], Y[i], N, K2);
        }
 
 
        for (int i = 0; i < N; i++)
        {
            K4[i] = dt* f2(YR[j], Y[i], N, K3);
        }
 
 
        for (int i = 0; i < N; i++)
        {
            YR[j + 1][i] = fresult(YR[j][i], K1[i], K2[i], K3[i], K4[i], N);
        }
    }
    end_time = omp_get_wtime();
    search_time = end_time - start_time; // искомое время
    printf("runtime: %.3f \n", search_time);
 
    YR = nullptr;
    delete YR;
    Y = nullptr;
    delete Y;
    Y0 = nullptr;
    delete Y0;
    _getch();
    return 0;
}
Подскажите, как можно изменить код, что бы получить решение нужной мне задачи.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.05.2016, 05:07
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Метод Рунге Кутты для системы уравнений (C++):

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

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

Метод Рунге-Кутты
Доброго времени суток. Сразу говорю,извините за мою наглость. Дело в том,что...

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

Исправить код в методе рунге кутты 4 порядка ля системы ДУ 1 порядка
Вот код для метода рунге кутты 4 порядка для систему ДУ 1 порядка. Вроде все...

1
AlexVRud
477 / 189 / 72
Регистрация: 04.07.2014
Сообщений: 527
17.05.2016, 09:31 #2
Monna, Это и есть решение вашей задачи.
Но наличие #include <omp.h> вызывает подозрение, что этот код был ориентирован для технологии OpenMP.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.05.2016, 09:31
Привет! Вот еще темы с решениями:

Метод Ньютона для системы двух уравнений
Здравствуйте! помогите, пожалуйста, чайнику от программирования написать код)...

Решение диф. уравнения для колебаний методом Рунге—Кутты 4го порядка.(С++)
Ребят помогите пожалуйста решить такое на C++ уравнение x''=(-w^2)*x где...

Метод Ньютона для решения системы нелинейных уравнений
Программа работает неверно. Пожалуйста, помогите найти ошибки. Спасибо. ...

Метод Ньютона для решения системы нелинейных уравнений
Здравствуйте! Нужно решить методом Ньютона систему уравнений с точностью...


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

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

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