2014 dxdy logo

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

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




 
 WhenEvent для решения дифф. уравнения с переключение
Сообщение12.11.2022, 16:56 
Здравствуйте! Возник вопрос по использованию функции 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 
 i  Тема перемещена из форума «Околонаучный софт» в форум «Карантин»
по следующим причинам:

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

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

 
 
 
 Posted automatically
Сообщение12.11.2022, 17:44 
 i  Тема перемещена из форума «Карантин» в форум «Помогите решить / разобраться (М)»
Причина переноса: не указана.

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

 
 
 [ Сообщений: 4 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group