Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
48 / 48 / 24
Регистрация: 29.10.2011
Сообщений: 154

Нужна помощь в проверки правельности алгоритма

31.10.2011, 08:51. Показов 1188. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброе время суток. Собственно вот моя реализация алгоритма Рунге - Кутты, для решения ОДУ.
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
57
58
59
class RUNGE_KUTTA {
public:
    int N;
    double t;
    double *K;
    double *KK,*K1,*K2,*K3,*K4;
    RUNGE_KUTTA(int Na) {
        N=Na;
        if(N<1) {
            return;
        }
        K = new double[N];
        KK = new double[N];
        K1 = new double[N];
        K2 = new double[N];
        K3 = new double[N];
        K4 = new double[N];
    }
    ~RUNGE_KUTTA() {
        delete[] K;
        delete[] KK;
        delete[] K1;
        delete[] K2;
        delete[] K3;
        delete[] K4;
    }
    void SET_TERM(double t0, double *K0) {
        t = t0;
        for(int i = 0; i < N; i++) {
            K[i] = K0[i];
        }
    }
    double GET_TIME() {
        return t;
    }
    void F(double t, double *K, double *dY);
    void STEP_IN(double dt) {
        if(dt < 0) {
            return;
        }
        F(t, K, K1);
        for(int i=0; i < N; i++) {
            KK[i] = K[i] + K1[i] * (dt/2.0);
        }
        F(t + dt/2.0, KK, K2);
        for(int i=0; i<N; i++) {
            KK[i] = K[i] + K2[i] * (dt/2.0);
        }
        F(t + dt/ 2.0, KK, K3);
        for(int i=0; i<N; i++) {
            KK[i] = K[i] + K3[i] * (dt);
        }
        F(t + dt, KK, K4);
        for(int i=0; i<N; i++) {
            K[i] = K[i] + dt / 6.0 * (K1[i] + 2.0 * K2[i] + 2.0 * K3[i] + K4[i]);
        }
        t = t + dt;
    }
};
Собственно кто-нибудь может помочь протестировать алгоритм на нескольких функциях, покритиковать код, и проверить правильность его реализации, предложить какие-либо дополнения к коду, заранее спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.10.2011, 08:51
Ответы с готовыми решениями:

Народ очень нужна помощь в написании алгоритма
Написать программу, которая по введенному значению аргумента вы-числяет значение функции, заданной в виде графика. Параметр R вводится с...

Нужна помощь в составлении алгоритма с большим кол-вом задек
Пытаюсь решить задачу: есть устройство (контроллер mega16), он управляет другим устройством. Протокол управления - modbus. То есть моё...

Создаю "тестирующую систему" для проверки задач. Программисты, нужна ваша помощь!
Мне нужно создать &quot;тестирующую систему&quot; для задач, решенных учениками. Планируется, что все задачи по паскалю дети будут решать с помощью...

11
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
31.10.2011, 11:13
Промолчу про стиль именования...

Добавь к конструктору спецификатор explicit.
1
48 / 48 / 24
Регистрация: 29.10.2011
Сообщений: 154
31.10.2011, 12:02  [ТС]
Цитата Сообщение от Deviaphan Посмотреть сообщение
Промолчу про стиль именования...
Добавь к конструктору спецификатор explicit.
Done, сам знаю переменные названы ужасно, просто не малейшего представления не имел как их назвать, кроме как названиями из формул, а по работе алгоритма есть какие-либо замечания?
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
31.10.2011, 12:10
Я имел в виду заглавные буквы. Так обычно макроопределения именуют.
А по алгоритмы сказать нечего, т.к. я не знаю что за алгоритм и кода функции F в листинге нету.
0
48 / 48 / 24
Регистрация: 29.10.2011
Сообщений: 154
31.10.2011, 12:42  [ТС]
Цитата Сообщение от Deviaphan Посмотреть сообщение
А по алгоритмы сказать нечего, т.к. я не знаю что за алгоритм и кода функции F в листинге нету.
"Методы Рунге — Кутты — важное семейство численных алгоритмов решения обыкновенных дифференциальных уравнений и их систем. Данные итеративные методы явного и неявного приближённого вычисления были разработаны около 1900 года немецкими математиками К. Рунге и М. В. Куттой.

Формально, методом Рунге — Кутты является модифицированный и исправленный метод Эйлера, они представляют собой схемы второго порядка точности. Существуют стандартные схемы третьего порядка, не получившие широкого распространения. Наиболее часто используется и реализована в различных математических пакетах (Maple, MathCAD, Maxima) стандартная схема четвёртого порядка. Иногда при выполнении расчётов с повышенной точностью применяются схемы пятого и шестого порядков. Построение схем более высокого порядка сопряжено с большими вычислительными трудностями. Методы седьмого порядка должны иметь по меньшей мере девять стадий, в схему восьмого порядка входит 11 стадий. Хотя схемы девятого порядка не имеют большой практической значимости, неизвестно, сколько стадий необходимо для достижения этого порядка точности. Аналогичная задача существует для схем десятого и более высоких порядков."
Пример F, поскольку для различных задач F разная.
C++
1
2
3
4
void F(double t, double *K, double dY[]) { //y''(t) + y(t) = 0 (y'' = 2-ая производная.
        dY[0] = K[1];
        dY[1] = -K[0];
    }
Ну и соответственно использование:
C++
1
2
3
4
5
6
7
8
9
10
int main() {
    RUNGE_KUTTA rk4(2);
    double K0[2] = {0, 1};
    rk4.SET_TERM(0, K0);
    for(int i = 0; i < 10; i++) {
        cout << rk4.GET_TIME() << " " << rk4.K[0] /*Искомое решение*/ << " " << rk4.K[1] /* i - ая производная*/ << endl;
        rk4.STEP_IN(0.01);
    }
    return 0;
}
Добавлено через 4 минуты
При решении этим методом ОДУ N-го порядка входными данными являются:
а) числа:
N - порядок ОДУ
K - число узлов сетки
h - шаг сетки x[k]
x[0], y[0], y'[0], ..., y^(N-1)[0] - начальные условия
б) функция:
f(x, y, y', ..., y^(N-1)) - правая часть ОДУ

В примере который я привел K = 10, h = 0.01, N = 2, а правая часть ничто иное как F(...);
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
31.10.2011, 12:43
Функцию F следует сделать просто функцией, а не методом класса.
В методе STEP_IN dt нужно на равенство нулю ещё проверять, иначе все шаги одинаковые будут.
1
48 / 48 / 24
Регистрация: 29.10.2011
Сообщений: 154
31.10.2011, 13:07  [ТС]
Цитата Сообщение от Deviaphan Посмотреть сообщение
Функцию F следует сделать просто функцией, а не методом класса.
А если F сделать private методом класса? Просто весь класс не будет иметь смысла без F. Я пишу систему стабилизации аппарата, а там нужно решать пару ОДУ, и от этого класса будут наследоваться еще пара классов... И разве не плохо стиль программирования когда ООП сосчитаться с функциональным программирование?
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
31.10.2011, 13:21
Эту функцию не имеет смысла делать методом класса, т.к. все используемые в ней данные передаются в виде аргументов.

Цитата Сообщение от YouDoItWrong Посмотреть сообщение
поскольку для различных задач F разная
Тебе следует в классе хранить указатель на функцию и назначать её перед использованием. Тогда ты сможешь применять этот класс для решения задач с различной реализацией F.
Т.е. создаёшь в классе указатель на функцию
typedef void (*F)(double t, double *K, double *dY);
F _function;
0
48 / 48 / 24
Регистрация: 29.10.2011
Сообщений: 154
31.10.2011, 16:52  [ТС]
Что то точность алгоритма хромает, где может быть ошибка?
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
31.10.2011, 16:56
Замени деление умножением и попробуй минимизировать число операций, т.е. логику изменить попробуй.
0
48 / 48 / 24
Регистрация: 29.10.2011
Сообщений: 154
31.10.2011, 17:06  [ТС]
Может стоит высчитывать среднее квадратичное отклонение от интересующей меня точности, и если точность не достигнута делать двойной пересчет? т.е. Заданный шаг делим на два.
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
31.10.2011, 17:08
Возможно. Но учти, что чем сильнее отличается порядок величин, тем больше будет погрешность.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.10.2011, 17:08
Помогаю со студенческими работами здесь

СРОЧНО НУЖНА ПОМОЩЬ! Нужна информация о тест оборудовании
Доброго времени суток! Интересует информация (книги, статьи, научные статьи, сайты, зарубежная приветствуется) о проектировании...

Помощь в реализации линейного алгоритма
Здравствуйте. Очень нужна ваша помощь в решении следующих задач: 1. Написать программу реализации линейного алгоритм приема исходных...

Схема алгоритма и программа проверки элементов массива на упорядоченность
Пожалуйста составите схему алгоритма и программу, которые проверяют упорядоченность по возрастаниюю массива K(10) и выводят соответсвуещее...

Выбор алгоритма для проверки символов строки на уникальность
Задача: проверить, уникальны ли все символы в строке. Написал два алгоритма static boolean check(String str) { char...

Проблема с рандомом + помощь в создании алгоритма
Такая штука - делаю одну прогу (игра напоминающая бомбермен)... Решил отдельнонаписать прожку в которой юзер начинает матч - боты сами...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru