Open bzumik1 opened 4 years ago
Jinak z čeho si vzal tyto rovnice?
dy = [
Y(3); %Toto už je derivace x
Y(4); %Toto už je derivace alfa
d(1)+(1.0./r_mp.^2.*(-B_eq.*J_p.*R_m.*r_mp.^2.*Y(3)-J_p.*K_g.^2.*eta_g.*k_m.*k_t.*Y(3)-B_eq.*M_p.*R_m.*l_p.^2.*r_mp.^2.*Y(3)+M_p.^2.*R_m.*l_p.^3.*r_mp.^2.*Y(4).^2.*s2+J_p.*K_g.*eta_g.*eta_m.*k_t.*r_mp.*u+M_p.^2.*R_m.*g.*l_p.^2.*r_mp.^2.*c2.*s2+J_p.*M_p.*R_m.*l_p.*r_mp.^2.*Y(4).^2.*s2+B_p.*M_p.*R_m.*l_p.*r_mp.^2.*Y(4).*c2-K_g.^2.*M_p.*eta_g.*k_m.*k_t.*l_p.^2.*Y(3)+K_g.*M_p.*eta_g.*eta_m.*k_t.*l_p.^2.*r_mp.*u))./(R_m.*(M_p.^2.*l_p.^2+J_eq.*J_p+J_p.*M_p-M_p.^2.*l_p.^2.*c2.^2+J_eq.*M_p.*l_p.^2));
d(2)-(1.0./r_mp.^2.*(B_p.*J_eq.*R_m.*r_mp.^2.*Y(4)+B_p.*M_p.*R_m.*r_mp.^2.*Y(4)+M_p.^2.*R_m.*g.*l_p.*r_mp.^2.*s2+M_p.^2.*R_m.*l_p.^2.*r_mp.^2.*Y(4).^2.*c2.*s2-B_eq.*M_p.*R_m.*l_p.*r_mp.^2.*Y(3).*c2+J_eq.*M_p.*R_m.*g.*l_p.*r_mp.^2.*s2-K_g.^2.*M_p.*eta_g.*k_m.*k_t.*l_p.*Y(3).*c2+K_g.*M_p.*eta_g.*eta_m.*k_t.*l_p.*r_mp.*u.*c2))./(R_m.*(M_p.^2.*l_p.^2+J_eq.*J_p+J_p.*M_p-M_p.^2.*l_p.^2.*c2.^2+J_eq.*M_p.*l_p.^2));
];
Pokud se nepletu, tak by se daly složky Y(1), Y(2), Y(3) a Y(4) počítat z matice A a B a to by pak řešilo náš problém s koeficienty neb by jsme předali jen matici A , kde ty koeficienty už jsou. Protože už ze stavového popisu plyne, že "d x = Ax + Bu"
P. S. proč ta funkce počítá dy a jako parametr má y, když počítáme dx a dáváme tam x Sorry, že se furt ptám, ale nechci ti pokazit nějaký tvůj záměr :D
Tady v tom commitu jsem to přepsal do podoby jak si myslím, že by to mělo být, ale bohužel přestala fungovat symulace ... zkusil by jsi na to kouknout, kde by mohla být chyba? P.S. je to v jiné větvi než master konkrétně pendulumCart_refactoring , do masteru to pak spojíme až to bude funkční.
pendulumCart je nelineární model, popis přes A/B matice je linearizovaný. Y tam používám protože solver používá jako stavový vektor netradičně Y místo X, jiný důvod tam není - možná že kvůli tomu nejde ani simulace. Ideální by bylo aby fce pendulumCart brala fakt jenom stavový vektor, vstup a poruchu jako parametry. Asi bych dosazoval přes fci subs do těch 4 rovnic a z toho nějak vytvořil fci, možná bude nejjednodušší prostě vzít rovnice které jsou na konci skriptu model_sym
A z jakého důvodu je nelineární? Neměl by být naopak lineární, to by mělo urychlit výpočty právě.
Potřebujeme simulovat nelineární model, aby simulace byla věrohodná pro jakýkoli stav systému - teda ať simuluje dynamiku správně nezávisle na vzdálenosti od bodu linearizace.
V novém commitu jsem v model_sym.mlx udělal dosazení těch parametrů. Bude jednodušší funkci nelineárního modelu jen vytvořit ve workspace při inicializaci simulace. EDIT: Jde to nakonec dost jednoduše, mělo mě to napadnout dříve:
syms X [1 4]
syms d [1 2]
syms u
pendCart = pendulumCart(X,u,d,p)
Tady u této funkce chápu, že by se hodilo, aby měla už předvypočtene koeficienty, teď je otazka jak to udělat. Čistě teoreticky asi není problém je nechat vypočitat a pak už je do skriptu dát jako pevné hodnoty.
Jinak by se to muselo řešit tak, že by se předávaly jako parametry, což mi přijde zbytečné.
Resp. ještě to samozřejmě asi půjde řešit nějak pomocí substituce, ale i tak je podle mě třeba je do "numerické" verze této funkce předávat jako parametry ne ?