1 / 1 / 0
Регистрация: 22.10.2012
Сообщений: 42
1

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

29.12.2013, 23:46. Показов 4963. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Решение задачи Коши методом Рунге-Кутта и сравнить результат с 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 минут
наверное выбрал плохое название темы, что даже бояться открывать и думаю, что там просто просят написать программу
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.12.2013, 23:46
Ответы с готовыми решениями:

Решение задачи Коши методом Эйлера и Рунге-Кутты
Доброго времени суток всем:) Писал прогу для решения задачи Коши методом Эйлера и Рунге-Кутты на...

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

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

Решение системы диффуров методом Рунге-Кутта
#include &lt;stdio.h&gt; #include &lt;stdafx.h&gt; #include &lt;math.h&gt; #include &lt;iostream&gt; using namespace...

16
73 / 73 / 1
Регистрация: 02.08.2008
Сообщений: 107
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, справа -- деление).
0
1 / 1 / 0
Регистрация: 22.10.2012
Сообщений: 42
29.12.2013, 23:52  [ТС] 3
int n = ceil((xn-x0)/h) + 2;

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

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

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

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

когда дебажил и смотрел на значения, то 0.0500 = x сразу выдавало 0.003 , пропуская 0,0001, а дальше последовательность соблюдаеться
0
73 / 73 / 1
Регистрация: 02.08.2008
Сообщений: 107
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;
}
Я местами поменял строки.
1
Заблокирован
30.12.2013, 00:27 13
Br8k, как вы в Матлаб проверку делаете?
0
2443 / 1841 / 406
Регистрация: 15.12.2013
Сообщений: 8,237
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 не забыли умножить?
0
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
и значит х нужно увеличть, но почему то так привильно, пускай так и будет)
0
Заблокирован
30.12.2013, 00:44 16
Br8k, как вы делаете проверку в Матлаб?
0
1 / 1 / 0
Регистрация: 22.10.2012
Сообщений: 42
30.12.2013, 01:00  [ТС] 17
решаю задачу Коши в матлабе, там код строк 5.
0
30.12.2013, 01:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.12.2013, 01:00
Помогаю со студенческими работами здесь

Решение уравнений методами Рунге-Кутта и Эйлера
Решить уравнение при помощи методов Эйлера и Рунге Кутта, описывающее смещение x электрона в атоме...

Численно решить ОДУ методом Рунге-Кутта 4 порядка
Доброго времени суток. Мне нужно численно решить ОДУ методом Рунге-Кутта 4 порядка. Уравнение имеет...

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru