0 / 0 / 0
Регистрация: 10.06.2014
Сообщений: 6
1

Решение дифференциального уравнения методом Эйлера и методом Рунге-кутта 4 порядка

11.06.2014, 00:21. Показов 21469. Ответов 40
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите пожалуйста решить уравнение y''-4y'+5y=2x2ex , методом Эйлера и методом Рунге-кутта 4 порядка , буду очень благодари
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.06.2014, 00:21
Ответы с готовыми решениями:

Решение дифференциального уравнения методом Эйлера и методом Рунге-кутта
Помогите пожалуйста решить уравнение у' = 1 + х sin y, y(π) = 2π , методом Эйлера и методом...

Решение дифференциального уравнения второго порядка методом Рунге-Кутта
Помогите наисать программу в матлабе для решения следующего уравнения: y''+0.6935y'=0 y0=0...

Решение дифференциального уравнения второго порядка методом Рунге-Кутта
Доброй ночи, форумчани! Помогите наисать программу в матлабе для решения следующего уравнения: ...

Решение дифференциального уравнения методом Рунге-Кутта
Здравствуйте. Помогите мне, пожалуйста, с такой проблемой. Дано дифференциальное уравнение и...

40
5221 / 3552 / 372
Регистрация: 02.04.2012
Сообщений: 6,458
Записей в блоге: 17
11.06.2014, 09:22 2
Вот, практически твое задание
Численное решение дифференциальных уравнений
0
0 / 0 / 0
Регистрация: 10.06.2014
Сообщений: 6
12.06.2014, 01:07  [ТС] 3
огромное спасибо , а то лазил по форуму , а это не заметил =)

Добавлено через 14 часов 40 минут
у меня вопрос : В методе Рунге-Кутта ты дал код

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
clear, clc
h = 0.05; % шаг
a = 0; % нижний предел
b = 0.5; % верхний предел
 
% функция системы:
dsys = @(x,y,dy) [dy;
        2*exp(-x)*cos(x)-2*dy-2*y];
 
T = a:h:b; % массив времени
% инициализируем массив значений:
Y = zeros(size(T)); 
dY = zeros(size(T));
% начальные условия:
Y(1) = 1; 
dY(1) = 0;
% начинаем Рунге-Куттить ;)
for j=1:length(T)-1
    k1=h*dsys(T(j), Y(j), dY(j));
    k2=h*dsys(T(j)+h/2, Y(j)+k1(1)/2, dY(j)+k1(2)/2 );
    k3=h*dsys(T(j)+h/2, Y(j)+k2(1)/2, dY(j)+k2(2)/2);
    k4=h*dsys(T(j)+h, Y(j)+k3(1), dY(j)+k3(2) );
    dU = (k1+2*k2+2*k3+k4)/6;
    Y(j+1)=Y(j) + dU(1);
    dY(j+1)=dY(j) + dU(2);
end 
plot(T,Y, T,dY)
legend('y(x)','dy/dx')
но мы же разбиваем на да уравнение , и разве нам не надо искать по 4 К для каждого из них (т.е. всего у нас разве не 8 к должно получиться)???
0
5221 / 3552 / 372
Регистрация: 02.04.2012
Сообщений: 6,458
Записей в блоге: 17
12.06.2014, 12:03 4
Zestokiu_Xarek, тут есть хитрость
дело в том, что в функция написана так, что рассчитываются и возвращаются сразу два результата, для каждого из уравнений! поэтому коэф-ты Ki и приращение dU содержат два значения для каждого из уравнений (потом к Y прибавляется первый элемент dU(1), а к dY прибавляется второй элемент dU(2) )
поэтому К четыре, а не восемь
0
0 / 0 / 0
Регистрация: 10.06.2014
Сообщений: 6
12.06.2014, 13:20  [ТС] 5
а зачем в этой строчке ты создаешь просто тьму нулей ?
Matlab M
1
2
Y = zeros(size(T)); 
dY = zeros(size(T));
0
5221 / 3552 / 372
Регистрация: 02.04.2012
Сообщений: 6,458
Записей в блоге: 17
12.06.2014, 14:39 6
Zestokiu_Xarek, это стандартный прием для увеличения быстродействия: инициализировать массив до того как. Иначе на каждом шаге цикла будет добавляться новый элемент, т.е. физически в памяти будет создаваться новая переменная и уничтожатся старая (это занимает время), а в моем случае под переменную уже выделен шмат памяти
0
0 / 0 / 0
Регистрация: 10.06.2014
Сообщений: 6
15.06.2014, 22:39  [ТС] 7
а как сделать в методе Рунге-кутта , чтобы для каждой функции были свои К и еще вопрос , не обязательно отдельной строчкой выводить функцию ,
Matlab M
1
2
dsys = @(x,y,dy) [dy;
        2*exp(-x)*cos(x)-2*dy-2*y];
