2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 WhenEvent для решения дифф. уравнения с переключение
Сообщение12.11.2022, 16:56 


12/11/22
2
Здравствуйте! Возник вопрос по использованию функции WhenEvent для решения задачи оптимального управления, где есть переключения.
Ниже я приведу ту систему, которая рассматривается. Управление $w(t)$ меняется в зависимости от знака функции $H_1$ по формуле . Я решил реализовать интегрирование системы с некоторыми начальными условиями $r(0)$, $\beta(0)$, $\psi_r(0)$, $\psi_\beta(0)$, $\alpha(0)$

$$\left\{ \begin{array}{l}
   &\dot r = \cos \alpha  - b\cos \beta , \hfill  \\
   &\dot \beta  = \frac{w}
{r}\left( {b\sin \beta  - \sin \alpha } \right), \hfill  \\
   &\dot \psi _r  = \frac{{\psi _\beta  }}
{{r^2 }}w\left( {b\sin \beta  - \sin \alpha } \right), \hfill  \\
   &\dot \psi _\beta   =  - \psi _r b\sin \beta  - \frac{{\psi _\beta  }}
{r}wb\cos \beta . \hfill  \\
 \end{array}  \right.$$

$$r\left( 0 \right) = r_0, \quad \beta \left( 0 \right) = \beta _0, \quad \psi _r \left( T \right) =  1, \quad \psi _\beta  \left( T \right) = 0.$$

$$w = \left\{ {\begin{array}{{20}l}
   {w_1 ,H_1  < 0,} \hfill  \\
   {w_2 ,H_1  > 0,} \hfill  \\
\end{array} } \right.$$

$$H_1  = \frac{{\psi _\beta  }}
{r}\left( {b\sin \beta  - \sin \alpha } \right)$$, $$\alpha \left( t \right) = - \arctg\left( {\frac{{\psi _\beta  }}
{{\psi _r }} \cdot \frac{w}
{r}} \right), \,\, \alpha(T) = 0$$.

Однако у меня переключение управления происходит не в момент смены знака $H_1$, а в какой то другой. И еще переключается, когда $H_1 =0$

Код:
SolveDE[DiffEq_, T_, initCond_, CinematicEq_, condCinematic_] :=
  NDSolve[DiffEq~Join~CinematicEq~Join~condCinematic~Join~initCond~
    Join~{WhenEvent[
      Subscript[\[Psi], \[Beta]][t]/
        r[t] (b Sin[\[Beta][t]] -
          Sin[-ArcTan[
             Subscript[\[Psi], \[Beta]][t]/Subscript[\[Psi], r][t]*
              w[t]/r[t]]]) > 0, {w[t] -> w2}],
     WhenEvent[
      Subscript[\[Psi], \[Beta]][t]/
        r[t] (b Sin[\[Beta][t]] -
          Sin[-ArcTan[
             Subscript[\[Psi], \[Beta]][t]/Subscript[\[Psi], r][t]*
              w[t]/r[t]]]) < 0 , {w[t] -> w1}]}, {r[t], \[Beta][t],
    Subscript[\[Psi], r][t], Subscript[\[Psi], \[Beta]][t], w[t],
    Subscript[x, P][t], Subscript[x, \[CapitalEpsilon]][t],
    Subscript[y, P][t],
    Subscript[y, \[CapitalEpsilon]][t], \[Theta][t]}, {t, T},
   DiscreteVariables -> {w[t] \[Element] Reals},
   StartingStepSize -> 0.1,
   Method -> {"FixedStep", Method -> "ExplicitRungeKutta"},
   StepMonitor :>
    Print["t = ", t, "  r(t)=", r[t], "  \[Beta](t)=", \[Beta][t],
     "  \!\(\*SubscriptBox[\(\[Psi]\), \(r\)]\)(t)=",
     Subscript[\[Psi], r][t],
     "  \!\(\*SubscriptBox[\(\[Psi]\), \(\[Beta]\)]\)(t)=",
     Subscript[\[Psi], \[Beta]][t], "  \[Alpha](t)=", \[Alpha][t],
     "  w(t)=", w[t], "  \!\(\*SubscriptBox[\(H\), \(1\)]\)(t)= ",
     Subscript[H, 1][t]]];


Хотел задать вопрос о том, как все таки работает функция WhenEvent и как ее эффективно использовать для решения дифф. уравнений с переключением?

Я вижу себе это так: при $t=0$ по заданным начальным условиям у меня известно значение $w(0)$ исходя из знака $H_1$. Начинаю интегрировать с $w$, которое выбирается по правилу и на следующих временах и проверяю условие: если $H_1>0$, то я в этот момент времени сменяю $w(t)$ на другое и так далее. Если вдруг $H_1<0$, то сменяю снова. Т.е. переключение происходит при переходе функции $H_1$ через ноль. Однако в таблице как можно видеть, переключение происходит в момент, когда $H_1$ знакопостоянна..
Может я неправильно логику понимаю этой функции?

 Профиль  
                  
 
 Posted automatically
Сообщение12.11.2022, 17:06 
Админ форума


02/02/19
2632
 i  Тема перемещена из форума «Околонаучный софт» в форум «Карантин»
по следующим причинам:

- правильно наберите все формулы и обозначения. Обратите внимание, что начало и конец каждой формулы должны быть отмечены знаком доллара: не H_1, а $H_1$ (наведите курсор, чтобы увидеть код формулы). Краткие инструкции: «Краткий FAQ по тегу [math]» и видеоролик Как записывать формулы

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

 Профиль  
                  
 
 Posted automatically
Сообщение12.11.2022, 17:44 
Админ форума


02/02/19
2632
 i  Тема перемещена из форума «Карантин» в форум «Помогите решить / разобраться (М)»
Причина переноса: не указана.

 Профиль  
                  
 
 Posted automatically
Сообщение15.11.2022, 12:28 
Админ форума


02/02/19
2632
 i  Тема перемещена из форума «Помогите решить / разобраться (М)» в форум «Околонаучный софт»
Причина переноса: думал, что математика, оказалось, что Mathematica.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group