Форум программистов, компьютерный форум, киберфорум
Pascal ABC
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
1 / 1 / 0
Регистрация: 21.12.2014
Сообщений: 10
1

Изменить программу интегрирования методом второго порядка

05.03.2015, 23:19. Показов 1581. Ответов 17
Метки нет (Все метки)

Здравствуйте. Возникла проблема с задачей. Вот ее решение:
Pascal
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
Const
Dt=0.1;
V=-0.5;
Q=0.0;
 
Var
f:Text;
V_old,V_new,Q_old,Q_new,t:Real;
i:integer;
 
Begin
Assign(f,'D:\Result1.txt');
Rewrite(f);
t:=0;
Q_old:=Q;
V_old:=V;
Writeln(f,t:5:1,Q:15:3,V:15:3);
for i:=1 to 350 do
begin
t:=Dt*i;
Q_new:=Q_old+V_old*Dt;
V_new:=V_old+Exp(-Q_old)*(Exp(-Q_old)-1)*Dt;
Writeln(f,t:5:1,Q_new:15:3,V_new:15 :3);
Q_old:=Q_new;
V_old:=V_new;
end;
Close(f);
End.
Тут реализуется метод интегрирования даже не второго, а первого
порядка, т.е. в один шаг. Он страшно неточный, поэтому решение
раскачивается и все значения функций быстро нарастают. Поэтому
нужно использовать метод хотя бы второго порядка (в два шага),
а еще лучше - четвертого Рунге-Кутты. И шаг интегрирования должен быть примерно 0.001.
Должны быть периодические функции. Шаг задаю, получаются периодические все правильно. И вместо от 1до350 я поставил от 1до35000. Но у меня не получается преобразовать из первого порядка во второй.
Помогите пожауйста. Заранее спасибо
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.03.2015, 23:19
Ответы с готовыми решениями:

Уравнение второго порядка, операционным методом
y"+y'-4y=(10+4t)e^(2t); y(0)=0; y'(0)=2 У меня получилось 2/(p-2)^2 + -4/(P^2+p-4); нужно перейти...

Создать абстрактный класс линия второго порядка с полями – коэффициенты уравнения второго порядка
Задание:Создать абстрактный класс линия второго порядка с полями – коэффициенты уравнения второго...

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

Изобразить область интегрирования на чертеже и изменить порядок интегрирования в повторном интеграле
Поиск по форуму выдал несколько результатов, однако мало что понял и соответственно застрял в...

17
Модератор
Эксперт по электронике
7762 / 3911 / 1504
Регистрация: 01.02.2015
Сообщений: 12,067
Записей в блоге: 2
06.03.2015, 21:29 2
Цитата Сообщение от kot64rus Посмотреть сообщение
Должны быть периодические функции. Шаг задаю, получаются периодические все правильно.
А если не секрет - какой период у функции Exp(-Q_old)*(Exp(-Q_old)-1)?
0
1 / 1 / 0
Регистрация: 21.12.2014
Сообщений: 10
07.03.2015, 00:09  [ТС] 3
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
А если не секрет - какой период у функции Exp(-Q_old)*(Exp(-Q_old)-1)?
Да там неважно я так понял по заданию. Главное, что периодический график был. Просто когда я задавал шаг 0,1(как в програаму), то график резко вверх уходил. А когда 0,001, то периодический. Если что исследование проводил так:
1. Имеем существенно-нелинейное дифференциальное уравнение второго порядка с граничными условиями, каковое нужно решить.
2. Решение сводится прежде всего к преобразованию уравнения второго порядка к системе уравнений первого порядка. Делается это так.
а) Исходное уравнение:
d²q/dt² = exp(-q)(exp(-q)-1)
б) Вводим новую переменную v = dq/dt
в) Записываем систему
dv/dt = exp(-q)(exp(-q)-1) = f(q)
dq/dt = v = g(v)

3. Решаем систему численно. Поскольку нам предлагается использовать простой метод второго порядка, то воспользуемся простым (немодифицированным) методом Эйлера. Тут так.
а) Задаем шаг по времени Δt.
б) Допустим, мы знаем значения функций q(t) и v(t) для какого-то i-того значения t, т.е. мы знаем q(ti) и v(ti). Тогда мы определяем значения q(ti+Δt) и v(ti+Δt), как
v(ti+Δt) = v(ti) + f(q(ti))*Δt
q(ti+Δt) = q(ti) + g(v(ti))*Δt
в) Стартуя от данных начальных условий, строим функции и графики q(t) и v(t).
Вот тут и в программе я использовал метод интегрирования первого порядка. А нужно ходяб второго. Я в интегрировании не силен( и никак не выходит сделать как надо
0
Модератор
Эксперт по электронике
7762 / 3911 / 1504
Регистрация: 01.02.2015
Сообщений: 12,067
Записей в блоге: 2
07.03.2015, 01:58 4
Из
https://www.cyberforum.ru/cgi-bin/latex.cgi?y''=f(t,y,y')
получим
https://www.cyberforum.ru/cgi-bin/latex.cgi?\left\{\begin{matrix}<br />
\\y=y_1<br />
\\ {y'}_{1}=y_2=f_1(t,y_1,y_2)<br />
\\{y'}_{2}=f_2(t,y_1,y_2)=f(t,y,y')<br />
\end{matrix}\right.
а потом
https://www.cyberforum.ru/cgi-bin/latex.cgi?\left\{\begin{matrix}<br />
\\ {y'}_{1}=f_1(t,y_1,y_2)<br />
\\{y'}_{2}=f_2(t,y_1,y_2)<br />
\end{matrix}\right.
Методом Рунге-Кутты 4 порядка
https://www.cyberforum.ru/cgi-bin/latex.cgi?\left\{\begin{matrix}<br />
\\ y_1(t+h)=y_1(t)+\frac{h}{6}(k_1+2*k_2+2*k_3+k_4)<br />
\\y_2(t+h)=y_2(t)+\frac{h}{6}(m_1+2*m_2+2*m_3+m_4)<br />
\end{matrix}\right.
где
https://www.cyberforum.ru/cgi-bin/latex.cgi?\left\{\begin{matrix}<br />
\\ k_1=f_1(t,y_1(t),y_2(t))<br />
\\ m_1=f_2(t,y_1(t),y_2(t))<br />
\\ k_2=f_1(t+\frac{h}{2},y_1(t)+\frac{k_1}{2},y_2(t)+\frac{m_1}{2})<br />
\\ m_2=f_2(t+\frac{h}{2},y_1(t)+\frac{k_1}{2},y_2(t)+\frac{m_1}{2})<br />
\\ k_3=f_1(t+\frac{h}{2},y_1(t)+\frac{k_2}{2},y_2(t)+\frac{m_2}{2})<br />
\\ m_3=f_2(t+\frac{h}{2},y_1(t)+\frac{k_2}{2},y_2(t)+\frac{m_2}{2})<br />
\\ k_4=f_1(t+h,y_1(t)+k_3,y_2(t)+m_3)<br />
\\ m_4=f_2(t+h,y_1(t)+k_3,y_2(t)+m_3)<br />
\end{matrix}\right.
Как определялось ранее
https://www.cyberforum.ru/cgi-bin/latex.cgi?\left\{\begin{matrix}<br />
\\ f_1(t,y_1,y_2)=y_2<br />
\\ f_2(t,y_1,y_2)=f(t,y_1,y_2)<br />
\end{matrix}\right.
Это дал поиск по "Рунге Кутта"

Добавлено через 9 минут
-----------------------------------
Для решения можно воспользоваться каркасом, который я набросал для дифура 1-го порядка - т.к. в твоём первом посте не было ни слова о порядке дифура.
Pascal
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
program RungeKutta4;
 
  function f(t, y: real): real;
  begin
    f := exp(-t) * (exp(-t) - 1);
  end;
 
  procedure RungeKutta4Step(var t, y: real; h: real);
  var
    k1, k2, k3, k4: real;
  begin
    k1 := f(t, y);
    k2 := f(t + (h / 2), y + k1 * (h / 2));
    k3 := f(t + (h / 2), y + k2 * (h / 2));
    k4 := f(t + h, y + k3 * h);
    y  := y + (k1 + 2 * k2 + 2 * k3 + k4) * h / 6;
    t  := t + h;
  end;
 
  procedure RungeKutta4(t0, tfin, h, y0: real; var yfin: real; Show: boolean);
  var
    t: real;
    y: real;
  begin
    t := t0;
    y := y0;
    if Show then
      writeln('y(', t: 12: 5, ')=', y: 12: 5);
    while t <= tfin do
    begin
      RungeKutta4Step(t, y, h);
      if Show then
        writeln('y(', t: 12: 5, ')=', y: 12: 5);
    end;
    yfin := y;
  end;
 
  procedure Differ(t0, tfin, y0: real; eps: real);
  var
    h: real;
    y1, y2: real;
  begin
    h := (tfin - t0) / 1;
    RungeKutta4(t0, tfin, h, y0, y2, False);
    repeat
      y1 := y2;
      h  := h / 2;
      RungeKutta4(t0, tfin, h, y0, y2, False);
    until abs(y2 - y1) < eps;
    RungeKutta4(t0, tfin, h, y0, y2, True);
  end;
 
begin
  Differ(0, 35, -0.5, 0.001);
end.
Надеюсь, что ты сможешь скорректировать под дифур 2-го порядка.
1
1 / 1 / 0
Регистрация: 21.12.2014
Сообщений: 10
07.03.2015, 13:53  [ТС] 5
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Для решения можно воспользоваться каркасом, который я набросал для дифура 1-го порядка - т.к. в твоём первом посте не было ни слова о порядке дифура.
О, спасибо большое =). Только правда было бы лучше просто второго порядка. Мне сказали, чтоб изменил программу немного и добавил пару строк в нее. А тут она полностью изменена. И чтоб в файл выводилась, как у меня в первом варианте. А можно просто в моей программе сделать так, чтоб изменив несколько строк реализовался метод интегрирования второго порядка. Извиняюсь за наглость конечно.
0
Модератор
Эксперт по электронике
7762 / 3911 / 1504
Регистрация: 01.02.2015
Сообщений: 12,067
Записей в блоге: 2
07.03.2015, 14:25 6
Цитата Сообщение от kot64rus Посмотреть сообщение
А можно просто в моей программе сделать так, чтоб изменив несколько строк реализовался метод интегрирования второго порядка.
Наверное...

Я не пойму "2-го порядка" относится к методу или к уравнению. Но независимо от этого, все изменения будут локализованы в RungeKutta4Step, теперь там нужно добавить вычисления для 2-й производной, а также во всех процедурах решения добавить значение 1-й производной в точке t0 (начальные условия задачи Коши). Ещё, если будет использован другой метод решения, то потребуется переименовать RungeKutta4Step в Xxxx2Step.

А приведённую в посте №1 прогу не очень хочется модифицировать. Она рабочая, но нескладная, не расширяемая. Если я начну её переделывать - она сильно изменится.

В общем попробуй какой-либо другой вариант - свою новую или переделать одну из имеющихся... Математическая модель уже есть, осталось только в "железе" воплотить.
0
1 / 1 / 0
Регистрация: 21.12.2014
Сообщений: 10
07.03.2015, 14:36  [ТС] 7
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Я не пойму "2-го порядка" относится к методу или к уравнению.
К методу интегрирования второго порядка.
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
В общем попробуй какой-либо другой вариант - свою новую или переделать одну из имеющихся...
Вы правы, наверное лучше новую.

А можно тогда код для программы для этой задачи с методом интегрирования второго порядка? И чтоб с выводом в текстовый файл результаты
0
1 / 1 / 0
Регистрация: 21.12.2014
Сообщений: 10
07.03.2015, 14:44  [ТС] 8
Ну еще такой график получался, когда я делал программу первый раз с шагом 0,001. И вот нужно бы только с методом интегрирования второго порядка программу и график похожий должен получиться
Миниатюры
Изменить программу интегрирования методом второго порядка  
0
Модератор
Эксперт по электронике
7762 / 3911 / 1504
Регистрация: 01.02.2015
Сообщений: 12,067
Записей в блоге: 2
07.03.2015, 15:45 9
1. Вывод в текстовый файл по образу и подобию
Pascal
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
procedure RungeKutta4(t0, tfin, h, y0: real; var yfin: real; Show: boolean);
  var
    t: real;
    y: real;
    f: Text;
  begin
    t := t0;
    y := y0;
    if Show then
    begin
      Assign(f, 'Result.txt');
      Rewrite(f);
    end;
    if Show then
      writeln(f, 'y(', t: 12: 5, ')=', y: 12: 5);
    while t <= tfin do
    begin
      RungeKutta4Step(t, y, h);
      if Show then
        writeln(f, 'y(', t: 12: 5, ')=', y: 12: 5);
    end;
    yfin := y;
    if Show then
      Close(f);
  end;
2. Не соображу, как можно нарисовать график.
3. Попробуй реализовать хоть как-нибудь решение, т.к. пока нечего строить.
0
1 / 1 / 0
Регистрация: 21.12.2014
Сообщений: 10
07.03.2015, 17:28  [ТС] 10
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
2. Не соображу, как можно нарисовать график.
Ах да. Задание тут такое было:
Составить программу интегрирования методом второго порядка
Я уже когда то писал сюда, но потом вроде разобрался.
Там в задании надо построить 2 графика зависимости V(t) и Q(t), проинтегрировава численно уравнение. Все у меня получилось, но преподователь сказал, что я проинтегрировал первым порядком, а нужно хотябы вторым. Вот и думаю...а как можно ее написать так...Программа должна вывести текстовый файл(скину его). В нем должно быть 3 столбца:1)шаг по времени, который задаем;2)Q;3)V. После этого запускаем любой графический редактор(я пользовался гнуплотом) и строим 2 графика q(t) и v(t). График, что скидывал, он практически верный, надо было изменить задачу, использовава метод интегрирования второго порядка
Вложения
Тип файла: rar Result1.rar (38.3 Кб, 6 просмотров)
0
Модератор
Эксперт по электронике
7762 / 3911 / 1504
Регистрация: 01.02.2015
Сообщений: 12,067
Записей в блоге: 2
07.03.2015, 21:57 11
В общем смотри. Всё то же самое, только модифицированный метод Эйлера (по схеме прогноз-коррекция). Формулы - на русской странице Wikipedia.
Вывод t,y,y',y'' в файл организуешь самостоятельно - это не сложно.
Pascal
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
{
Решение ОДУ 2 порядка модифицированным методом
Эйлера по формуле прогноз+коррекция.
 
Вид ОДУ
y''=f(t, y, y')
 
Обозначения в программе
dy  - y'
ddy - y''
Приводим исходное ОДУ к системе
y1=y
y1'=y2=f1(t, y1, y2)
y2'=y''=f2(t, y1, y2)=f(t, y, y')
 
y1'=f1(t, y1, y2)
y2'=f2(t, y1, y2)
где
f1(t, y1, y2)=y2
f2(t, y1, y2)=f(t, y1, y2)
}
program EulerMethodModificated;
 
  function f(t, y, dy: real): real;
  begin
    f := -sin(t);
  end;
 
  function f1(t, y, dy: real): real;
  begin
    f1 := dy;
  end;
 
  function f2(t, y, dy: real): real;
  begin
    f2 := f(t, y, dy);
  end;
 
  procedure EulerModStep(var t, y1, y2: real; h: real);
  var
    y1p, k1, k2: real;
    y2p, m1, m2: real;
  begin
    y1p := y1 + h * f1(t, y1, y2);
    k1  := f1(t, y1, y2);
    k2  := f1(t, y1p, y2);
    y2p := y2 + h * f2(t, y1, y2);
    m1  := f2(t, y1, y2);
    m2  := f2(t, y1, y2p);
 
    y1 := y1 + (k1 + k2) * h / 2;
    y2 := y2 + (m1 + m2) * h / 2;
    t  := t + h;
  end;
 
  procedure SolveODE2(t0, tfin, h, y0, dy0: real; var yfin: real;
    Show: boolean; Nprint: integer);
  var
    t: real;
    y, dy: real;
    Tprint: real;
  begin
    t  := t0;
    y  := y0;
    dy := dy0;
    if Show then
    begin
      writeln('y(', t: 12: 5, ')=', y: 12: 5);
      Tprint := (tfin - t0) / Nprint + t0;
    end;
    while t <= tfin do
    begin
      EulerModStep(t, y, dy, h);
      if Show and (t >= Tprint) then
      begin
        writeln('y(', t: 12: 5, ')=', y: 12: 5);
        Tprint := Tprint + (tfin - t0) / Nprint;
      end;
    end;
    yfin := y;
  end;
 
  procedure Differ(t0, tfin, y0, dy0: real; eps: real);
  var
    h: real;
    y1, y2: real;
  begin
    h := (tfin - t0) / 10;
    SolveODE2(t0, tfin, h, y0, dy0, y2, False, 0);
    repeat
      y1 := y2;
      h  := h / 2;
      SolveODE2(t0, tfin, h, y0, dy0, y2, False, 0);
    until (abs(y2 - y1) < eps) or (h < eps / 1000);
    SolveODE2(t0, tfin, h, y0, dy0, y2, True, 10);
  end;
 
begin
  Differ(0, 3.5 * 5, 0, 1, 0.01);
end.
0
1 / 1 / 0
Регистрация: 21.12.2014
Сообщений: 10
08.03.2015, 22:25  [ТС] 12
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
В общем смотри. Всё то же самое, только модифицированный метод Эйлера (по схеме прогноз-коррекция). Формулы - на русской странице Wikipedia.
Вывод t,y,y',y'' в файл организуешь самостоятельно - это не сложно.
Хорошо. Спасибо большое.
0
Модератор
8685 / 4339 / 2979
Регистрация: 17.08.2012
Сообщений: 13,808
09.03.2015, 18:59 13
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
А если не секрет - какой период у функции Exp(-Q_old)*(Exp(-Q_old)-1)?
Не секрет. Основной период данной функции чисто комплексный и равен π∙i, где i - мнимая единица.
1
Модератор
Эксперт по электронике
7762 / 3911 / 1504
Регистрация: 01.02.2015
Сообщений: 12,067
Записей в блоге: 2
09.03.2015, 19:10 14
Спасибо. Я, действительно, уже забыл, как дифуры решаются. Там же ещё кроме вынужденных, входит и решение для свободных колебаний (подзабыл правильную терминологию).
0
1 / 1 / 0
Регистрация: 21.12.2014
Сообщений: 10
09.03.2015, 20:46  [ТС] 15
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
В общем смотри. Всё то же самое, только модифицированный метод Эйлера (по схеме прогноз-коррекция). Формулы - на русской странице Wikipedia.
Вывод t,y,y',y'' в файл организуешь самостоятельно - это не сложно.
Все, я программу написал. Все получилось вроде бы правильно. Использовал метод Рунге-Кутты 4 порядка
0
Модератор
Эксперт по электронике
7762 / 3911 / 1504
Регистрация: 01.02.2015
Сообщений: 12,067
Записей в блоге: 2
09.03.2015, 20:54 16
Ну и хорошо.

[не по теме] А ты ещё упоминал gnuplot. Ты графики из командной строки формировал или какая-то GUI-оболочка есть?
0
1 / 1 / 0
Регистрация: 21.12.2014
Сообщений: 10
09.03.2015, 21:06  [ТС] 17
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
[не по теме] А ты ещё упоминал gnuplot. Ты графики из командной строки формировал или какая-то GUI-оболочка есть?
Программа, как я уже говорил, выдавала текстовый файл с 3 столбцами чисел(шаг, Q и V). Я в гнуплоте забивал: plot 'result3.txt' u 1:2 w linesp, 'result3.txt' u 1:3 w linesp. Где: 'result3.txt' - этот файл, u 1:2 - построить график по 1 и 2 стобцу, u 1:3 - по 1 и 3 столбцу, w linesp - чтоб точки графика соединять отрезками. И он сторил графики. А чтоб он мне сразу график в файл выводил я прописывал:
gnuplot > set terminal png size 1366, 768
gnuplot > set output 'graph.png'
gnuplot > plot 'result3.txt' u 1:2 w linesp, 'result3.txt' u 1:3 w linesp
И получается такой вот график наподобии того, что кидал выше
1
Модератор
Эксперт по электронике
7762 / 3911 / 1504
Регистрация: 01.02.2015
Сообщений: 12,067
Записей в блоге: 2
09.03.2015, 21:22 18
Спасибо.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.03.2015, 21:22

Построить область интегрирования и изменить порядок интегрирования(Проверить решение)
Все ли верно решено и оформлено? Построить область интегрирования и изменить порядок...

Решение ЛДУ второго порядка методом прогонки
решение лду второго порядка методом прогонки

Изменить порядок интегрирования. Построить область интегрирования и вычислить двойной интеграл двумя способами
Изменить порядок интегрирования. Построить область интегрирования и вычислить двойной интеграл...

Изменить порядок интегрирования. Область интегрирования изобразить на чертеже
Изменить порядок интегрирования. Область интегрирования изобразить на чертеже


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru