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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.77
GODofART
2 / 2 / 0
Регистрация: 19.11.2011
Сообщений: 52
#1

Автоматический выбор шага и метод Рунге-Кутта - C++

13.06.2014, 00:11. Просмотров 3757. Ответов 8
Метки нет (Все метки)

Имеется такое вычисление диф. уравнения методом Рунге-Кутты:
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
#include <iostream>
using namespace std;
float fun(float x, float y)
{
    return x*x + y*y;
}
 
void run_kut(float a, float b, float y0, int n)
{
    float x, y, x1, y1, h, k1, k2, k3, k4;
    x = a;
    y = y0;
    h = (b - a) / n;
    for (int i = 0; i<n; i++)
    {
        k1 = h*fun(x, y);
        x1 = x + h / 2;
        y1 = y + k1 / 2;
        k2 = h*fun(x1, y1);
        y1 = y + k2 / 2;
        k3 = h*fun(x1, y1);
        x += h;
        y1 = y + k3;
        k4 = h*fun(x, y1);
        y += (k1 + 2 * k2 + 2 * k3 + k4) / 6;
        cout << "x[" << i + 1 << "]=" << x << "\t" << "y[" << i + 1 << "]=" << y << "\n";
    }
}
void main()
{
    setlocale(LC_ALL, "Russian");
    int n;
    float a, b, y0;
    system("Cls");
    cout << "Ведите начало a="; cin >> a;
    cout << "Ведите конец b="; cin >> b;
    cout << "Ведите начальное положение y0="; cin >> y0;
    cout << "Ведите число разбиений n="; cin >> n;
    cout << "\nМетод Рунге-Кутты:\n";
    run_kut(a, b, y0, n);
    cout << "\n";
    system("pause");
}
Необходимо дописать автоматический выбор шага(n).
Сколько бы не пытался гуглить и разобраться с мат. стороны и со стороны кода - так и не получилось.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.06.2014, 00:11
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Автоматический выбор шага и метод Рунге-Кутта (C++):

Метод Рунге-Кутта - C++
Помогите написать метод Рунге Кутта для решение систем диф. уравнений из 4 уравнений. dx/dt=Px=f1(t,x,y,Px,Py) dy/dt=Py=f2(t,x,y,Px,Py)...

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

Метод Рунге-Кутта - C++
как реализовать программу для уравнения вида dv/dt=const*dm/dt методом рунге-кутта. как именно заменить производную справа

Метод Рунге-Кутта - C++
Нужно решить диффур второго порядка. При решении выводятся нуля. Где я оплошал? #include &lt;math.h&gt; using namespace std; ...

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

Метод Рунге-Кутта. - C++
хотелось бы спросить знающих людей. Мне необходимо решить систему ДУ уравнений методом Рунге_кутта 4 порядка. А значит мне нужно в...

8
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
13.06.2014, 00:26 #2
так Вам надо не кол-во шагов(в Вашем случае n), а приращение или ошибка - (k1 + 2 * k2 + 2 * k3 + k4) / 6; сохрашите переменную и сверяйте ее с неким числом(0.0001 хотя бы так) и кстати у Вас ошибки) "/ 6" целочисленное деление надо "/ 6.", аналогично "/2" замените на "/2."
0
GODofART
2 / 2 / 0
Регистрация: 19.11.2011
Сообщений: 52
22.06.2014, 20:18  [ТС] #3
К сожалению, так и не разобрался с автоматическим выбором шага.
С проверкой не совсем ясно, пример кода бы.
0
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
23.06.2014, 10:46 #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
double g = 1.;
for (int i = 0; i<n, g>0.0001; i++)
    {
        k1 = h*fun(x, y);
        x1 = x + h / 2.;
        y1 = y + k1 / 2.;
        k2 = h*fun(x1, y1);
        y1 = y + k2 / 2.;
        k3 = h*fun(x1, y1);
        x += h;
        y1 = y + k3;
        k4 = h*fun(x, y1);
        g = (k1 + 2 * k2 + 2 * k3 + k4) / 6.;
        y += g;
        cout << "x[" << i + 1 << "]=" << x << "\t" << "y[" << i + 1 << "]=" << y << "\n";
    }
Добавлено через 1 минуту
а нее...это не то

Добавлено через 6 минут
см.тут
Вот тут написано, что данный метод дает такую погрещность O(max hi^2).
max hi у Вас будет просто h(потому что шаг у Вас постоянный), следовательно надо задать точность решения, например e = 0.001

Добавлено через 1 минуту
получаем h^2 = e
h = sqrt(e);
и h = (b - a) / n;
решаем систему пролучаем
n = (b-a)/sqrt(e); параметры a,b,e задаем с клавиатуры

Добавлено через 3 минуты
чет где как написано, например, тут написано, что погрешность h^4, ну поищите на просторах инета точное значение погрешности и вычислите N как я предложил

Добавлено через 2 минуты
хотя да википедия тоже говорит про h^4
тогда е = h^4;
h = e^1/4;
n = (b-a)/e^1/4
1
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
23.06.2014, 10:48 #5
Цитата Сообщение от aLarman Посмотреть сообщение
и кстати у Вас ошибки) "/ 6" целочисленное деление надо "/ 6.", аналогично "/2" замените на "/2."
Делимое в данном случае типа float. Компилятор сам превращает делитель в float.
0
zss
Модератор
Эксперт С++
6406 / 5972 / 1945
Регистрация: 18.12.2011
Сообщений: 15,402
Завершенные тесты: 1
23.06.2014, 12:21 #6
Цитата Сообщение от aLarman Посмотреть сообщение
i<n, g>0.0001
C++
1
i<n && g>0.0001
0
aLarman
23.06.2014, 13:39
  #7

Не по теме:

Nekto, zss, какие молодцы

0
GODofART
2 / 2 / 0
Регистрация: 19.11.2011
Сообщений: 52
24.06.2014, 00:15  [ТС] #8
aLarman, Можно окончательный вариант кодом? На самом деле так и не понял.
0
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
24.06.2014, 09:04 #9
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
#include <iostream>
using namespace std;
float fun(float x, float y)
{
    return x*x + y*y;
}
 
void run_kut(float a, float b, float y0, int n)
{
    float x, y, x1, y1, h, k1, k2, k3, k4;
    x = a;
    y = y0;
    h = (b - a) / n;
    for (int i = 0; i<n; i++)
    {
        k1 = h*fun(x, y);
        x1 = x + h / 2.;
        y1 = y + k1 / 2.;
        k2 = h*fun(x1, y1);
        y1 = y + k2 / 2.;
        k3 = h*fun(x1, y1);
        x += h;
        y1 = y + k3;
        k4 = h*fun(x, y1);
        y += (k1 + 2. * k2 + 2. * k3 + k4) / 6.;
        cout << "x[" << i + 1 << "]=" << x << "\t" << "y[" << i + 1 << "]=" << y << "\n";
    }
}
void main()
{
    setlocale(LC_ALL, "Russian");
    int n;
    float a, b, y0,e;
    system("Cls");
    cout << "Ведите начало a="; cin >> a;
    cout << "Ведите конец b="; cin >> b;
    cout << "Ведите начальное положение y0="; cin >> y0;
    cout << "Ведите точность e="; cin >> e;
    n = (b-a)/pow(e,1./4);//тут конечно лучше приводить к наибольшему целому(в такойм варианте получается приведение к наименьшему целому)
    cout<<"Для заданной точность, количесво разбиений = " << n<<endl;
    cout << "\nМетод Рунге-Кутты:\n";
    run_kut(a, b, y0, n);
    cout << "\n";
    system("pause");
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.06.2014, 09:04
Привет! Вот еще темы с ответами:

метод Рунге-Кутта - C++
Помогите написать программу на хаотичное движение бильярдных шаров методом Рунге-Кутта. При столкновении шары должны отталкиваться, ну и...

Метод рунге-кутта 3 порядка - C++
дана функция d(y(x))/dx=e^x-2y(x) Нач. условия y(0)=e Код#include&lt;stdio.h&gt; #include&lt;conio.h&gt; #include&lt;math.h&gt; float fun(float...

Метод Рунге-Кутта 4-го порядка - C++
Правильно ли я записал выражения для коэффициентов моего уравнения(система Лоренца) #include &lt;math.h&gt; #include &lt;stdlib.h&gt; ...

Метод Рунге-Кутта 4 порядка - C++
Помогите найти ошибку в методе рунге-Кутта 4 порядка System::System(double m, const Vector3D&amp; g, double C, double f, double p, double S,...


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

Или воспользуйтесь поиском по форуму:
9
Yandex
Объявления
24.06.2014, 09:04
Ответ Создать тему
Опции темы

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