2013-10-19 9 views
10

Próbuję użyć Yampy do jakiejś podstawowej symulacji systemu, tak jak robiłbym to w Simulink. W tym przypadku chcę symulować system sprężyn i tłumików, wprowadzony przez this simulink tutorial. Pisałem następujące funkcje sygnałowe do reprezentowania system:Symulowanie systemu sprężyny/amortyzatora w Yampie

system = time >>> force >>> displacement 

force = constant (m * g) 

displacement = feedback (-) (velocity >>> integral) (gain $ k/m) 0 
velocity  = feedback (-) integral    (gain $ c/m) 0 

Jeżeli funkcja feedback tworzy basic feedback loop i jest realizowany tak:

feedback op a b b0 = loopPre b0 inner 
    where inner = arr (uncurry op) >>> a >>> (identity &&& b) 

Aha, i:

gain x = arr (*x) 

Z sensownymi dodatnimi stałymi, otrzymuję szalenie niestabilny system:

plot of displacement/time

Czy jest coś złego w tym oczywiście sposób mam buduje sprzężeń zwrotnych lub stosujące integracji?

Odpowiedz

7

Zmień integral do imIntegral 0

displacement = feedback (-) (velocity >>> imIntegral 0) (gain $ k/m) 0 
velocity  = feedback (-) (imIntegral 0)   (gain $ c/m) 0 

Od spring.hs:

Yampa

Korzystanie Simulink:

Simulink

coś śmiesznego jest h dołączanie w funkcji całkowania, zmiana na imIntegral 0 daje taką samą krzywą jak w matlab.

Domyślam się, że Integral jest opóźniony o jedną próbkę, ponieważ nie ma wartości początkowej, zmieniając zachowanie pętli.

+0

Doskonale, dziękuję za to! Zrobiłem kilka prostych testów z 'integral', więc nie sądziłem, że to był problem. "Skala jest wyłączona", masz na myśli oś poziomą? Mój kod nie wyznacza czasu, tylko numer każdego punktu danych. –

+0

chuj, nie martw się o to, kiedy porównywałem matlab i simulink miałem coś z tego, co czyniło różnicę w skali y. – MdxBhmt

+1

Dodanie opóźnienia transportu w Simulink powoduje, że system jest niestabilny podobnie jak ten, który znalazłeś, więc to musi być to. – MdxBhmt

Powiązane problemy