Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583

Система ОДУ не решается

15.02.2018, 11:25. Показов 5161. Ответов 99
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
подскажите как сделать программу, очень нужно
Миниатюры
Система ОДУ не решается  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.02.2018, 11:25
Ответы с готовыми решениями:

Система уравнений не решается :(
Добрый день, Помогите, пожалуйста, не получается решить систему. С маткадом раньше не работала, так что заранее прошу прощения за...

Не решается система уравнение
Всем привет! Подскажите пожалуйста, почему маткад 15 не решает систему? Ввел начальные условия, первое приближение. После given сама...

Не решается система уравнений
при решении уравнений выдается единичная матрица, это же не ответы...как быть, помогите пожалуйста!

99
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583
15.02.2018, 18:51  [ТС]
Студворк — интернет-сервис помощи студентам
mat_for_c, в void 6 переменных и при выводе тоже добавить, чтобы было 6 ?

Добавлено через 32 секунды
mat_for_c, или мы не учитываем t0 ?
0
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
15.02.2018, 18:55
Цитата Сообщение от ElKros Посмотреть сообщение
в void 6 переменных и при выводе тоже добавить, чтобы было 6 ?
да, не успел отредактировать.

Добавлено через 2 минуты
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
60
61
62
63
64
65
66
67
68
69
70
71
#include <iostream>
#include <functional>
#include <vector>
#include <iomanip>
 
using namespace std;
 
double dx1dt(const double t, const double x1, const double x2, const double x3) {
   return x1 - x2 + x3;
}
 
double dx2dt(const double t, const double x1, const double x2, const double x3) {
   return x1 + x2 - x3;
}
 
double dx3dt(const double t, const double x1, const double x2, const double x3) {
   return 2*x1 - 2*x2;
}
 
void rungeKutta(double x, double y, double z, double t0, double max_t, double h) {
 
   double k1[3], k2[3], k3[3], k4[3];
 
   double t = t0;
 
   vector<function<double(double, double, double, double)>> vfunc;
   vfunc.push_back(dx1dt);
   vfunc.push_back(dx2dt);
   vfunc.push_back(dx3dt);
 
   size_t max_iter = (max_t - t0) / h;
 
 
   for (int i = 0; i < max_iter; i++)
   {
      cout << t << "\t" << setprecision(5) << x << "\t" << y << "\t" << z << endl;
 
      for (int j(0); j < 3; ++j) {
         k1[j] = h*vfunc[j](t, x, y, z);
      }
 
      for (int j(0); j < 3; ++j) {
         k2[j] = h*vfunc[j](t + 0.5*h, x + 0.5*k1[0], y + 0.5*k1[1], z + 0.5*k1[2]);
      }
 
      for (int j(0); j < 3; ++j) {
         k3[j] = h*vfunc[j](t + 0.5*h, x + 0.5*k2[0], y + 0.5*k2[1], z + 0.5*k2[2]);
      }
 
      for (int j(0); j < 3; ++j) {
         k4[j] = h*vfunc[j](t + h, x + k3[0], y + k3[1], z + k3[2]);
      }
      
      x += (k1[0] + 2 * k2[0] + 2 * k3[0] + k4[0]) / 6.;
      y += (k1[1] + 2 * k2[1] + 2 * k3[1] + k4[1]) / 6.;
      z += (k1[2] + 2 * k2[2] + 2 * k3[2] + k4[2]) / 6.;
 
      t = t + h;
   }
   cout << t << setprecision(5) << "\t" << x << "\t" << y << "\t" << z << endl;
}
 
int main() {
   double x0 = 1;
   double y0 = 1;
   double z0 = 1;
   double beg_time = 0;
   double max_time = 1;
   double step = 0.1;
   rungeKutta(x0, y0, z0, beg_time, max_time, step);
}
1
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583
16.02.2018, 17:51  [ТС]
mat_for_c, спасибо огромное ) очень помогли )

Добавлено через 1 минуту
mat_for_c, а если будет увеличиваться количество уравнений в системе, то просто добавлять новые значения в функцию и увеличивать массив k[] до количества всех переменных ?

Добавлено через 8 секунд
mat_for_c, а если будет увеличиваться количество уравнений в системе, то просто добавлять новые значения в функцию и увеличивать массив k[] до количества всех переменных ?
0
1719 / 568 / 187
Регистрация: 12.03.2016
Сообщений: 2,169
16.02.2018, 17:54
ElKros, Вы человека поблагодарите нажатием кнопки "Спасибо", да и лучший ответ не помешает.
0
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583
16.02.2018, 17:58  [ТС]
мановар, я не знала, что здесь такое нужно делать
0
1719 / 568 / 187
Регистрация: 12.03.2016
Сообщений: 2,169
16.02.2018, 18:03
Цитата Сообщение от ElKros Посмотреть сообщение
что здесь такое нужно делать
Это по желанию, это не обязаловка, но это показывает Ваше отношение к человеку, который Вам помог.
0
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583
16.02.2018, 18:07  [ТС]
Очень помог и я ему безумно благодарна, да и сделать один клик не так уж и сложно ) побольше бы таких добрых и отзывчивых людей )
0
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
16.02.2018, 22:14
Цитата Сообщение от ElKros Посмотреть сообщение
а если будет увеличиваться количество уравнений в системе, то просто добавлять новые значения в функцию и увеличивать массив k[] до количества всех переменных ?
да, и не забудьте про увеличение количества входных параметров для функций. тут было только 3 функции, поэтому использовал переменные x, y, z.
0
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583
16.02.2018, 23:39  [ТС]
mat_for_c, если у меня в системе 4 уравнения, то для каждой производной нужно выписывать все входные константы и неизвестные или только неизвестные ? И в методе при нахождении k1 ... k4 вводить только 4 искомые неизвестные переменные ?

Добавлено через 2 минуты
mat_for_c, можно я попробую написать для 4х уравнений и сюда сброшу, чтобы вы посмотрели , если вас не затруднит это?
0
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
16.02.2018, 23:55
Цитата Сообщение от ElKros Посмотреть сообщение
нужно выписывать все входные константы и неизвестные или только неизвестные ?
по правилам хорошего тона, нужно передавать все переменные, даже если они не используются. (это из матанализа)
Цитата Сообщение от ElKros Посмотреть сообщение
я попробую написать для 4х уравнений и сюда сброшу
дерзайте
0
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583
16.02.2018, 23:59  [ТС]
mat_for_c, завтра сброшу что получится ) а почему мы их константами объявляем, а не обычными ?
0
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
17.02.2018, 00:17
Цитата Сообщение от ElKros Посмотреть сообщение
константами объявляем, а не обычными
правило хорошего тона. просто говорим компилятору и другим разработчикам, что эти величины в функции не меняются.
0
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583
17.02.2018, 13:10  [ТС]
mat_for_c, я начала писать, но запуталась с константами. Если они у нас присутствуют в задании уравнения, то мы их тоже должны вписывать в объявление и просчет ?
я набросала и вот, что получилось, не судите строго...

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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
double dy0dt(const double t, const double y_0, const double y_1, const double y_2, const double y_3, const double tau, const double P, const double eps, const double alpha, const double I0){
    return eps - y_2*y_0*((P - 1 - y_0) / (1 - y_1)) + y_0 / tau;
}
double dy1dt(const double t, const double y_0, const double y_1, const double y_2, const double y_3, const double tau, const double P, const double eps, const double alpha, const double I0){
    return y_0 * y_2;
}
double dy2dt(const double t, const double y_0, const double y_1, const double y_2, const double y_3, const double tau, const double P, const double eps, const double alpha, const double I0){
    return y_0 * y_3;
}
 
double dy3dt(const double t, const double y_0, const double y_1, const double y_2, const double y_3, const double tau, const double P, const double eps, const double alpha, const double I0){
    return I0*(sqrt(y_0))*pow(2.718, (-alpha / y_0)); // не видит exp = 2.718
}
 
void rungeKutta_by_4(double y0, double y1, double y2, double y3, double tau,  double P, double eps, double alpha, double I0, double t0, double max_t, double h){
    double k1[4], k2[4], k3[4], k4[4];
 
    double t = t0;
 
    vector<function<double(double, double, double, double, double, double, double, double, double, double) >> vfunc;
    vfunc.push_back(dy0dt);
    vfunc.push_back(dy1dt);
    vfunc.push_back(dy2dt);
    vfunc.push_back(dy3dt);
 
    size_t max_iter = (max_t - t0) / h;
 
    for (int i = 0; i < max_iter; i++)
    {
        cout << t << "\t" << setprecision(5) << y0 << "\t" << y1 << "\t" << y2 << "\t" << y3 << endl;
 
        for (int j(0); j < 4; ++j) {
            k1[j] = h*vfunc[j](t, y0, y1, y2, y3, tau, P, eps, alpha, I0);
        }
 
        for (int j(0); j < 4; ++j) {
            k2[j] = h*vfunc[j](t + 0.5*h, y0 + 0.5*k1[0], y1 + 0.5*k1[1], y2 + 0.5*k1[2], y3 + 0.5*k1[3], tau, P, eps, alpha, I0);
        }
 
        for (int j(0); j < 4; ++j) {
            k3[j] = h*vfunc[j](t + 0.5*h, y0 + 0.5*k2[0], y1 + 0.5*k2[1], y2 + 0.5*k2[2], y3 + 0.5*k3[3], tau, P, eps, alpha, I0);
        }
 
        for (int j(0); j < 4; ++j) {
            k4[j] = h*vfunc[j](t + h, y0 + k3[0], y1 + k3[1], y2 + k3[2], y3 + k3[4], tau, P, eps, alpha, I0);
        }
 
        y0 += (k1[0] + 2 * k2[0] + 2 * k3[0] + k4[0]) / 6.;
        y1 += (k1[1] + 2 * k2[1] + 2 * k3[1] + k4[1]) / 6.;
        y2 += (k1[2] + 2 * k2[2] + 2 * k3[2] + k4[2]) / 6.;
        y3 += (k1[2] + 2 * k2[2] + 2 * k3[2] + k4[2]) / 6.;
 
        t = t + h;
    }
    cout << t << setprecision(5) << "\t" << y0 << "\t" << y1 << "\t" << y2 << "\t" << y3 << endl;
 
}
 
int main() {
        double y_0, y_1, y_2, y_3;
    cout << "Input y0: "; cin >> y_0; // 10^(-10)
    cout << "Input y1: "; cin >> y_1; // 0
    cout << "Input y2: "; cin >> y_2; // 0
    cout << "Input y3: "; cin >> y_3; // 0
 
        // заданные константы
    double alpha;
    double I0;
    double P;
    double tau ;
 
        // зависит от t
    double eps = 8; 
 
    double beg_time, max_time;
    cout << "Input begin: "; cin >> beg_time; // = 0
    cout << "Input end: "; cin >> max_time;   // = 1
 
    double step; 
    cout << "Input step: "; cin >> step;      // = 0.1
 
    rungeKutta_by_4(y_0, y_1, y_2, y_3, beg_time, max_time, step); // сюда нужно дописывать константы 
}
Добавлено через 4 минуты
mat_for_c, подскажите пожалуйста, как учитывать заданные константы alpha, I0, tau и т.д. или как их лучше записывать ?

Добавлено через 5 секунд
mat_for_c, подскажите пожалуйста, как учитывать заданные константы alpha, I0, tau и т.д. или как их лучше записывать ?
0
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
17.02.2018, 13:31
Цитата Сообщение от ElKros Посмотреть сообщение
как учитывать заданные константы alpha, I0, tau и т.д. или как их лучше записывать ?
Если они вводятся с клавиатуры, то передавать в качестве параметров, а если же они фиксированы, то писать циферками сказу в уравнении, например 0.25 * x - 0.1 * y
0
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583
17.02.2018, 13:35  [ТС]
mat_for_c, а так, код правильно написан или там много ошибок ? Они будут вводиться с клавиатуры
0
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
17.02.2018, 13:36
Неверно:
C++
1
2
3
4
//40 строка 5 параметр функции
for (int j(0); j < 4; ++j) {
   k4[j] = h*vfunc[j](t + h, y0 + k3[0], y1 + k3[1], y2 + k3[2], y3 + k3[4], tau, P, eps, alpha, I0);
}
Нужно y3 + k3[3]

Неверно:
C++
1
2
// 50 строка
y3 += (k1[2] + 2 * k2[2] + 2 * k3[2] + k4[2]) / 6.;
нужно
C++
1
y3 += (k1[3] + 2 * k2[3] + 2 * k3[3] + k4[3]) / 6.;
- аккуратнее с copy_paste
0
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583
17.02.2018, 13:40  [ТС]
mat_for_c, а в вызове функции, в main, там нужно еще записывать константы ?

Добавлено через 1 минуту
mat_for_c, меня смущает, что очень много параметров в функции я позаписыаала, нельзя это как-то сократить ?
0
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
17.02.2018, 13:45
ElKros, у вас констатны в ОДУ заданы или они с клавиатуры считываются?
0
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583
17.02.2018, 13:52  [ТС]
вот так задается все
Миниатюры
Система ОДУ не решается  
0
5 / 4 / 1
Регистрация: 14.02.2018
Сообщений: 583
17.02.2018, 13:53  [ТС]
mat_for_c, и почему не распознает exp, когда ее объявляем глобальной константой ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.02.2018, 13:53

Не решается система уравнений
откуда ошибка?

Как решается данная система?
Народ помогите, задание найти решение системы, как такое сделать в маткаде. не понимаю просто((

Система уравнений решается неверно
Доброго времени суток. Возникла проблема с решением системы уравнений. ....ax+b/a-c*x^2, x&gt;=500 z= ...

Почему не решается система уравнений?
Вручную считается. Т.е. в формулах ошибки нету

Не решается система диф. уравнений
Решаю систему по примеру, частное уравнение вывел правильно, а вот с общим что-то не то. Wolfram Alfa выдает следующее:


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
BitTorrent (версия 7.11 English) и Меню Настройки
russiannick 15.11.2026
Пункты, отвечающие за отключение обновлений в BitTorrent версии 7. 11 (английской) Options Preferences General Language
Транслитерация текста с кириллицы на латиницу (вариант №4)
Maks 15.11.2026
Что-то я перемудрил с предыдущими версиями, в этот раз сделал всё проще, обратившись к функции "СтрокаЛатиницей" из типового общего модуля "СтроковыеФункцииКлиент". В данной функции нет апострофов,. . .
BitTorrent (версия 4.3.9) и Меню Настройки
russiannick 15.11.2026
В меню Настройки можно отключить автоматическое обновление программы. Карта этого меню приложена ниже. Нужный пункт выделен красным. Сервис Настройки Поведение
Транслитерация текста с кириллицы на латиницу (вариант №3)
Maks 15.11.2026
Обновленная версия предыдущей обработки. Изменения коснулись букв: Ъ, Ы, Ь, Э, отображения которых зависят от положения реквизита "Транслитерация имён". Изменено отображение буквы Й. Добавлена. . .
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru