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

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

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

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

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

Решение задачи Коши методом Рунге-Кутта и сравнить результат с 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.12.2013, 23:46
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Решение задачи Коши методом Рунге-Кутта (C++):

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

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

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

Решение системы диффуров методом Рунге-Кутта - C++
#include &lt;stdio.h&gt; #include &lt;stdafx.h&gt; #include &lt;math.h&gt; #include &lt;iostream&gt; using namespace std; double f(int i,double...

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

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

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

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

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

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

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

когда дебажил и смотрел на значения, то 0.0500 = x сразу выдавало 0.003 , пропуская 0,0001, а дальше последовательность соблюдаеться
0
yogurt
62 / 62 / 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
Ev_Hyper
Заблокирован
30.12.2013, 00:27 #13
Br8k, как вы в Матлаб проверку делаете?
0
S_el
2113 / 1633 / 308
Регистрация: 15.12.2013
Сообщений: 6,576
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
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
и значит х нужно увеличть, но почему то так привильно, пускай так и будет)
0
30.12.2013, 00:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.12.2013, 00:38
Привет! Вот еще темы с ответами:

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

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

Решение дифуров методами Эйлера-Коши с итерациями и Рунге-Кутты четвертого порядка - C++
решить методами эйлера-коши с итерациями и рунге -куты четвертого порядка диф. уравнение y`+ycosx=e-sinx X e, y(0)=1 h=0.1

Численное решение задачи Коши - C++
Не могу разобрать фрагменты программы: Имеются Класс gridfun: class gridfun { private: double *x;


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

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

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