Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
1 / 1 / 0
Регистрация: 28.01.2017
Сообщений: 32

Добавить функционал в готовую программу решения систем дифферинциальных уравнений

28.01.2017, 11:20. Показов 2365. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, мне нужно сделать программу, которая будет решать различные системы дифуров, заданные мною же.
У меня есть, мною же написанная программа, решающая дифуры по отдельности, методом рунге кута 4го порядка, программа выводит точки удовлетворяющие решению и строит по ним график функции.
Вот пример для y'=y :

Решением является функция C*e^x , как видно на скрине, точки удовлетворяют этой функции, ну в общем, это и есть решение.

Как можно этот метод прикрутить для решения сразу системы?

Думал, решать уравнения системы по отдельности, сравнивать таблицы полученных решений и выводить одинаковые точки, по ним же строить график, но, сколько разных дифуров не перепробовал, совпадающих точек практически не было.

В общем, может я что-то не догоняю или вообще мыслю не правильно, помогите пожалуйста, направьте на путь истинный!

Если что, вот функция решающая, возвращает массив точек, которые и выводятся в таблице:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
double *RungeKutt(int n,double x0,double y0,double h,double (*f)(double x,double y))
{
  register int i;
  double *res,s;
  double k1,k2,k3,k4;
  res=new double [n+1];
  res[0]=y0;
  s=x0;
  for(i=1;i<=n;i++)
  {
    k1=h*f(s,res[i-1]);
    k2=h*f(s+h/2,res[i-1]+k1/2);
    k3=h*f(s+h/2,res[i-1]+k2/2);
    k4=h*f(s+h,res[i-1]+k3);
 
    res[i]=res[i-1]+(k1+2*k2+2*k3+k4)/6;
    s+=h;
  }
  return res;
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.01.2017, 11:20
Ответы с готовыми решениями:

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

Готовые библиотеки для решения систем уравнений
Методом Гаусса. Приведением к диагональному виду. Разрядность 32 бита, при обращении элементов главной диагонали в ноль возвращается FALSE.

Библиотеки для решения (недоопределённых) систем линейных уравнений
Знает кто-нибудь сабж?. Если система недоопределена, то нужно в некотором формате отдавать её общее решение, ну или ФСР. Слышал про...

33
1 / 1 / 0
Регистрация: 28.01.2017
Сообщений: 32
28.01.2017, 17:34  [ТС]
Студворк — интернет-сервис помощи студентам
Там не только в порядке, есть и в вычислении отличия, я немного не так делал:
C++
1
 k32=h*f2(s+h/2,res[i-1][1]+k22/2);
и ваше:
C++
1
k32=h*f2(x+k21/2, y+k22/2);
у меня немного поднапутано (:

Добавлено через 2 минуты
График, который я скидывал,парабола, такой график строится по решению, у нас получается просто 2 отдельных графика
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
28.01.2017, 17:39
Цитата Сообщение от andrew95qq Посмотреть сообщение
у меня немного поднапутано
Поэтому такие задачи лучше решать в векторном виде, так сложнее запутаться.

Добавлено через 2 минуты
Цитата Сообщение от andrew95qq Посмотреть сообщение
у нас получается просто 2 отдельных графика
Потому что у нас две неизвестные функции: x(t) и y(t). Просто так уж совпало, что их форма одинакова, с точностью до множителя. Но для другой системы эти функции могли оказаться совершенно не похожими друг на друга.
0
1 / 1 / 0
Регистрация: 28.01.2017
Сообщений: 32
28.01.2017, 17:42  [ТС]
Вот наша система ДУ:
Название: 1.PNG
Просмотров: 5

Размер: 1.1 Кб
Вот ее решение:
Название: 2.PNG
Просмотров: 5

Размер: 1.1 Кб
Вот график одного решения у(т):
0
1 / 1 / 0
Регистрация: 28.01.2017
Сообщений: 32
28.01.2017, 17:49  [ТС]
Вот график частного решения, но тож что то не то
Изображения
 
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
28.01.2017, 17:53
А в чём вопрос?
0
1 / 1 / 0
Регистрация: 28.01.2017
Сообщений: 32
28.01.2017, 17:57  [ТС]
Извините, что уже столько времени у вас отнял, очень благодарен за помощь! Даже удивлён!

Вопрос в том, почему получаются совершенно другие графики?
Правильные ли графики, которые получаются?
Как получить такие, как я скидывал выше?
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
28.01.2017, 18:00
Цитата Сообщение от andrew95qq Посмотреть сообщение
Вопрос в том, почему получаются совершенно другие графики?
Потому что другие начальные условия.
0
1 / 1 / 0
Регистрация: 28.01.2017
Сообщений: 32
28.01.2017, 18:02  [ТС]
я проверял при тех же начальных условиях

похоже конечно, но не то.
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
28.01.2017, 18:05
Если есть сомнения, можно решить систему в wolphram alpha:
https://www.wolframalpha.com/i... ,+y(0)%3D1
0
1 / 1 / 0
Регистрация: 28.01.2017
Сообщений: 32
28.01.2017, 18:15  [ТС]
Не знаю, почему, график построен с решения на фольфраме, но всё равно отличия по точкам, по сравнению с графиком из программы
Миниатюры
Добавить функционал в готовую программу решения систем дифферинциальных уравнений   Добавить функционал в готовую программу решения систем дифферинциальных уравнений  
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
28.01.2017, 18:15
Если подставить в мою программу x0=3, y0=0, то при t=2 получим:
Code
1
  2      -54.0543  -54.4603
А если подставить t=2 в функцию e-t - e2t, получим -54.46281474990762.
Довольно хорошее соответствие.
1
1 / 1 / 0
Регистрация: 28.01.2017
Сообщений: 32
28.01.2017, 18:26  [ТС]
Блин, извините за тупость, но почему вот тут тогда, мы же тоже строим график по t, так вот из графика видно, что когда t=2, точка где то на -15 стоит
Миниатюры
Добавить функционал в готовую программу решения систем дифферинциальных уравнений  
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
28.01.2017, 18:36
Цитата Сообщение от andrew95qq Посмотреть сообщение
когда t=2, точка где то на -15 стоит
У меня в районе 60:
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
#include <iostream>
#include <iomanip>
using namespace std;
 
typedef double (*TFunc) (double t, double x, double y);
 
double** RungeKutt(int n, double t0, double x0, double y0, double h, TFunc f1, TFunc f2)
{
    register int i;
    double **res, s;
    double k11, k21, k31, k41;
    double k12, k22, k32, k42;
    res=new double* [n+1];
    for(i=0; i<n+1; i++)
        res[i]=new double[2];
    res[0][0] = x0;
    res[0][1] = y0;
    s = 0;
    for(i=1; i<=n; i++)
    {
        double x = res[i-1][0];
        double y = res[i-1][1];
 
        k11=h*f1(s, x, y);
        k12=h*f2(s, x, y);
 
        k21=h*f1(s+h/2, x+k11/2, y+k12/2);
        k22=h*f2(s+h/2, x+k11/2, y+k12/2);
 
        k31=h*f1(s+h/2, x+k21/2, y+k22/2);
        k32=h*f2(s+h/2, x+k21/2, y+k22/2);
 
        k41=h*f1(s+h,   x+k31,   y+k32);
        k42=h*f2(s+h,   x+k31,   y+k32);
 
        res[i][0] = x + (k11+2*k21+2*k31+k41)/6;
        res[i][1] = y + (k12+2*k22+2*k32+k42)/6;
 
        s+=h;
    }
 
    return res;
}
 
double f1(double t, double x, double y)
{
    return -2*x + 4*y;
}
 
double f2(double t, double x, double y)
{
    return -x + 3*y;
}
 
 
int main()
{
    int n = 11;
    double dt = 0.3;
    double **res = RungeKutt(n, 0, 3, 0, dt, f1, f2);
 
    for (int i=0; i<=n; i++)
    {
        double t = i*dt;
        cout << setw(3) << t << "  " << setw(12) << res[i][0] << "  " << res[i][1] << endl;
    }
 
}
0
1 / 1 / 0
Регистрация: 28.01.2017
Сообщений: 32
28.01.2017, 18:40  [ТС]
Хотя нет, вот, вашу прогу открыл, при t=2
Название: 14.PNG
Просмотров: 4

Размер: 1.1 Кб
В чём дело?

ну, на всякий вот:
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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
#include <iostream>
#include <iomanip>
#include <conio.h>
using namespace std;
 
typedef double (*TFunc) (double t, double x, double y);
 
double** RungeKutt(int n, double t0, double x0, double y0, double h, TFunc f1, TFunc f2)
{
    register int i;
    double **res, s;
    double k11, k21, k31, k41;
    double k12, k22, k32, k42;
    res=new double* [n+1];
    for(i=0; i<n+1; i++)
        res[i]=new double[2];
    res[0][0] = x0;
    res[0][1] = y0;
    s = 0;
    for(i=1; i<=n; i++)
    {
        double x = res[i-1][0];
        double y = res[i-1][1];
 
        k11=h*f1(s, x, y);
        k12=h*f2(s, x, y);
 
        k21=h*f1(s+h/2, x+k11/2, k12/2);
        k22=h*f2(s+h/2, x+k11/2, k12/2);
 
        k31=h*f1(s+h/2, x+k21/2, y+k22/2);
        k32=h*f2(s+h/2, x+k21/2, y+k22/2);
 
        k41=h*f1(s+h,   x+k31,   y+k32);
        k42=h*f2(s+h,   x+k31,   y+k32);
 
        res[i][0] = x + (k11+2*k21+2*k31+k41)/6;
        res[i][1] = y + (k12+2*k22+2*k32+k42)/6;
 
        s+=h;
    }
 
    return res;
}
 
double f1(double t, double x, double y)
{
    return -2*x + 4*y;
}
 
double f2(double t, double x, double y)
{
    return -x + 3*y;
}
//---------------------------------------------------------------------------
 
#pragma argsused
int main(int argc, char* argv[])
{
        int n = 60;
    double **res = RungeKutt(n, 0, 3, 0, 0.3, f1, f2);
 
    for (int i=0; i<=n; i++)
    {
        double t = i*0.3;
        cout << setw(3) << t << "  " << setw(12) << res[i][0] << "  " << res[i][1] << endl;
    }
  getch();
}
//---------------------------------------------------------------------------
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.01.2017, 18:40

Разработать функцию для решения систем линейных уравнений методом Зейделя
Ребят, срочно, выручайте, задание на зачет... Прототип функции int slau(int n, double e, const double *a, const double *b, double *x); ...

Исправить код метод Ньютона для решения систем нелинейных уравнений под нужное условие
Данный код для решения системы ax+tg(xy)=0; (y^2-b^2)+lnx=0 Перепишите его,пожалуйста для системы 2x-y-10=0 5x^2-20y^2-100=0 ...

Подскажите пожалуйста как добавить конструктор копирования в готовую программу
Вот код программы: # include &lt;iostream&gt; # include &lt;conio.h&gt; # include &lt;string&gt; # include &lt;stdio.h&gt; # include &lt;cstdlib&gt; ...

Разработать программу решения систем линейных алгебраических уравнений
Разработать программу решения систем линейных алгебраических уравнений одним из методов (метод обратной матрицы, метод Крамера). Обе задачи...

Написать программу для решения систем линейных уравнений методом Гаусса
У меня такая задача, написать программу для решения систем линейных уравнений методом Гаусса, ко всему этому дана блок схема.Проблема в том...


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

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Новые блоги и статьи
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru