Форум программистов, компьютерный форум, киберфорум
Matlab
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
1 / 1 / 0
Регистрация: 28.01.2014
Сообщений: 226

Решение дифференциальных уравнений

29.08.2014, 14:43. Показов 3902. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет! Просмотрел на форуме примеры решения ДУ, но так и не нашел аналогию. Помогите пжл разобраться, как записать в Matlab и решить следующую задачу:
Миниатюры
Решение дифференциальных уравнений  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.08.2014, 14:43
Ответы с готовыми решениями:

Решение дифференциальных уравнений
Все доброго времени суток! Помогите пожалуйста решить следующие дифференциальные уравнения в ode45 (см. картинку). Я уже обращался на...

Решение дифференциальных уравнений
Дана система диф.уравнений dv/dt=(P-Xa)/m-g*sin(Teta); dTeta/dt=-g*sin(Teta)/v; dy/dt=v*sin(Teta); dx/dt=v*cos(Teta). Надо решить...

Решение дифференциальных уравнений
Не могу разобратся с кодом, делаю все по аналогии, но ничего не получается, помогите разобратся, буду весьма признателен. function prakt;...

27
 Аватар для tvoretsmira
462 / 452 / 56
Регистрация: 28.05.2013
Сообщений: 699
29.08.2014, 14:51
А где начальные условия?
0
1 / 1 / 0
Регистрация: 28.01.2014
Сообщений: 226
29.08.2014, 14:57  [ТС]
Ой, сорри, точно, все три =0
0
533 / 438 / 47
Регистрация: 17.07.2013
Сообщений: 2,236
29.08.2014, 16:39
Если Ваши диффуры не уникальны, то может это поможет:

Шампайн Гладвел Томпсон Решение обыкновенных дифр уравнений с использованием MATLAB 2009 304 стр
1
1 / 1 / 0
Регистрация: 28.01.2014
Сообщений: 226
29.08.2014, 21:42  [ТС]
Я читал эту книгу и еще несколько, и на их основе и некоторых уравнениях на форуме записал в Matlab эти ДУ, однако все равно не получается, графики строит не те, которые нужно, и непонятно, в чем ошибка
Вроде все проверил-должно быть верно. Помогите пожалуйста разобраться, где я ошибся?
Вот, что у меня получилось:
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
function dy=odefun10(t,y);
N=3;
J=12800;
q=350;
S=38;
l=3.7;
ks=-0.005;
ko=-0.01;
ka=-0.01;
a=3;
kz=-0.08671;
 
%Расчеты
m1=y(1);
omega=y(2);
tetta=y(3);
m=2*(N-tetta);
sigma=(J/(q*S*l*ks))*(3*(m-omega)+m1)-(ko+ka*a+kz*omega)\ks;
 
dy=zeros(3,1);
dy(1)= m;
dy(2)=((q*S*l)\J)*(ko+ka*a+ks*sigma+kz*omega);
dy(3)=omega;
end
Matlab M
1
2
[Y,T]=ode45('odefun10', [0 10], [0 0 0]);
plot(Y,T)
В симулинке я смог решить эти уравнения и все верно-графики строятся правильные:
Миниатюры
Решение дифференциальных уравнений  
0
533 / 438 / 47
Регистрация: 17.07.2013
Сообщений: 2,236
30.08.2014, 11:49
Цитата Сообщение от Alex7421 Посмотреть сообщение
и еще несколько
А какие?

В симулинке есть возможность сформировать М-файл? Если такая возможность есть, то анализ этого файла здорово поможет. Такой прием эффективно использовал, когда в CFTOOL получались хорошие результаты, а свой код выдавал неправильные.
0
 Аватар для tvoretsmira
462 / 452 / 56
Регистрация: 28.05.2013
Сообщений: 699
30.08.2014, 12:07
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
function OdeCaller2
N=3;
J=12800;
q=350;
S=38;
l=3.7;
ks=-0.005;
ko=-0.01;
ka=-0.01;
a=3;
kz=-0.08671;
 
[T,Y]=ode45(@odefun10, [0 4], [0 0]);
 
m1=-2*Y(:,1);
plot(T,m1,'r-')
hold on
plot(T,Y)
grid on
legend('m1','\omega','\upsilon')
function dy=odefun10(t,y)
%Расчеты
omega=y(1);
tetta=y(2);
m=2*(N-tetta);
m1=-2*omega;
% Что бы понять откуда я взял такую формулу введите следующие 2 строки в коммандном
% окне:
% syms N tetta(t)
% m1=diff(2*(N-tetta),t)
% а затем взгляните на последнее дифференциальное уравнение на вашей
% картинке
dy=zeros(2,1);
 
sigma=(J/(q*S*l*ks))*(3*(m-omega)+m1)-(ko+ka*a+kz*omega)/ks;
 
dy(1)=((q*S*l)/J)*(ko+ko*a+ks*sigma+kz*omega);
dy(2)=omega;
end
end
Добавлено через 14 минут
Цитата Сообщение от Nick07 Посмотреть сообщение
В симулинке есть возможность сформировать М-файл?
Да, в Simulink есть возможность писать m код в блоке MATLAB Function.
Но обычно дифф. уравнения в Simulink решают так как я показал в этой теме:
Моделирование нелинейного процесса, заданного Диф. уравнениями в Simulink
1
1 / 1 / 0
Регистрация: 28.01.2014
Сообщений: 226
30.08.2014, 20:48  [ТС]
Цитата Сообщение от Nick07 Посмотреть сообщение
А какие?
Я скачал с торрента много книг по matlab и в некоторых из них было написано про ДУ. По поводу m-файла в симулинке не знаю, только знаю как с помощью блоков решать ДУ (для меня в симулинке решать их намного проще)

tvoretsmira спасибо Тебе огромное за помощь а то я уж отчаялся. Вот только я не пойму, если бы вместо моего простого уравнения m=2(N-tetta) было бы какое-нибудь огромное, с кучей других производных внутри, как тогда поступать? Ведь производную такого уравнения было бы найти не так легко.

P.S. Если уж зашла речь про симулинк, то у меня уже давно интересует вопрос: у меня есть выше описанная модель в симулинк, могу ли я создать цикл, а потом его подать, например, прибавить этот сигнал к sigma ?
0
 Аватар для tvoretsmira
462 / 452 / 56
Регистрация: 28.05.2013
Сообщений: 699
30.08.2014, 23:47
Цитата Сообщение от Alex7421 Посмотреть сообщение
Вот только я не пойму, если бы вместо моего простого уравнения m=2(N-tetta) было бы какое-нибудь огромное, с кучей других производных внутри, как тогда поступать?
Надо думать. Я не знаю ответа на все случаи жизни, и даже не факт что он вообще существует. У вас уравнение оказалось зависимым, потому пришлось исключить из системы уравнений.
Цитата Сообщение от Alex7421 Посмотреть сообщение
Ведь производную такого уравнения было бы найти не так легко.
Это ещё почему? Производные берутся всегда, это ж не интегралы.
Цитата Сообщение от Alex7421 Посмотреть сообщение
P.S. Если уж зашла речь про симулинк, то у меня уже давно интересует вопрос: у меня есть выше описанная модель в симулинк, могу ли я создать цикл, а потом его подать, например, прибавить этот сигнал к sigma ?
Смысл не понял. Но если не изменять сигналов, которые нужны для решения системы, а просто использовать их в схеме, то почему бы и нет.
0
1 / 1 / 0
Регистрация: 28.01.2014
Сообщений: 226
31.08.2014, 15:41  [ТС]
Цитата Сообщение от tvoretsmira Посмотреть сообщение
Это ещё почему? Производные берутся всегда, это ж не интегралы.
Это да, но я надеялся, что в matlab такая задача решается полегче.

Цитата Сообщение от tvoretsmira Посмотреть сообщение
Смысл не понял. Но если не изменять сигналов, которые нужны для решения системы, а просто использовать их в схеме, то почему бы и нет.
Вообще сначала у меня были уравнения, которые я указал выше, и вроде бы все решилось легко в симулинке, но потом все усложнилось, появился цикл:
Matlab M
1
2
3
4
5
for i=1:6;
y(i)=rand;
S=S+y(i);
end
E=(S+3)\6;
,где после 6 итераций, каждое E подставлялось в следующее уравнение (на рисунке):

А дальше это все прибавлялось к сигма, из предыдущих уравнений, поэтому из-за цикла мне пришлось перейти из симулинка на язык matlab.
Но теперь вроде решилось с циклом, но стопор с вычислением Uк-1, в симулинк есть блок "memory", который возвращает значение на предыдущем шаге интегрирования, а вот как здесь решить?! Может Вы знаете ответ на этот вопрос?
Миниатюры
Решение дифференциальных уравнений  
0
 Аватар для tvoretsmira
462 / 452 / 56
Регистрация: 28.05.2013
Сообщений: 699
01.09.2014, 01:34
Цитата Сообщение от Alex7421 Посмотреть сообщение
поэтому из-за цикла мне пришлось перейти из симулинка на язык matlab
Simulink тоже можно в цикле запускать, через команду sim.
Цитата Сообщение от Alex7421 Посмотреть сообщение
но стопор с вычислением Uк-1, в симулинк есть блок "memory", который возвращает значение на предыдущем шаге интегрирования, а вот как здесь решить?! Может Вы знаете ответ на этот вопрос?
Знаю, перед запуском функции ode45 в OdeCaller2 присвойте начальные значения тем переменным, в которых будете хранить любые данные из предидущей итерации (Надо так сделать потому, что перед первой итерацией предидущей итерации не было). Далее в конце функции odefun10 вы записываете в эти переменные значения и на следующей итерации (в начале функции odefun10) считываете с этих переменных то, что было туда записано на прошлой итерации.
0
1 / 1 / 0
Регистрация: 28.01.2014
Сообщений: 226
01.09.2014, 14:06  [ТС]
Я добавлю еще несколько ДУ, чтобы была полная 'картина'. Подскажите пжл, правильно ли я понял ваше объяснение, и можно ли как-нибудь указать значение шага интегрирования (ведь ode45 считает с автоматическим шагом)?

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
function OdeCaller5
N=0;
S=0
 
[T,Y]=ode45(@odefun10, [0 4], [0 0]);
Uk=N;
 
dy(1)=L2;
dy(2)=sigma1;
 
for i=1:6;
Q(i)=2*rand-1;
S=S+Q(i);
end
E=(S+3)\6;
 
%b=exp(-0.1*дельта t); где дельта t-значение шага интегрирования
Vy=b*Uk + 2*sqrt(1-b^2)*E;
 
L1=0.06*Vy;
 
dy=zeros(2,1);
dy(1)=0.01*Vy-5*L2
 
L=L1+L2;
 
dy(2)=L;
 
N=Vy
 
end
end
Извиняюсь, забыл строчку одну:
Matlab M
1
function dy=odefun10(t,y)
Добавлено через 41 минуту
вот как-то так:
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
function OdeCaller5
N=0;
S=0;
 
[T,Y]=ode45(@odefun11, [0 10], [0 0]);
 
plot(T,Y(:,2))
 
 
function dy=odefun11(t,y)
Uk=N;
L2=y(1);
 
for i=1:6;
Q(i)=2*rand-1;
S=S+Q(i);
end
E=(S+3)/6;
 
%b=exp(-0.1*дельта t); где дельта t-значение шага интегрирования
 
Vy=b*Uk + 2*sqrt(1-b^2)*E;
 
L1=0.006*Vy;
 
dy=zeros(2,1);
dy(1)=0.01*Vy-5*L2;
 
L=L1+L2;
 
dy(2)=L;
 
N=Vy;
 
end
end
Изображения
 
0
 Аватар для tvoretsmira
462 / 452 / 56
Регистрация: 28.05.2013
Сообщений: 699
01.09.2014, 15:12
Цитата Сообщение от Alex7421 Посмотреть сообщение
Извиняюсь, забыл строчку одну:
Я догадываюсь, что эту строчку вы потеряли после [T,Y]=ode45(@odefun10, [0 4], [0 0]);
но перед Uk=N;
Да, поняли меня правильно. Но обратите внимание на S=0; Если вы выносите это выражение за пределы вложенной функции, то S будет рости с увиличением числа итераций. Этого ли вы хотели?
Цитата Сообщение от Alex7421 Посмотреть сообщение
можно ли как-нибудь указать значение шага интегрирования
Можно:
Matlab M
1
2
[T,Y]=ode45(@odefun10, 0:Tstep:4, [0 0]);
% где Tstep это шаг интегрирования
0
1 / 1 / 0
Регистрация: 28.01.2014
Сообщений: 226
01.09.2014, 20:02  [ТС]
Да вы правы, спасибо, S нужно внести во вложенную функцию. Правда получается не совсем то, что нужно. Помогло бы, если бы я знал значения переменных во вложенной функции (например Vy или b), Вы не знаете, есть ли какая-нибудь возможность вытянуть переменные из под функции ode45 ?
0
 Аватар для tvoretsmira
462 / 452 / 56
Регистрация: 28.05.2013
Сообщений: 699
01.09.2014, 20:32
Переменные можно посмотреть в режиме отладки. Или сохранить и посмотреть тогда, когда программа завершится:
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
function OdeCaller
ik=0; % Инициализация счётчика
...
Tspan=0:Tstep:4;
VyMem=zeros(1,numel(Tspan));% Заготавливаем память под VyMem
[T,Y]=ode45(@odefun10,Tspan , [0 0]);
  function dy=odefun11(t,y)
  ik=ik+1; %Считаем сколько раз вызвана функция odefun11
  ...
  VyMem(ik)=Vy;% Собираем данные в массив
  end
end
А b должно быть постоянным для постоянного шага.
0
1 / 1 / 0
Регистрация: 28.01.2014
Сообщений: 226
01.09.2014, 21:21  [ТС]
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
function OdeCaller5
ik=0;% Инициализация счётчика
tstep=0.001;
Tspan=0:tstep:40;
N=0;
VyMem=zeros(1,numel(Tspan));% Заготавливаем память под VyMem
[T,Y]=ode45(@odefun11,Tspan, [0 0]);
plot(T,Y)
 
 
function dy=odefun11(t,y)
ik=ik+1; %Считаем сколько раз вызвана функция odefun11
Uk=N;
L2=y(1);
E=randn;
 
b=exp(-0.1*tstep);
Vy=b*Uk + 2*sqrt(1-b^2)*E;
 
L1=0.06*Vy;
 
dy=zeros(2,1);
dy(1)=0.001*Vy-5*L2;
 
L=L1+L2;
 
dy(2)=L;
N=Vy;
VyMem(ik)=Vy;
end
end
Вроде сделал как надо, но VyMem не сохраняет значения Vy. Странно, что ответ получается не корректный, подскажите пжл правильно ли я записал ДУ ?, может дело опять в них
0
 Аватар для tvoretsmira
462 / 452 / 56
Регистрация: 28.05.2013
Сообщений: 699
01.09.2014, 22:10
Если вы про те ДУ, что привели на картинке, то да, они программе не соотвествуют. Особенно последнее уравнение странное: https://www.cyberforum.ru/cgi-bin/latex.cgi?\delta_1=\dot{L}
Поди догадайся чему равна https://www.cyberforum.ru/cgi-bin/latex.cgi?\delta_1.
0
02.09.2014, 10:23

Не по теме:

Alex7421, обрати внимание:

6/3 = 2

6\2 = 2/6 = 0.5

0
1 / 1 / 0
Регистрация: 28.01.2014
Сообщений: 226
02.09.2014, 14:35  [ТС]
Спасибо Зосима, недавно в книге про это прочитал, раньше думал, что разницы нет. tvoretsmira Вы опять правы, это не ДУ, это просто дифференцирование, поэтому и ответ неверный. Раньше я уже встречался с дифференцированием в matlab, но только символьным, а потом уже подставлял свои значения. А вот с численным дифференцированием, да еще и под функцией ode45 впервые. Подскажите пжл, каким образом это делается в данном случае?
0
 Аватар для tvoretsmira
462 / 452 / 56
Регистрация: 28.05.2013
Сообщений: 699
02.09.2014, 20:23
Я не знаю как сделать это в даном случае.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.09.2014, 20:23
Помогаю со студенческими работами здесь

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

Решение дифференциальных уравнений.
Найти решение уравнений: а) tyy'' - ty'2= yy' t=, y1(0)=1, y2(0)=0 б) ty''= y'+ t(y'2+t2) t=, y1(0)=0 , y2(0)=0

Решение системы дифференциальных уравнений
Добрый день! Понадобилось решить вот такую систему диф.уравнений: \begin{cases} & \text{} \dot{x}-x-2y=t \\ & \text{}...

Численное решение дифференциальных уравнений
Всем привет! Есть уравнение: y''+2y'+2y=(2e^(-x))*cos(x) Подскажите как решить данное уравнение средствами пакета matlab? Для...

Решение системы дифференциальных уравнений
Здравствуйте, помогите решить систему ОДУ. В файле записала вот такой фрагмент кода function dy = myfun(t,y) dy = zeros(2,1); ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru