Форум программистов, компьютерный форум, киберфорум
Matlab
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.68/25: Рейтинг темы: голосов - 25, средняя оценка - 4.68
1 / 1 / 0
Регистрация: 28.01.2014
Сообщений: 226
18.11.2014, 23:42
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от tvoretsmira Посмотреть сообщение
Это был график чего? (может ic)
Прошло много времени, сейчас я стал разбираться в matab немного лучше, поэтому извиняйте за прошлые ошибки и недочеты. Но все-таки хотелось бы добить эту задачу.

В прошлый раз мы решали следующую проблему: как только график ic спадет и станет равным нулю, то система должна переключиться на следующие ДУ. Я наконец-таки справился с этой задачей, оказывается можно задать определенные свойства при решение ДУ в Matlab, в моем случае поможет функция events:

Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function [value,isterminal,direction] = ode61(t,y)
 
gamma = mod(y(1),360);
    
 
if (gamma>=0 && gamma<(50));
    value = y(3); 
    
elseif (50)<=gamma && gamma<(100);
    value = y(5);
    
else disp ('1');
end; 
% Locate the time when height passes through zero in a 
% decreasing direction and stop integration.
isterminal = 1;   % Stop the integration
direction = 0;   % Negative direction only
end
т.е. в диапазоне gamma от 50 до 100 функция events отслеживает когда y(5) [ic] станет равным нулю, и как только ic будет равен нулю, то ode45 прекратит вычисление и выдаст результаты. Поэтому я заключил ode45 в цикл while.

Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
t0=0;
tk=0.0026;
tn=[0,0,0,0,0];
F=[];
G=[];
 
while t0<tk;
options = odeset('Events',@ode61);
[T,Y,te,ye,ie]=ode45(@odefun61, [t0 tk],tn,options);
F=cat(1,F,Y);
G=cat(1,G,T);
tn=ye;
t0=te;
end
и сама функция odefun61 c доработками:

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
function dy = odefun61(t,y)
 
U=270;
Mc=20;
L=0.0001;
R=0.7;
p=4;
Eo=0.03;
Jrot=0.0002;
 
    
    
  gamma=y(1);
  omega=y(2);
  ia=y(3);
  ib=y(4);
  ic=y(5);
  
  %определение линейной ЭДС
  ea=-omega*(1/4)*Eo*sind(4*gamma);
  eb=-omega*(1/4)*Eo*sind(4*gamma-120);
  ec=-omega*(1/4)*Eo*sind(4*gamma+120);
  
  eab=ea-eb;
  ebc=eb-ec; %=sqrt(3)*omega/4*Eo*cos(gamma)
  eca=ec-ea;
      
      
  Mem=-p*Eo*(ia*sind(gamma)+ib*sind(gamma-120)+ic.*sind(gamma+120));
  
  if Mem<=Mc && omega==0;
    gamma=0;
    omega=0;
    zer=0; %Если omega равна нулю значит и её призводная тоже. Надо как-то это обеспечить
  else
    zer=1;
  end
  
%   %gamma должна изменяться от 0-360
     gamma = mod(gamma,360);
  
  dy=zeros(5,1);
  dy(1) = omega*(180/pi)*zer;
  dy(2) = p/Jrot*(Mem-Mc)*zer;
  
  if (gamma>=0 && gamma<(50));
      c=1;
  else c=-1;
  end
      
  
    if (gamma>=0 && gamma<(50));
                    dy(3)=0;
                    dy(4)=(c*U-2*R*ib-ebc)/(2*L);
                    dy(5)=-dy(4,1);
       
            
    elseif (50)<=gamma && gamma<(100);
              if ic>=-0.000001 && ic<=0.000001
                    dy(3)=(c*U-2*R*ia-eab)/(2*L);
                    dy(4)=-dy(3,1);
                    dy(5)=0;
              else
                    dy(3)=(c*2*U-3*(R*ia+ea))/(3*L);
                    dy(5)=(-c*U-3*(R*ic+ec))/(3*L);
                    dy(4)=-dy(3,1)-dy(5,1);
              end
    else disp('прошло')
     
    end
      
end

Matlab M
1
2
3
4
5
6
7
8
p=4;
Eo=0.03;
gamma = mod(F(:,1),360);
 
ea=-F(:,2).*(1./4).*Eo.*sind(4.*gamma);
eb=-F(:,2).*(1./4).*Eo.*sind(4.*gamma-120);
ec=-F(:,2).*(1./4).*Eo.*sind(4.*gamma+120);
plot(G,ea,G,eb,G,ec)
Однако сейчас проблема в следующем:
как только ode45 досчитает до времени 0.0026 (включительно) то система должна переключиться на следующие ДУ:

Matlab M
1
2
3
4
5
6
7
8
9
Rn=20;
ea=omega*(1/4)*Eo*sind(4*gamma);
ec=omega*(1/4)*Eo*sind(4*gamma+120);
eb=omega*(1/4)*Eo*sind(4*gamma-120);
Mem=p*Eo*(ia*sind(gamma)+ib*sind(gamma-120)+ic*sind(gamma+120));
 
dy(5)=(ec-ea-ic*(2*R+Rn))/(2*L);
dy(3)=-dy(5,1);
 dy(4)=0;
,и как только ec=eb, то система перейдет на следующие ДУ:

Matlab M
1
2
3
4
5
6
7
8
ea=omega*(1/4)*Eo*sind(4*gamma);
ec=omega*(1/4)*Eo*sind(4*gamma+120);
eb=omega*(1/4)*Eo*sind(4*gamma-120);
Mem=p*Eo*(ia*sind(gamma)+ib*sind(gamma-120)+ic*sind(gamma+120));
 
dy(4)=((eb*(2*R+Rn)-ec*(R+Rn)-R*ea)/(2*L*(3*R+2*Rn)))-((ib*R)/(2*L));
dy(5)=((ec*(2*R+Rn)-eb*(R+Rn)-R*ea)/(2*L*(3*R+2*Rn)))-((ic*R)/(2*L));
dy(3)=-dy(4,1)-dy(5,1);
После того так ib снизиться до нуля (ib=0), вычисления должны прекратиться.

Моя проблема в том, что я не могу написать условия при которых будут происходить смены ДУ.

Подскажите пожалуйста как это можно сделать?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.11.2014, 23:42
Ответы с готовыми решениями:

GUI. Использование ode45 без ссылки на М-файл
Доброго времени суток уважаемые форумчане, есть такой вопрос… Я сварганил приложение в GUI на решение систем ОДУ. Решал с помощью ode45,...

Ode45
доброе время суток, помогите пожалуйста. вроде как все правильно записал но выдает все время одни ошибки вот код м-файл function...

ДУ и ode45
Добрый день! нуждаюсь в помощи решения Лабораторной работы :cry: f=@(x,y); &gt;&gt; Xs=;y0=; &gt;&gt; ode45(f,Xs,y0); ??? Error using...

20
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.11.2014, 23:42

Функция ode45
Решаю уравнение Ван - дер - Поля при помощи функции ode45 function = reshenie(~,~) T=; X0=; vdpl= @(~,X); =ode45(vdpl,T,X0); ...

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

Работа с функцией ode45
Дано ДУ y' = \sqrt{1 - {y}^{2}}. Требуется найти численное решение на интервале , где b надо определить самим(если я правильно...

Gui для ode45
Доброго времени суток! У меня есть задача: сделать gui для решения ОДУ методом ode45. Правая часть системы передается методу в виде...

Ode45, вектор-функция
Добрый день, подскажите, почему вектор-функция для ode45 выглядит таким образом, т.е. создается без ключевого слова function? vecfunc...


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

Или воспользуйтесь поиском по форуму:
21
Ответ Создать тему
Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru