Форум программистов, компьютерный форум, киберфорум
Matlab
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.96/50: Рейтинг темы: голосов - 50, средняя оценка - 4.96
9 / 0 / 0
Регистрация: 29.11.2013
Сообщений: 3

Решить систему ДУ методом Рунге-Кутта с апостериорным расчетом шага

03.12.2013, 13:20. Показов 10565. Ответов 15
Метки faq+ (Все метки)

Студворк — интернет-сервис помощи студентам
необходимо вычислить значение системы ОДУ с помощью метода Рунге-Кутта 4 порядка ручным способом(т.е. написать ее самому)
с апостериорным выбором шага(вот собственно тут собака то и зарыта)
суть метода описана в прилагающемся файле на с.161-162

прошу объяснить суть метода выбора шага
Вложения
Тип файла: 7z Formalev_CHislennye_metody.7z (1.39 Мб, 177 просмотров)
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.12.2013, 13:20
Ответы с готовыми решениями:

Как решить систему ДУ для системы маятников методом Рунге-Кутта?
Помогите, пожалуйста! Не работает программа. Суть задания - решить систему ДУ для системы маятников. Не понимаю, почему не работает -...

Решить методом Эйлера и методом Рунге-кутта
помогите решить систему ОДУ в маткаде, уже убил пару дней на решение не получается ничего.

Методом Рунге-Кутта решить задачу Коши
Здравствуйте! Нужна ваша помощь! Нужно методом Рунге-Кутта с шагом h=0,1 и е=0,01 решить задачу Коши. в учебнике дано это: y(0)=0; x...

15
 Аватар для Зосима
5245 / 3573 / 379
Регистрация: 02.04.2012
Сообщений: 6,477
Записей в блоге: 18
04.12.2013, 17:36
Yusaki, с тебя магарыч!
скажи спасибо этой няше: Методы Эйлера и Рунге-Кутта
Matlab M
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
clear, clc
% Программа решения методом Рунге-Кутты 4-го порядка
% системы дифференциальных уравнений
% y1' = f1(x,y1,y2)
% y2' = f2(x,y1,y2)
% с начальными условиями y1(0)=y10 и y2(0)=y20
% на интервале [a,b] с перемеенным шагом h
% и точностью eps
% функции правой части
f1 = @(x,y1,y2) -2*y1 + 5*y2 - x;
f2 = @(x,y1,y2) 3*y1 - exp(y2);
y10 = 1;
y20 = 0;
a = -2; % нижняя граница диапазона
b = 5; % верхняя граница диапазона
eps = 0.05; % точность
h = (b-a)/100; % начальное значение шага
X = a; % начальное значение времени
Y1 = y10; % 1-я компонента вектора решения 1-го уравнения системы
Y2 = y20 ; % 1-я компонента вектора решения 2-го уравнения системы
 
% решение системы методом Рунге-Кутты 4-го порядка
i = 1; k = 0;
while X(end) <= b
    % решение первого уравнения системы
    while 1
        % считаем с исходным шагом
        K1 = h*f1( X(i),Y1(i),Y2(i) );
        L1 = h*f2( X(i),Y1(i),Y2(i) );
        K2 = h*f1( X(i)+h/2, Y1(i)+K1/2, Y2(i)+L1/2);
        L2 = h*f2( X(i)+h/2, Y1(i)+K1/2, Y2(i)+L1/2);
        K3 = h*f1( X(i)+h/2, Y1(i)+K2/2, Y2(i)+L2/2);
        L3 = h*f2( X(i)+h/2, Y1(i)+K2/2, Y2(i)+L2/2);
        K4 = h*f1( X(i)+h, Y1(i)+K3, Y2(i)+L3);
        L4 = h*f2( X(i)+h, Y1(i)+K3, Y2(i)+L3);
        y11 = Y1(i) + (K1 + 2*K2 + 2*K3 + K4)/6;
        y12 = Y2(i) + (L1 + 2*L2 + 2*L3 + L4)/6;
        
        
        h = h/2; % уменьшаем шаг в двое
        K1 = h*f1( X(i),Y1(i),Y2(i) );
        L1 = h*f2( X(i),Y1(i),Y2(i) );
        K2 = h*f1( X(i)+h/2, Y1(i)+K1/2, Y2(i)+L1/2);
        L2 = h*f2( X(i)+h/2, Y1(i)+K1/2, Y2(i)+L1/2);
        K3 = h*f1( X(i)+h/2, Y1(i)+K2/2, Y2(i)+L2/2);
        L3 = h*f2( X(i)+h/2, Y1(i)+K2/2, Y2(i)+L2/2);
        K4 = h*f1( X(i)+h, Y1(i)+K3, Y2(i)+L3);
        L4 = h*f2( X(i)+h, Y1(i)+K3, Y2(i)+L3);
        y21 = Y1(i) + (K1 + 2*K2 + 2*K3 + K4)/6;
        y22 = Y2(i) + (L1 + 2*L2 + 2*L3 + L4)/6;
        
        if max(abs([y11-y21, y12-y22])) > eps % Если разность больше точности
            h = h/2; % уменьшаем шаг
        else % если подходит
            h = 2*h; % возвращаем взад
            % берем первые значения приращения
            X(i+1) = X(i) + h;
            Y1(i+1) = y11;
            Y2(i+1) = y12;
            break
        end
    end
    i = i+1;
    h = 2*h; % увеличиваем шаг для следующей итерации
    k = k+1; % счетчик итераций
    if k > 10000
        disp('Решение не найдено (превышен лимит итераций)')
        break
    end
end
 
plot(X,Y1,X,Y2) % построение графика
grid on % наложение сетки
legend('y1(x)','y2(x)'); % подпись кривых
title('Метод Рунге-Кутты 4-го порядка') % заголовок окна
xlabel('X') % надпись по оси X
ylabel('Y') % надпись по оси Y


Вот какая красота получается:

2
9 / 0 / 0
Регистрация: 29.11.2013
Сообщений: 3
05.12.2013, 08:28  [ТС]
Огромнейшее спасибо! вы меня спасли!
0
0 / 0 / 0
Регистрация: 01.05.2014
Сообщений: 2
01.05.2014, 17:25
Здравствуйте.
Система из 206 ОДУ Колмогорова. Пытаюсь найти ее более-менее точное решение, но не получается.
Дело в том, что интервал у меня [0 32000], а коэффициенты в уравнениях меняются от 0,00001 до 10000.
С помощью ode45 ждал 4 дня на своем core i3 с 4 ГБ оперативки, но так и не дождался, выключил, думая, что завис совсем (на селероне с 2 ГБ оперативки выдает ошибку отсутствия памяти). С помощью ode23s, ode23tb mathlab решает за несколько десятков секунд, но результат уж очень огорчает: ошибка очень сильно накапливается и для системы, у которой сумма вероятностей ее нахождения в каждом из состояний (206 штук) в некоторый момент времени должна быть всегда равна единице, уже вблизи 20000 близка к нулю. Это же не приемлемо в принципе!!! Или mathlab мне не поможет? Что делать? Если кто сталкивался с такой ситуацией, откликнитесь!
Заранее благодарен за ответ.
0
1 / 1 / 0
Регистрация: 28.01.2014
Сообщений: 226
13.03.2019, 13:46
Всем доброго времени суток!

у меня та же проблема: Решение дифф. уравнения с автоматическим выбором шага интегрирования.

В сети пишут, что самым простым считается алгоритм выбора с помощью удвоения или деления шага пополам, т.е. делаем вычисление с шагом h и и два раза с шагом h/2 и, вычитая эти два значения, находим локальную погрешность, а относительно нее регулируем шаг интегрирования.

Зосима написал как раз код, который отражает этот метод. Но по коду я вижу, что сначала вычисления производится с шагом h, а потом с шагом h/2 и тут же сравниваются эти два значения, что неправильно, так как с шагом h/2 необходимо делать вычисления 2 раза, а потом уже сравнивать. Подскажите, пожалуйста, я правильно понял данный код?)
1
Эксперт по математике/физике
 Аватар для SSC
3390 / 1913 / 571
Регистрация: 09.04.2015
Сообщений: 5,365
13.03.2019, 15:39
Цитата Сообщение от Alex7421 Посмотреть сообщение
что сначала вычисления производится с шагом h, а потом с шагом h/2 и тут же сравниваются эти два значения, что неправильно, так как с шагом h/2 необходимо делать вычисления 2 раза, а потом уже сравнивать.
Да, Вы правы. 5 с половиной лет назад Зосима еще молодой был и ошибки не заметил
0
1 / 1 / 0
Регистрация: 28.01.2014
Сообщений: 226
13.03.2019, 16:16
)) вот и я, когда первый раз код писал, тоже не заметил)

Подскажите, пжл, как же тогда исправить код, чтобы было правильно? Как посчитать еще раз функцию с шагом h/2 в той же итерации?
0
Эксперт по математике/физике
 Аватар для SSC
3390 / 1913 / 571
Регистрация: 09.04.2015
Сообщений: 5,365
14.03.2019, 07:40
Так допишите еще один блок интегрирования на шаг h/2 (строки 41-50) заменив Y1(i) и Y2(i) соответственно y21 и y22/
Кроме этого вместо X(i) надо сместиться на пол шага X(i)+h
1
1 / 1 / 0
Регистрация: 28.01.2014
Сообщений: 226
14.03.2019, 23:27
Ну, вот такой код получился)

Matlab M
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
clear, clc
% Программа решения методом Рунге-Кутты 4-го порядка
% системы дифференциальных уравнений
% y1' = f1(x,y1,y2)
% y2' = f2(x,y1,y2)
% с начальными условиями y1(0)=y10 и y2(0)=y20
% на интервале [a,b] с перемеенным шагом h
% и точностью eps
% функции правой части
f1 = @(x,y1,y2) -2*y1 + 5*y2 - x;
f2 = @(x,y1,y2) 3*y1 - exp(y2);
y10 = 1;
y20 = 0;
a = -2; % нижняя граница диапазона
b = 5; % верхняя граница диапазона
eps = 0.00005; % точность
h = (b-a)/100; % начальное значение шага
 
X = a; % начальное значение времени
Y1 = y10; % 1-я компонента вектора решения 1-го уравнения системы
Y2 = y20 ; % 1-я компонента вектора решения 2-го уравнения системы
 
% решение системы методом Рунге-Кутты 4-го порядка
i = 1; k = 0;
while X(end) <= b
    % решение первого уравнения системы
    while 1
        % считаем с исходным шагом
        K1 = h*f1( X(i),Y1(i),Y2(i) );
        L1 = h*f2( X(i),Y1(i),Y2(i) );
        K2 = h*f1( X(i)+h/2, Y1(i)+K1/2, Y2(i)+L1/2);
        L2 = h*f2( X(i)+h/2, Y1(i)+K1/2, Y2(i)+L1/2);
        K3 = h*f1( X(i)+h/2, Y1(i)+K2/2, Y2(i)+L2/2);
        L3 = h*f2( X(i)+h/2, Y1(i)+K2/2, Y2(i)+L2/2);
        K4 = h*f1( X(i)+h, Y1(i)+K3, Y2(i)+L3);
        L4 = h*f2( X(i)+h, Y1(i)+K3, Y2(i)+L3);
        y11 = Y1(i) + (K1 + 2*K2 + 2*K3 + K4)/6;
        y12 = Y2(i) + (L1 + 2*L2 + 2*L3 + L4)/6;
        
        
        h = h/2; % уменьшаем шаг в двое
        K1 = h*f1( X(i),Y1(i),Y2(i) );
        L1 = h*f2( X(i),Y1(i),Y2(i) );
        K2 = h*f1( X(i)+h/2, Y1(i)+K1/2, Y2(i)+L1/2);
        L2 = h*f2( X(i)+h/2, Y1(i)+K1/2, Y2(i)+L1/2);
        K3 = h*f1( X(i)+h/2, Y1(i)+K2/2, Y2(i)+L2/2);
        L3 = h*f2( X(i)+h/2, Y1(i)+K2/2, Y2(i)+L2/2);
        K4 = h*f1( X(i)+h, Y1(i)+K3, Y2(i)+L3);
        L4 = h*f2( X(i)+h, Y1(i)+K3, Y2(i)+L3);
        y21 = Y1(i) + (K1 + 2*K2 + 2*K3 + K4)/6;
        y22 = Y2(i) + (L1 + 2*L2 + 2*L3 + L4)/6;
        
        X(i)=X(i)+h;
        
        K1 = h*f1( X(i),Y1(i),Y2(i) );
        L1 = h*f2( X(i),Y1(i),Y2(i) );
        K2 = h*f1( X(i)+h/2, Y1(i)+K1/2, Y2(i)+L1/2);
        L2 = h*f2( X(i)+h/2, Y1(i)+K1/2, Y2(i)+L1/2);
        K3 = h*f1( X(i)+h/2, Y1(i)+K2/2, Y2(i)+L2/2);
        L3 = h*f2( X(i)+h/2, Y1(i)+K2/2, Y2(i)+L2/2);
        K4 = h*f1( X(i)+h, Y1(i)+K3, Y2(i)+L3);
        L4 = h*f2( X(i)+h, Y1(i)+K3, Y2(i)+L3);
        y21 = y21 + (K1 + 2*K2 + 2*K3 + K4)/6;
        y22 = y22 + (L1 + 2*L2 + 2*L3 + L4)/6;
        
        X(i)=X(i)-h;
        
        if max(abs([y12-y22])) > eps % Если разность больше точности
            h = h/2; % уменьшаем шаг
        else % если подходит
            h = 2*h; % возвращаем взад
            % берем первые значения приращения
            X(i+1) = X(i) + h;
            Y1(i+1) = y11;
            Y2(i+1) = y12;
            break
        end
    end
    i = i+1;
    h = 2*h; % увеличиваем шаг для следующей итерации
    
        k = k+1; % счетчик итераций
    if k > 10000
        disp('Решение не найдено (превышен лимит итераций)')
        break
    end
end
 
plot(X,Y1,X,Y2) % построение графика
grid on % наложение сетки
legend('y1(x)','y2(x)'); % подпись кривых
title('Метод Рунге-Кутты 4-го порядка') % заголовок окна
xlabel('X') % надпись по оси X
ylabel('Y') % надпись по оси Y
Вроде все получилось, вот только не пойму, почему график выходит за пределы диапазона на один шаг интегрирования?
Миниатюры
Решить систему ДУ методом Рунге-Кутта с апостериорным расчетом шага  
0
Эксперт по математике/физике
 Аватар для SSC
3390 / 1913 / 571
Регистрация: 09.04.2015
Сообщений: 5,365
15.03.2019, 10:38
Лучший ответ Сообщение было отмечено Зосима как решение

Решение

Цитата Сообщение от Alex7421 Посмотреть сообщение
почему график выходит за пределы диапазона на один шаг интегрирования?
Это не основная беда, хуже то, что Вы не выполнил рекомендации
Цитата Сообщение от SSC Посмотреть сообщение
заменив Y1(i) и Y2(i) соответственно y21 и y22
Так же проблемы с зацикливанием.
Ну и в конце расчетного шага лучше присваивать результат расчета с половинным шагом, он точнее
Ну и добавлена проверка стандартным слвером

Matlab M
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
101
102
clear all; clc; close all;
% Программа решения методом Рунге-Кутты 4-го порядка
% системы дифференциальных уравнений
% y1' = f1(x,y1,y2)
% y2' = f2(x,y1,y2)
% с начальными условиями y1(0)=y10 и y2(0)=y20
% на интервале [a,b] с перемеенным шагом h
% и точностью eps
% функции правой части
f1 = @(x,y1,y2) -2*y1 + 5*y2 - x;
f2 = @(x,y1,y2) 3*y1 - exp(y2);
y10 = 1;
y20 = 0;
a = -2; % нижняя граница диапазона
b = 5; % верхняя граница диапазона
eps = 0.00005; % точность
h = (b-a)/100; % начальное значение шага
 
X = a; % начальное значение времени
Y1 = y10; % 1-я компонента вектора решения 1-го уравнения системы
Y2 = y20 ; % 1-я компонента вектора решения 2-го уравнения системы
 
% решение системы методом Рунге-Кутты 4-го порядка
i = 1; k = 0;
while (X(end) < b) & k<10000
    % решение первого уравнения системы
    while 1
        % считаем с исходным шагом
        K1 = h*f1( X(i),Y1(i),Y2(i) );
        L1 = h*f2( X(i),Y1(i),Y2(i) );
        K2 = h*f1( X(i)+h/2, Y1(i)+K1/2, Y2(i)+L1/2);
        L2 = h*f2( X(i)+h/2, Y1(i)+K1/2, Y2(i)+L1/2);
        K3 = h*f1( X(i)+h/2, Y1(i)+K2/2, Y2(i)+L2/2);
        L3 = h*f2( X(i)+h/2, Y1(i)+K2/2, Y2(i)+L2/2);
        K4 = h*f1( X(i)+h, Y1(i)+K3, Y2(i)+L3);
        L4 = h*f2( X(i)+h, Y1(i)+K3, Y2(i)+L3);
        y11 = Y1(i) + (K1 + 2*K2 + 2*K3 + K4)/6;
        y12 = Y2(i) + (L1 + 2*L2 + 2*L3 + L4)/6;
        
        
        h = h/2; % уменьшаем шаг в двое
        K1 = h*f1( X(i),Y1(i),Y2(i) );
        L1 = h*f2( X(i),Y1(i),Y2(i) );
        K2 = h*f1( X(i)+h/2, Y1(i)+K1/2, Y2(i)+L1/2);
        L2 = h*f2( X(i)+h/2, Y1(i)+K1/2, Y2(i)+L1/2);
        K3 = h*f1( X(i)+h/2, Y1(i)+K2/2, Y2(i)+L2/2);
        L3 = h*f2( X(i)+h/2, Y1(i)+K2/2, Y2(i)+L2/2);
        K4 = h*f1( X(i)+h, Y1(i)+K3, Y2(i)+L3);
        L4 = h*f2( X(i)+h, Y1(i)+K3, Y2(i)+L3);
        y21 = Y1(i) + (K1 + 2*K2 + 2*K3 + K4)/6;
        y22 = Y2(i) + (L1 + 2*L2 + 2*L3 + L4)/6;
        
        X(i)=X(i)+h;
        
        K1 = h*f1( X(i),y21,y22 );
        L1 = h*f2( X(i),y21,y22 );
        K2 = h*f1( X(i)+h/2, y21+K1/2, y22+L1/2);
        L2 = h*f2( X(i)+h/2, y21+K1/2, y22+L1/2);
        K3 = h*f1( X(i)+h/2, y21+K2/2, y22+L2/2);
        L3 = h*f2( X(i)+h/2, y21+K2/2, y22+L2/2);
        K4 = h*f1( X(i)+h, y21+K3, y22+L3);
        L4 = h*f2( X(i)+h, y21+K3, y22+L3);
        y21 = y21 + (K1 + 2*K2 + 2*K3 + K4)/6;
        y22 = y22 + (L1 + 2*L2 + 2*L3 + L4)/6;
        
        X(i)=X(i)-h;
        
        if max(abs([y12-y22])) > eps % Если разность больше точности
            h = h/2; % уменьшаем шаг
        else % если подходит
            h = 2*h; % возвращаем взад
            % берем первые значения приращения
            X(i+1) = X(i) + h;
            Y1(i+1) = y21;
            Y2(i+1) = y22;
            if X(i+1)+h>b
                h=b-X(i+1);
            end
            break
        end
        k = k+1; % счетчик итераций
        if k > 10000
            disp('Решение не найдено (превышен лимит итераций)')
            break
        end
    end
    i = i+1;
    h = 2*h; % увеличиваем шаг для следующей итерации
    
end
 
plot(X,Y1,X,Y2) % построение графика
grid on % наложение сетки
legend('y1(x)','y2(x)'); % подпись кривых
title('Метод Рунге-Кутты 4-го порядка') % заголовок окна
xlabel('X') % надпись по оси X
ylabel('Y') % надпись по оси Y
 
[X,Y]=ode45(@(x,y) [-2*y(1) + 5*y(2) - x; 3*y(1) - exp(y(2))],[a:0.1:b],[y10 y20]);
figure
plot(X,Y)
grid on
1
1 / 1 / 0
Регистрация: 28.01.2014
Сообщений: 226
15.03.2019, 14:06
Да вроде все выполнил)

Правда, не догадался Y1(i+1) и Y2(i+1) присвоить значения, вычисленные при шаге h/2, действительно, так получается точнее)

Matlab M
1
2
3
            X(i+1) = X(i) + h;
            Y1(i+1) = y21;
            Y2(i+1) = y22;
Вроде все работает со сложными примерами, правда, данный код плохо справляется с простыми функциями, например, f=x. В конце диапазона шаг становится слишком большим

Не подскажете, если еще какие-нибудь методы выбора автоматического шага?
0
Эксперт по математике/физике
 Аватар для SSC
3390 / 1913 / 571
Регистрация: 09.04.2015
Сообщений: 5,365
15.03.2019, 14:31
Цитата Сообщение от Alex7421 Посмотреть сообщение
Да вроде все выполнил)
Сравните внимательно мой и Ваш код интегрирования на втором половинном шаге.
Цитата Сообщение от Alex7421 Посмотреть сообщение
конце диапазона шаг становится слишком большим
На функциях близких к линейным это вполне допустим. Если проблема в том, что Вам нужны промежуточные точки, тогда надо вводить понятие шага вывода результатов и далее два варианта.
Или не разрешаете шагу интегрирования быть больше шага вывода результатов.
Или более сложно то обеспечиваете вычисление во всех точках вывода результатов.
Цитата Сообщение от Alex7421 Посмотреть сообщение
еще какие-нибудь методы выбора автоматического шага
Реализованный метод слишком затратный по количеству вычислений значений производных.
Как-то видел метод косвенной оценки определения точности расчета в конце каждого шага интегрирования (но численно не проверял и книги сейчас под рукой нет).
Есть также многошаговые методы (например Адамса-Мултона, реализующий метод прогноза-коррекции, в котором по величине коррекции можно оценивать точность решения на шаге интегрирования и принимать решения по увеличению или уменьшению вдвое шага.
0
17.03.2019, 18:47

Не по теме:

Цитата Сообщение от SSC Посмотреть сообщение
5 с половиной лет назад Зосима еще молодой был и ошибки не заметил
и мало что понимал в решении ДУ, но желание решить задачу пересилило недостаток компетентности.
Спасибо за исправления!

0
1 / 1 / 0
Регистрация: 28.01.2014
Сообщений: 226
17.03.2019, 23:09
Цитата Сообщение от SSC Посмотреть сообщение
Сравните внимательно мой и Ваш код интегрирования на втором половинном шаге.
А да, Вы правы, не все выполнил), спасибо.


Цитата Сообщение от SSC Посмотреть сообщение
Реализованный метод слишком затратный по количеству вычислений значений производных.
Как-то видел метод косвенной оценки определения точности расчета в конце каждого шага интегрирования (но численно не проверял и книги сейчас под рукой нет).
Есть также многошаговые методы (например Адамса-Мултона, реализующий метод прогноза-коррекции, в котором по величине коррекции можно оценивать точность решения на шаге интегрирования и принимать решения по увеличению или уменьшению вдвое шага.
Спасибо за информацию!
0
0 / 0 / 0
Регистрация: 19.10.2018
Сообщений: 3
07.03.2021, 17:16
Цитата Сообщение от SSC Посмотреть сообщение
Так же проблемы с зацикливанием.
Ну и в конце расчетного шага лучше присваивать результат расчета с половинным шагом, он точнее
Ну и добавлена проверка стандартным слвером
Здравствуйте, понимаю что с момента написания Вашего поста прошло много времени, но хотелось бы узнать,
почему в приведенном коде не совпадает нижняя граница интервала на котором производится поиск решения и начальные условия?
Цитата Сообщение от SSC Посмотреть сообщение
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
% Программа решения методом Рунге-Кутты 4-го порядка
% системы дифференциальных уравнений
% y1' = f1(x,y1,y2)
% y2' = f2(x,y1,y2)
% с начальными условиями y1(0)=y10 и y2(0)=y20
% на интервале [a,b] с перемеенным шагом h
% и точностью eps
% функции правой части
f1 = @(x,y1,y2) -2*y1 + 5*y2 - x;
f2 = @(x,y1,y2) 3*y1 - exp(y2);
y10 = 1;
y20 = 0;
a = -2; % нижняя граница диапазона
b = 5; % верхняя граница диапазона
eps = 0.00005; % точность
h = (b-a)/100; % начальное значение шага
X = a; % начальное значение времени
Y1 = y10; % 1-я компонента вектора решения 1-го уравнения системы
Y2 = y20 ; % 1-я компонента вектора решения 2-го уравнения системы
Не могу понять, почему в качестве первой компоненты векторов решения присваиваются значения для точки x=0, хотя задан интервал [-2, 5].
0
Эксперт по математике/физике
 Аватар для SSC
3390 / 1913 / 571
Регистрация: 09.04.2015
Сообщений: 5,365
08.03.2021, 17:39
Цитата Сообщение от IngvarZhe Посмотреть сообщение
Не могу понять, почему в качестве первой компоненты векторов решения присваиваются значения для точки x=0,
Ну насчет присваивания Вы перегибаете. 5 строка это комментарий, по сути универсальный. Конечно более правильно его написать так
Matlab M
1
% с начальными условиями y1(н.у.)=y10 и y2(н.у.)=y20
Но и в исходном варианте это то же правильно, под y1(0) понимается значение параметра в начале интервала моделирования.
И вообще по этому поводу вопрос не ко мне, этот фрагмент кода написал Зосима в 13 году
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.03.2021, 17:39
Помогаю со студенческими работами здесь

Нужно решить задачу методом Рунге-Кутта
Извинитие если что не так, но не могли бы вы мне помочь. У меня такая проблема, задали решить задачу на Вижуал Бейсике. Не могли бы вы...

Решить ур-ние методом Рунге-Кутта порядка N=4
Решить ур-ние 4y'''+15y&quot;+2y'+y=2+e^-0.1 , методом Рунге-Кутта порядка N=4 для систем. Может кто шарит в таких тонкостях

Решить задачу Коши методом Рунге-Кутта.
помогите пожалуйста решить, методом Рунге-Кутта, +блок-схема

Решить ОДУ методом Рунге-Кутта 4 степени
Добрый день, преподаватель дал курсовую работу, часть которой - решить ОДУ методом Рунге - Кутта 4-го порядка. Все бы ничего, но есть одно...

Численно решить ОДУ методом Рунге-Кутта 4 порядка
Доброго времени суток. Мне нужно численно решить ОДУ методом Рунге-Кутта 4 порядка. Уравнение имеет вид: p'=-A-B*p, p(0)=p0. Проблема...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru