Ogranicznik szybkości trzeciego rzędu w Simulink? Jak wygenerować płynne sygnały wyzwalane?

Po pierwsze, dla tych, którzy nie są zaznajomieni z Simulink, istnieje możliwe do wyobrażenia poza częściowym rozwiązaniem Simulink:

Muszę utworzyć wektor spełniający następujące warunki:

znana wartość początkowaa1znana wartość końcowaa2ma wstępnie zdefiniowany rozmiar kroku, ale długość nie jest z góry określonapierwsza pochodna w całym zakresie jest ograniczona dov_max wzgl.-v_maxdruga pochodna w całym zakresie jest ograniczona doa_max wzgl.-a_maxtrzecia pochodna w całym zakresie jest ograniczona doj_max wzgl.-j_maxw pierwszym i ostatnim punkcie wszystkie pochodne sązero.

Zanim zapytasz „co próbowałeś do tej pory”, wpadłem na pomysł, aby rozwiązać go poza Simulink i wypróbowałem wszystkie poniższe elementy;) Ale może macie dobry pomysł, a ja pracuję nad własnym rozwiązaniem.

Chciałbym wygenerować gładkie sygnały rampowe (3. pochodna ograniczona) w oparciu o sygnał wyzwalający w Simulink.

Aby uzyskać wyzwalany krok, utworzyłem wyzwalany podsystem propagujący wyjście wyzwalacza. Wygląda to tak:

Ale właściwie nie chcę kroku, potrzebuję bardzo gładkiej rampy z ograniczonymi pochodnymi aż do trzeciego rzędu. Matematyka jest:

displacement: x
speed: v = x'
acceleration: a = v' = x''
jerk: j = a' = v'' = x'''

(Jeśli to wygląda ci znajomo, kiedyś miałem bardzopodobne pytanie. Pomyślałem o nagrodach, ale po koniecznej edycji pytania obie odpowiedzi byłyby nieważne)

Ponieważ istnieją tylko ograniczniki szybkości pierwszego rzędu, użyłem dwóch pochodnych i podwójnej integracji, aby rozwiązać mój problem. Ale jest wada burmistrza, nie mogę już dłużej ignorować. Ze względu na ilustrację wybrałem stosunkowo duży rozmiar kroku 0,1.

Pełny przykład minimalny (naprawiony krok, wielkość kroku: 0,1, ode4): Pobierz tutaj

Widać, że sygnał nawet nie osiąga zamierzonej wysokości kroku 10, a ponadto nie jest stały na końcu.

W trakcie procesu rozwoju całego mojego modelu podejście to było wystarczające dla małych rozmiarów kroków. Ale dotarłem do punktu, w którym naprawdę potrzebuję gładkiej rampy zgodnie z przeznaczeniem. Oznacza to, że potrzebuję w końcu stałego sygnału o dokładnie takiej wartości, określonej przez wzmocnienie wysokości kroku.

Spędziłem już wiele dni, aby rozwiązać ten problem i mam nadzieję, że uda mi się teraz pomóc.

Niektóre z moich pomysłów:

dynamicznie zwiększaj wysokość kroku ponad rzeczywistą żądaną wartość i nasycaj wynik końcowy. Gdyby ograniczenia prędkości, wysokość kroku i wielkość kroku symulacji nie były elastyczne, można by znaleźć satysfakcjonujące rozwiązanie. Ale ponieważ wszystko musi być elastyczne, jest zbyt wiele przypadków, w których przekroczenie limitu przyspieszenia i szarpnięcia jest naruszone.Próbowałem użyćMatlab function zablokuj i napisz mój własny ogranicznik szybkości trzeciego rzędu. Chociaż wydaje mi się to możliwe w momencie aktywacji, nie mam rozwiązania, jak wygładzić „opóźnienie” na końcu rampy. Potrzebowałbym także kompilatorów C, co utrudniłoby używanie mojego modelu w innych systemach bez problemów. (Przynajmniej tak myślę.)

Solvera nie można zmienić znacząco (ode3 lub ode4), a obowiązkowy rozmiar kroku jest obowiązkowy (0,00001 do 0,01).

Obecnie stosowane, mało przydatne podejście:

Dladynamic amplification z1,07 Otrzymuję następujące dane wyjściowe (wszystkie wartości znormalizowane w ich granicach): Chociaż przemieszczenie wygląda ładnie, naruszenie limitu przyspieszenia jest bardzo szkodliwe.

Dladynamic amplification z1,05 Otrzymuję następujące dane wyjściowe (wszystkie wartości znormalizowane w ich granicach): Przyspieszenie pozostaje w granicach, ale przemieszczenie nie osiąga zamierzonej wartości. (niezbyt jasne na zdjęciu) Szarpnięcie jest wciąż duże. (Mogłabym z tym żyć, ale to nie jest miłe)

Wydaje mi się więc, że rozwiązania wewnątrz-Simulink są dalekie od rzeczywistości. Jakieś pomysły, jak stworzyć dobrze zachowujący się niestandardowy blok funkcyjny?

Rozmiar kroku symulacji, wysokość kroku i limity szybkości są znane przed rozpoczęciem symulacji. (Ale mam wiele z tych uruchomionych gładkich ramp z rzędu, powinien zasilać sterowanie dyskretne zdarzeniami). Mogłem sobie wyobrazić stworzenie całej gładkiej rampy poza simulink i zapisanie jej jakotimeseries obiekt i dołącz go do bieżącego sygnału, gdy aktywowany jest spust.

questionAnswers(3)

yourAnswerToTheQuestion