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

Решение задачи Коши методом Рунге-Кутта - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
Br8k
1 / 1 / 0
Регистрация: 22.10.2012
Сообщений: 42
29.12.2013, 23:46     Решение задачи Коши методом Рунге-Кутта #1
Решение задачи Коши методом Рунге-Кутта и сравнить результат с MATLAB

не могу найти ошибку, работает практически исправно, только где то небольшая ошибка.


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
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
 
double foo(double x, double y)
{
    return x*x;
}
 
double kuttStep (double x, double y, double h)
{
    double K1 = h*foo (x, y);
    double K2 = h*foo (x + h / 2.0, y + K1 / 2.0);
    double K3 = h*foo (x + h / 2.0, y + K2 / 2.0);
    double K4 = h*foo (x + h, y + K3);
    return y +  (K1 + 2.0 * K2 + 2.0 * K3 + K4) / 6.0;
}
 
 
 
int main()
{
    double x0 = 0.0;
    double y0 = 0.0; 
    double xn = 1.0;
    double h;
    
    cout << "h= ";
    cin >> h;
    int n = ceil((xn-x0)/h) + 2;
    
    double** arr = new double* [n];
    for (int i = 0; i < n; ++i){
        arr[i] = new double [2];
    }
 
    double x = x0;
    double y = y0;
    double y_ = 0.0;
    arr[0][0] = x;
    arr[0][1] = y;
    
    for (int i = 1; i < n; ++i){
        x += h;
        y = kuttStep (x, y, h);
        arr[i][0] = x;
        arr[i][1] = y;
    }
    
    cout << "Kutt:" << endl;
    for(int i = 0; i < n; ++i){
        cout << fixed << setprecision(4) << arr[i][0] << "\t" << fixed << setprecision(4) << arr[i][1] << endl;
    }
    return 0;
}
результат программы:
Кликните здесь для просмотра всего текста

0 0
0.0250 0.0000
0.0500 0.0001
0.0750 0.0003
0.1000 0.0007
0.1250 0.0011
0.1500 0.0018
0.1750 0.0027
0.2000 0.0038
0.2250 0.0052
0.2500 0.0069
0.2750 0.0090
0.3000 0.0114
0.3250 0.0143
0.3500 0.0176
0.3750 0.0213
0.4000 0.0256
0.4250 0.0304
0.4500 0.0357
0.4750 0.0417
0.5000 0.0482
0.5250 0.0555
0.5500 0.0634
0.5750 0.0720
0.6000 0.0814
0.6250 0.0915
0.6500 0.1025
0.6750 0.1143
0.7000 0.1270
0.7250 0.1406
0.7500 0.1552
0.7750 0.1707
0.8000 0.1872
0.8250 0.2047
0.8500 0.2233
0.8750 0.2430
0.9000 0.2638
0.9250 0.2858
0.9500 0.3090
0.9750 0.3333
1.0000 число


результат MATLAB:
Кликните здесь для просмотра всего текста
0 0
0.0250 0.0000
0.0500 0.0000
0.0750 0.0001
0.1000 0.0003
0.1250 0.0007
0.1500 0.0011
0.1750 0.0018
0.2000 0.0027
0.2250 0.0038
0.2500 0.0052
0.2750 0.0069
0.3000 0.0090
0.3250 0.0114
0.3500 0.0143
0.3750 0.0176
0.4000 0.0213
0.4250 0.0256
0.4500 0.0304
0.4750 0.0357
0.5000 0.0417
0.5250 0.0482
0.5500 0.0555
0.5750 0.0634
0.6000 0.0720
0.6250 0.0814
0.6500 0.0915
0.6750 0.1025
0.7000 0.1143
0.7250 0.1270
0.7500 0.1406
0.7750 0.1552
0.8000 0.1707
0.8250 0.1872
0.8500 0.2047
0.8750 0.2233
0.9000 0.2430
0.9250 0.2638
0.9500 0.2858
0.9750 0.3090
1.0000 0.3333


суть в том, что глупо говоря правый столбик смещён на 1ну позицию вверх, что видно из результатов.

Добавлено через 13 минут
наверное выбрал плохое название темы, что даже бояться открывать и думаю, что там просто просят написать программу
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
yogurt
 Аватар для yogurt
58 / 58 / 1
Регистрация: 02.08.2008
Сообщений: 106
29.12.2013, 23:47     Решение задачи Коши методом Рунге-Кутта #2
Я, может быть, немного Вас удивлю, но у меня это программа выдаёт результат, который Вы назвали "результат MATLAB". Я взял h=0.025.
Кликните здесь для просмотра всего текста
h= 0.025
Kutt:
0.0000 0.0000
0.0250 0.0000
0.0500 0.0001
0.0750 0.0003
0.1000 0.0006
0.1250 0.0011
0.1500 0.0018
0.1750 0.0027
0.2000 0.0038
0.2250 0.0052
0.2500 0.0069
0.2750 0.0090
0.3000 0.0114
0.3250 0.0143
0.3500 0.0176
0.3750 0.0213
0.4000 0.0256
0.4250 0.0304
0.4500 0.0357
0.4750 0.0417
0.5000 0.0482
0.5250 0.0555
0.5500 0.0634
0.5750 0.0720
0.6000 0.0814
0.6250 0.0915
0.6500 0.1025
0.6750 0.1143
0.7000 0.1270
0.7250 0.1406
0.7500 0.1552
0.7750 0.1707
0.8000 0.1872
0.8250 0.2047
0.8500 0.2233
0.8750 0.2430
0.9000 0.2638
0.9250 0.2858
0.9500 0.3089
0.9750 0.3333
1.0000 0.3590
1.0250 0.3859
Для продолжения нажмите любую клавишу . . .

При этом, значения немного другие в некоторых местах.
Каюсь, не вдумывался в текст программы, то в строке, где определяется переменная n, компилятор не без основательно предупреждает, что возможна потеря значения (слева -- int, справа -- деление).
Br8k
1 / 1 / 0
Регистрация: 22.10.2012
Сообщений: 42
29.12.2013, 23:52  [ТС]     Решение задачи Коши методом Рунге-Кутта #3
int n = ceil((xn-x0)/h) + 2;

слева дабл, справа дабл, преборазование и +2

если таблицу вы скопировали у меня то или ошиблись таблицей и тогда у вас работает правильно а уменя нет или же все же просто не заметили что ошибка осталась.
yogurt
 Аватар для yogurt
58 / 58 / 1
Регистрация: 02.08.2008
Сообщений: 106
29.12.2013, 23:57     Решение задачи Коши методом Рунге-Кутта #4
Я скопировал текст программы и запустил её. Данные скопировал из своей консольки при h=0.025.
Br8k
1 / 1 / 0
Регистрация: 22.10.2012
Сообщений: 42
29.12.2013, 23:59  [ТС]     Решение задачи Коши методом Рунге-Кутта #5
интересно, сейчас проверю на другом компьютере

ps как копировать из консоли текст если не секрет?)
yogurt
 Аватар для yogurt
58 / 58 / 1
Регистрация: 02.08.2008
Сообщений: 106
30.12.2013, 00:04     Решение задачи Коши методом Рунге-Кутта #6
Тыкнуть по заголовку правой кнопкой --> Изменить -- > Выделить всё; опять правой кнопкой -- > Изменить --> Копировать
Br8k
1 / 1 / 0
Регистрация: 22.10.2012
Сообщений: 42
30.12.2013, 00:07  [ТС]     Решение задачи Коши методом Рунге-Кутта #7
раз это текст с консоли -> ошибка все ешё на месте
и бо он как раз совпадает с ошибочным кодом
yogurt
 Аватар для yogurt
58 / 58 / 1
Регистрация: 02.08.2008
Сообщений: 106
30.12.2013, 00:10     Решение задачи Коши методом Рунге-Кутта #8
Не понял. А как узнать, что программа выполнилась не правильно? Результат же совпадает с матлабовским. Надо, чтобы кто-то ещё его запустил у себя на компе. Какое значение h задается?
Br8k
1 / 1 / 0
Регистрация: 22.10.2012
Сообщений: 42
30.12.2013, 00:12  [ТС]     Решение задачи Коши методом Рунге-Кутта #9
h - интервал 0.0250

внимательней посмотрите на первые 4ре значения из таблици матлаб которые я скинул и поймёте
yogurt
 Аватар для yogurt
58 / 58 / 1
Регистрация: 02.08.2008
Сообщений: 106
30.12.2013, 00:15     Решение задачи Коши методом Рунге-Кутта #10
Едрить мадрить. Туплю жутко.
Br8k
1 / 1 / 0
Регистрация: 22.10.2012
Сообщений: 42
30.12.2013, 00:17  [ТС]     Решение задачи Коши методом Рунге-Кутта #11
и все же вопрос актуален

когда дебажил и смотрел на значения, то 0.0500 = x сразу выдавало 0.003 , пропуская 0,0001, а дальше последовательность соблюдаеться
yogurt
 Аватар для yogurt
58 / 58 / 1
Регистрация: 02.08.2008
Сообщений: 106
30.12.2013, 00:25     Решение задачи Коши методом Рунге-Кутта #12
А если так:
Код
for (int i = 1; i < n; ++i){
	y = kuttStep(x, y, h);
	x += h;
	arr[i][0] = x;
	arr[i][1] = y;
}
Я местами поменял строки.
Ev_Hyper
 Аватар для Ev_Hyper
1806 / 1627 / 435
Регистрация: 15.12.2013
Сообщений: 5,779
30.12.2013, 00:27     Решение задачи Коши методом Рунге-Кутта #13
Br8k, как вы в Матлаб проверку делаете?
S_el
1906 / 1501 / 295
Регистрация: 15.12.2013
Сообщений: 5,915
30.12.2013, 00:34     Решение задачи Коши методом Рунге-Кутта #14
C++
1
2
3
    double K2 = h*foo (x + h / 2.0, y + K1 / 2.0);
    double K3 = h*foo (x + h / 2.0, y + K2 / 2.0);
    double K4 = h*foo (x + h, y + K3);
А приращение по y на h не забыли умножить?
Br8k
1 / 1 / 0
Регистрация: 22.10.2012
Сообщений: 42
30.12.2013, 00:38  [ТС]     Решение задачи Коши методом Рунге-Кутта #15
Цитата Сообщение от yogurt Посмотреть сообщение
А если так:
Код
for (int i = 1; i < n; ++i){
	y = kuttStep(x, y, h);
	x += h;
	arr[i][0] = x;
	arr[i][1] = y;
}
Я местами поменял строки.
вот тут уже я затупил, помуто не подума про последовательность вычеслней, спасибо.

Добавлено через 3 минуты
хотя по логике почему так не пойму, хоть и правильно
ведь в точке x0 мы уже вычислили , ибо вначале x=x0
и значит х нужно увеличть, но почему то так привильно, пускай так и будет)
Ev_Hyper
 Аватар для Ev_Hyper
1806 / 1627 / 435
Регистрация: 15.12.2013
Сообщений: 5,779
30.12.2013, 00:44     Решение задачи Коши методом Рунге-Кутта #16
Br8k, как вы делаете проверку в Матлаб?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.12.2013, 01:00     Решение задачи Коши методом Рунге-Кутта
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Br8k
1 / 1 / 0
Регистрация: 22.10.2012
Сообщений: 42
30.12.2013, 01:00  [ТС]     Решение задачи Коши методом Рунге-Кутта #17
решаю задачу Коши в матлабе, там код строк 5.
Yandex
Объявления
30.12.2013, 01:00     Решение задачи Коши методом Рунге-Кутта
Ответ Создать тему
Опции темы

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