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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 49, средняя оценка - 4.78
cam_rus
0 / 0 / 0
Регистрация: 05.10.2010
Сообщений: 19
#1

Метод Рунге-Кутта. - C++

13.10.2010, 14:34. Просмотров 6085. Ответов 5
Метки нет (Все метки)

хотелось бы спросить знающих людей.

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

Условно, мне надо каждый раз рассчитывать Vx, Vy, x, y -скорости и координаты.
Первая моя идея такая:
1. НАписать функции рассчета Vx, Vy, x, y; затем, используя их, написать функции, которые рассчитывают коэффициенты Р-К и находят значения на след шаге.
И призывать их в цикле.

2. А можно ли в параметрах функции указывать другую функцию? Тогда можно же написать функции рассчета Vx, Vy, x, y; а функцию Р-К сделать общую для всех, указывая в параметрах что сейчас считаем.

3. Правда ли, что все параметры функции принимают первоначальные значения при выходе из функции.
И если да, то как сделать так, чтобы они изменялись?

4. Нету ли в Си какого-нить модуля, в котором уже написаны функции рассчета Р-К?

Программирую именно на СИ, ибо до С++ еще не дорос
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.10.2010, 14:34     Метод Рунге-Кутта.
Посмотрите здесь:

метод Рунге-Кутта C++
C++ Метод Рунге-Кутта 4-го порядка
C++ ДУ. Метод Рунге-Кутта. Погрешность.
метод Рунге-Кутта C++
Метод Рунге-Кутта C++
C++ Метод Рунге-Кутта
Метод рунге-кутта 3 порядка C++
Метод Рунге-Кутта 2-го порядка C++
Метод Рунге-Кутта C++
Цикл for. Метод Рунге-Кутта C++
Метод Рунге-Кутта C++
C++ Метод Рунге-Кутта 4-го порядка

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fasked
Эксперт C++
4932 / 2512 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
13.10.2010, 14:44     Метод Рунге-Кутта. #2
Цитата Сообщение от cam_rus Посмотреть сообщение
А можно ли в параметрах функции указывать другую функцию?
указатели на функции Вам в помощь.
Цитата Сообщение от cam_rus Посмотреть сообщение
Правда ли, что все параметры функции принимают первоначальные значения при выходе из функции
нет.
Цитата Сообщение от cam_rus Посмотреть сообщение
И если да, то как сделать так, чтобы они изменялись?
Тут вы немного неправильно понимаете суть происходящего. Аргументы, которые принимает функция изменяются в теле самой функции. Если передавать аргументы по значению, то в теле функции будут существовать уже абсолютно другие переменные, следовательно те, которые служили источником никак не смогут измениться.
Чтобы в функции работать именно с той переменной, которая была передана необходимо пользоваться ссылками или указателями. Для Си только указателями.
Цитата Сообщение от cam_rus Посмотреть сообщение
Нету ли в Си какого-нить модуля, в котором уже написаны функции рассчета Р-К?
Нет. Но если погуглите, то можете найти чьи-то готовые решения.
cam_rus
0 / 0 / 0
Регистрация: 05.10.2010
Сообщений: 19
13.10.2010, 16:52  [ТС]     Метод Рунге-Кутта. #3
А не мог бы кто-нить изобразить простенький пример, а то у меня явно ошибка в синтаксесе где-то...

То есть функцию, которую я буду подавать как параметр в другую функцию надо как-то особо описывать?
Или достаточно создать указатель (такого же типа данных, как функция?) и в него присвоить значение функции? Как это сделать-то?
fasked
Эксперт C++
4932 / 2512 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
13.10.2010, 17:30     Метод Рунге-Кутта. #4
Ну самый простой пример в голову пришел на сортировке:
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
#include <stdio.h>
 
int less(int a, int b) {
    return a < b;
}
 
int more(int a, int b) {
    return a > b;
}
 
void sort(int *a, int size, int (*compare)(int, int)) {
    int i = 0;
    int j = 0;
    int t = 0;
 
    for(i = 0; i < size; ++i) {
        for(j = i + 1; j < size; ++j) {
            if(compare(a[j], a[j-1])) {
                t = a[j];
                a[j] = a[j-1];
                a[j-1] = t;
            }
        }
    }
}
 
int main()
{
    int data[] = { 0, 5, 3, 10, 4 };
    int size = sizeof(data) / sizeof(*data);
 
    int i;
 
    printf("data size %d\n", size);
    
    for(i = 0; i < size; ++i)
        printf("%d ", data[i]);
    printf("\n");
 
    sort(data, size, more);
 
    for(i = 0; i < size; ++i)
        printf("%d ", data[i]);
    printf("\n");
 
    return 0;
}
В зависимости от того, какую функцию указать для сортировки будет различный результат.
Синтаксис указателей на функции довольно труден для понимания. И если создавать указатели на сложные функции, то можно и запутаться. Здесь удобно применять typedef.

C
1
typedef int (*fcmp_t)(int, int);
C
1
void sort(int *a, int size, fcmp_t compare) {
Можете почитать еще вот здесь про указатели http://www.cyberguru.ru/programming/...p2-page67.html
cam_rus
0 / 0 / 0
Регистрация: 05.10.2010
Сообщений: 19
13.10.2010, 23:17  [ТС]     Метод Рунге-Кутта. #5
Блин, я не все понял. Я вот как пытаюсь написать:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
double Runge (double (*compare)(double Vk, double t, double teta, double y, double Wx, int rejim))
{
    double k1, k2, k3, k4;
    double Vk1, Vk2,Vk3, t1, teta1;
    k1 = compare(Vk,t,teta,y,Wx,rejim);
    Vk1=Vk+(h*0.5)*k1;
    k2 = compare(Vk1, t+0.5*h, teta,y,Wx,rejim);
    Vk2=Vk+(h*0.5)*k2;
    k3 = compare(Vk2, t+0.5*h, teta,y,Wx,rejim);
    Vk4 = Vk + h*k3;
    k4 = compare(Vk3, t+h, teta,y,Wx,rejim);
    return (Vk + (h/6)*(k1+2*k2+2*k3+k4));
 
}
Оно, конечно, не работает.
Я так понимаю, названия переменных в названии функции я зря написал - он их все равно не воспринимает?
Не понимаю как устроено... Это мне надо где-то описать указатели, чтобы они указывали на значения аргументов функции compare?...

Добавлено через 24 минуты
И еще вопрос: можно как-то организовать подобное же обращение, если у меня в функциях, которые я буду писать вместо compare разное кол-во аргументов? (В рунге-Кутта мне нужны только первые два из них, а остальные-то болтаются просто так)
cam_rus
0 / 0 / 0
Регистрация: 05.10.2010
Сообщений: 19
19.10.2010, 14:59  [ТС]     Метод Рунге-Кутта. #6
Да блин!
Помогите же кто-нибудь!

Добавлено через 1 час 17 минут
Блин, ребят, может кто-нить помочь-то?
Yandex
Объявления
19.10.2010, 14:59     Метод Рунге-Кутта.
Ответ Создать тему
Опции темы

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