, а можно написать в самой строчке программы ? здесь
Matlab M
1
 k1=h*dsys(T(j), Y(j), dY(j))
Добавлено через 11 минут
столько вопросов потому что преподаватель не понравилась прога =)
0
5221 / 3552 / 372
Регистрация: 02.04.2012
Сообщений: 6,458
Записей в блоге: 17
15.06.2014, 22:40 8
Цитата Сообщение от Zestokiu_Xarek Посмотреть сообщение
а как сделать в методе Рунге-кутта , чтобы для каждой функции были свои К
тогда нужно 8 раз считать К
Цитата Сообщение от Zestokiu_Xarek Посмотреть сообщение
не обязательно отдельной строчкой выводить функцию
хм, впринципе можно но опять же - ее придется переписывать 8 раз
0
0 / 0 / 0
Регистрация: 10.06.2014
Сообщений: 6
15.06.2014, 22:55  [ТС] 9
и получаеться ты оба уравнения занес сюда
Matlab M
1
2
dsys = @(x,y,dy) [dy;
        2*exp(-x)*cos(x)-2*dy-2*y];
и поэтому он так его легко считал ?
0
5221 / 3552 / 372
Регистрация: 02.04.2012
Сообщений: 6,458
Записей в блоге: 17
15.06.2014, 22:56 10
да
1
0 / 0 / 0
Регистрация: 10.06.2014
Сообщений: 6
15.06.2014, 22:59  [ТС] 11
спасибо очень помог и извини за тупые вопросы
0
5221 / 3552 / 372
Регистрация: 02.04.2012
Сообщений: 6,458
Записей в блоге: 17
15.06.2014, 23:03 12
Лучший ответ Сообщение было отмечено Ev_Hyper как решение

Решение

та ничего
вот, гляди какая штука получается:
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
clear, clc
h = 0.05; % шаг
a = 0; % нижний предел
b = 0.5; % верхний предел
 
T = a:h:b; % массив времени
% инициализируем массив значений:
Y = zeros(size(T)); 
dY = zeros(size(T));
% начальные условия:
Y(1) = 1; 
dY(1) = 0;
% начинаем Рунге-Куттить ;)
for j=1:length(T)-1
    % Y(j+1):
    K11 = dY(j);
    K12 = dY(j)+K11/2;
    K13 = dY(j)+K12/2;
    K14 = dY(j)+K13;
    Y(j+1) = Y(j) + h*(K11+2*K12+2*K13+K14)/6;
    % dY(j+1):
    K21 = 2*T(j)^2*exp(T(j))+4*dY(j)-5*Y(j);
    K22 = 2*(T(j)+h/2)^2*exp(T(j)+h/2)+4*(dY(j)+K21/2)-5*(Y(j)+K21/2);
    K23 = 2*(T(j)+h/2)^2*exp(T(j)+h/2)+4*(dY(j)+K22/2)-5*(Y(j)+K22/2);
    K24 = 2*(T(j)+h)^2*exp(T(j)+h)+4*(dY(j)+K23)-5*(Y(j)+K23); 
    dY(j+1) = dY(j) + h*(K21+2*K22+2*K23+K24)/6;
end 
plot(T,Y, T,dY)
legend('y(x)','dy/dx')
*а функцию я отдельно выписал не просто так, а чтобы можно было проверить с помощью встроенной решалки ode45
0
7 / 7 / 6
Регистрация: 11.04.2013
Сообщений: 30
22.06.2014, 00:12 13
Зосима, Здравствуйте, мне нужно написать программу в Matlab для решения ОДУ методом Рунге-Кутты четвертого порядка.
Я не совсем понимаю, в чем суть этого метода. И еще, я не силен в ДУ, хоть и учусь на математика
Вы, как знающий человек, не могли бы сделать краткий экскурс в эту тему
0
6652 / 4750 / 1982
Регистрация: 02.02.2014
Сообщений: 12,729
22.06.2014, 08:16 14
Fleury29, краткий экскурс в эту тему
0
7 / 7 / 6
Регистрация: 11.04.2013
Сообщений: 30
22.06.2014, 09:00 15
Krasme, Если бы я все это понял, то я бы здесь не писал.
Т.е. в качестве начальной точки берем х0? А в кач-ве конечной любое число?
0
2434 / 1834 / 404
Регистрация: 15.12.2013
Сообщений: 8,202
22.06.2014, 14:27 16
Fleury29, конец интервала тоже должен быть задан.
0
5221 / 3552 / 372
Регистрация: 02.04.2012
Сообщений: 6,458
Записей в блоге: 17
22.06.2014, 17:23 17
Fleury29, о-ля-ля! дружочек, я и сам-то не математик и даже не программист - в свои неполные 30 лет только метод Эйлера понял
Как я понял, заковырка этого метода заключается в расчете 4-х коэфф-тов (поэтому то и "4-го порядка") К1-К4, почему они считаются именно так я не знаю причем, что любопытно, расчеты ведутся еще и в середине интервала (T(j)+h/2) (спинным мозгом чувствую, что ноги растут из формулы численного дифференцирования по трем точкам) а затем усредняется (K1+2*K2+2*K3+K4)/6 (это как-бы значение производной) и как в методе Эйлера умножается на шаг h и прибавляется к предыдущему значению функции Y(j)
В данном методе, как и в методе Эйлера, задается интервал значений x: [x0, x1], и значение функции в начальной точке y(x0), от которого уже начинаем плясать
1
7 / 7 / 6
Регистрация: 11.04.2013
Сообщений: 30
22.06.2014, 19:39 18
А если так написать то правильно будет?

Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
clear, clc
h = 0.1; % шаг
a = -1; % нижний предел
b = 1; % верхний предел
 
x = a:h:b;
 
y = zeros(size(x));
for j=1:length(x)-1
    k1=h*(x(j)-y(j));
    k2=h*(x(j)+h/2-y(j)+k1(1)/2);
    k3=h*(x(j)+h/2-y(j)+k2(1)/2);
    k4=h*(x(j)+h-y(j)+k3(1));
    dU = (k1+2*k2+2*k3+k4)/6;
    y(j+1)=y(j) + dU;
end 
 
plot(x,y);
legend('y(x)');
У меня ДУ такое: dy/dx=x-y, h=0,1, начальные условия не даны

График:
Решение дифференциального уравнения методом Эйлера и методом Рунге-кутта 4 порядка
0
6652 / 4750 / 1982
Регистрация: 02.02.2014
Сообщений: 12,729
22.06.2014, 19:44 19
Fleury29, вы не хотите пользоваться готовым образцом?
0
7 / 7 / 6
Регистрация: 11.04.2013
Сообщений: 30
22.06.2014, 20:01 20
Krasme, мне вручную надо написать
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.06.2014, 20:01
Помогаю со студенческими работами здесь

Решение уравнения численно, методом Рунге-Кутта, или Эйлера
Подскажите пожалуйста, как решить задачу. Как я понял, нужно всего лишь получить численное решение...

Решение дифференциального уравнения второго порядка методом Эйлера
Здравствуйте! Столкнулся с проблемой решения дифференциального уравнения второго порядка методом...

Решение дифференциального уравнения методами Эйлера и Рунге-Кутты четвертого порядка
Суть задания такова: Решить методами Эйлера и Рунге – Кутты четвертого порядка на отрезке ...

Решение системы ДУ 4-го порядка методом Рунге-Кутта
Необходимо решить данную систему методом Рунге-Кутта. Шаг по времени 0.001. Помогите, пожалуйста,...


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

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

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