Otázka:
Proč výpočet optimální skupiny kandidátů přináší podivné výsledky, když jsou trysky příliš blízko u sebe?
Juno Woods
2017-03-23 04:30:47 UTC
view on stackexchange narkive permalink

Mám dvě konfigurace propeleru, které testuji. Jeden je téměř symetrický kolem svého těžiště (je trochu těžký zdola, ale samotné trysky jsou stejné vpředu i vzadu). Druhý má na zádi další čtyři trysky pro další translační delta-v.

asymmetric thruster configuration

Tento obrázek ukazuje asymetrickou konfiguraci. Symetrická je velmi podobná, ale bez 15cm odstupu mezi druhou sadou translačních trysek. Poloměr je asi 2 a čtvrt metru a délka je asi 9 metrů; CG je 4 metry od zadní části.

Ale s asymetrickou konfigurací mám opravdu podivné výsledky.

Optimální skupiny kandidátů

Bohužel jsem nebyl schopen najít originální papír pro COG. Samotný algoritmus je ale popsán na dvou místech, která jsem našel:

  • Shoemaker, D. 2013. Přehled logických algoritmů pro výběr tryskové sondy. Na konferenci AAS Guidance & Control Conference, Breckenridge, CO.
  • Wie Bong. 2008. Kapitola 7: Rotační manévry a řízení postojů. Dynamika a řízení vesmírných vozidel . (Zdá se, že tento je ve formátu PDF na Googlu. V mé kopii je algoritmus uveden v části 7.6.2, počínaje s. 474.)

Pozemky níže jsou mým pokusem reprodukovat ty, které jsou uvedeny v recenzi Shoemaker. Základní myšlenka je, že máte příkazový vektor $ \ mathbf {b} $ o velikosti $ d $ (jeden vstup na stupeň volnosti), normalizovaný na délku 1 a thruster na -time pole $ \ mathbf {x} $ délky $ N $ (jedno pro každý propeler). Snažíte se vyřešit

$$ \ mathbf {A} \ mathbf {x} = \ mathbf {b} $$$$ \ textrm {s výhradou omezení}} \ mathbf {x} \ geq \ mathbf {0} $$

Nemůžete to přímo vyřešit, protože je to omezené. Takže místo toho předpokládáme, že pro $ d $ stupňů volnosti potřebujeme zapnout trysky $ d $ a rozdělit $ \ mathbf {x} $ na $ \ mathbf {\ hat {x}} $ (pro vybrané trysky) a $ \ mathbf {\ tilde {x}} $ (u trysek se rozhodně držíme stranou).

Můžeme tedy rozdělit $ \ mathbf {A} $ na odpovídající $ \ mathbf {\ hat { A}} $ (čtverec) a $ \ mathbf {\ tilde {A}} $ pro každý oddíl $ \ mathbf {x} $. Pomocí toho můžeme vyřešit

$$ \ mathbf {\ hat {A}} \ mathbf {\ hat {x}} = \ mathbf {b} \, \ textrm {.} $$

To dává všem kandidátským skupinám trysek, z nichž jen některé jsou optimální. Celý algoritmus popisuje, jak zmenšujete prostor pro vyhledávání a eliminujete skupiny, které jsou zjevně neoptimální - ty, kde $ \ mathbf {\ hat {A}} $ je singulární, kde zapnutí nějakého propouštěče ne v $ \ mathbf {\ hat {x}} $ vytváří lepší skóre, nebo kde je jakákoli hodnota v $ \ mathbf {\ hat {x}} $ menší než $ - \ epsilon $.

Poslední optimální skupiny kandidátů jsou ty, které maximalizují skóre $ \ mathbf {b} \ cdot (\ mathbf {\ hat {c}} \ mathbf {\ hat {A}} ^ {- 1}) ^ \ mathrm {T} $, kde $ \ mathbf {c} $ je vektor nákladů (v zásadě průtok pro každý propeler, když je zapnutý) a vhodně rozděleny jako u $ \ mathbf {A} $ a $ \ mathbf {x} $. (Všimněte si, že většina lidí předpokládá, že všechny náklady jsou pro jednoduchost 1.)

Takže! To nás přivádí k grafům.

Zobrazuji zde pouze 3 DOF, takže jsem provedl výpočty pouze pro rotaci nebo pouze pro překlad. Příkazy $ \ mathbf {b} $ mají tedy velikost 3. Takže pro čistý překlad $ \ hat {x} $ bude $ \ mathbf {b} _ \ textrm {translation} = \ left [1 \, 0 \, 0 \ right] $; pro čistý $ \ hat {y} $ překlad, $ \ mathbf {b} _ \ textrm {překlad} = \ left [0 \, 1 \, 0 \ right] $; atd. Totéž dělám pro rotaci.

Takže generuji síťovou jednotku příkazů. Pro každý COG najdu optimální sadu (nebo sady) trysek, které se mají použít, a spočítám skóre a celkovou dobu zapnutí (součet $ \ mathbf {\ hat {x}} $). Obrázek on-times pak ukazuje jednotkovou sféru zmenšenou součtem vypočítaných on-times. Údajem o autoritě má být, podle mého čtení, body jednotkové koule zmenšené podle vzájemného skóre. Barevná mapa je vypočítána shodně.

Výsledky

asymmetric rotational COG analysis symmetric rotational COG analysis

výsledky překladu jsou podle očekávání identické: translation COG analysis

Už několik dní s tím bojuji. Mám podezření , že problém souvisí s rozkladem LU, který používám k převrácení matic kandidátské autority. Proč jsem dospěl k tomuto závěru? V mé matici translační autority mají všechny mé buňky pouze dvě velikosti (0 a sto něco). Ale ve své matici rotační autority dostávám několik velikostí, které jsou malé (~ 8) a spoustu, které jsou větší (200 až 600).

Viděl někdo jiný něco podobného? Nyní jsem vyzkoušel dva různé dekompaktní algoritmy LU a produkují stejný výstup. (Oba používají částečné otočení a měly by být stabilní; jeden je z GSL. Také kontroluji číslo vzájemné podmínky výsledku a vyřazuji kandidátské skupiny, kde rcond < eps .)

Když jsem poprvé psal kód v Pythonu, místo rozkladu LU jsem použil SVD a nezdálo se, že by tím konkrétním problémem trpěl. Ale teď, když píšu v kompilovaném jazyce, vzbuzuje znepokojení relativní algoritmická složitost SVD, takže bych raději použil LU, pokud je to možné.

Můžeme vidět váš kód?
@uhoh K zodpovězení vašich otázek jsem přidal spoustu dalších informací. Doufám, že to pomůže a nebude to ohromující.
@uhoh Právě bylo přidáno slovo „skóre“ pro objasnění, kde je počítáno. To je věc, kterou se snažíme maximalizovat.
Oh, $ \ mathbf {b} \ cdot (\ mathbf {\ hat {c}} \ mathbf {\ hat {A}} ^ {- 1}) ^ \ mathrm {T} $. Dobře, chápu. Dík!
Dva odpovědi:
Juno Woods
2017-04-03 21:30:05 UTC
view on stackexchange narkive permalink

Ukázalo se, že jsem udělal hloupou matematickou chybu (konkrétně transpozici) související s touto otázkou math.stackexchange. Stručně řečeno, byl jsem výpočet $ \ mathbf {\ lambda} = \ mathbf {\ hat {A}} ^ {- 1} \ mathbf {\ hat {c}} $ místo $ \ mathbf {\ lambda} ^ \ textrm {T} = \ mathbf {\ hat {c}} ^ \ textrm {T} \ mathbf {\ hat {A}} ^ {- 1} $.

Stále produkovalo to, co vypadalo jako platné odpovědi v mnoha případech - pravděpodobně proto, že moje matice $ \ mathbf {\ hat {A}} $ byly často symetrické, zejména pro překlad.

Chci poznamenat, že hodnoty, které člověk používá pro různé epsilony, mohou udělat velký rozdíl v některých okrajových případech. I když to můj problém nevyřešilo, ostatním se může hodit. Pro inverzi matice použijte strojový epsilon (nebo neinvertujte, pokud vám to pomůže, protože dopředná a zpětná substituce je efektivnější). Použijte větší záporné hodnoty epsilon a určete, zda $ \ mathbf {x} $ není nezáporné a pro výpočet delta-cost.

Doufám, že to někomu přijde vhod.

`+ 1`, protože je * vždy osvědčený postup * zveřejnit vlastní řešení nezodpovězené otázky, pokud ji najdete - může se to někdy někomu hodit a může se tak vyhnout tomu, aby někdo ztrácel čas prací na řešení, které ne už to nepotřebuji. I když se jedná o doplňkovou odpověď k jinému řešení, nikdy nevíte, kdy by někomu jinému mohl pomoci další pohled.
SF.
2017-03-23 20:55:08 UTC
view on stackexchange narkive permalink

Vypadá to, že problém pramení z toho, že toto rozložení je špatně podmíněné pro numerický výpočet.

Jak jste psali „ téměř symetrický o jeho těžišti ", slovo„ téměř “je ve všech výpočetních modelech rudou vlajkou.

Zejména se výpočet pravděpodobně pokouší určit výšku a vybočení způsobené nepatrným odsazením zadních trysek (místo jednoduše za předpokladu, že se navzájem ruší, vypočítá točivý moment způsobený prvním z dvojice, druhým z dvojice a teprve poté je sečte). Tím se zavádí téměř nulový točivý moment; téměř - ale ne tak docela. Hodnota bude v rozsahu chyb s plovoucí desetinnou čárkou, tyto chyby se hromadí a mohou vaše výsledky úplně vyhodit do koše.

Buď proveďte konfiguraci zcela symetrickou nebo silně asymetrickou. Cokoli „téměř“ požaduje potíže.

Délka je 9, ale těžiště je na 5. Jak asymetrické to musí být?
@Dr.JohnnyMohawk: je to asymetrické ve všech osách, nebo jen délkově? Protože se zdá, že zadní trysky jsou posunuty v ose Z (svisle) o skutečně žetonovou částku. Musí být buď zcela symetrický, nebo značně asymetrický ve všech osách, nejen v jedné.
Také - nevím, jestli je to hlavní příčina. Neznám váš program ani to, co a jak ve skutečnosti dělá, ale znám špatně podmíněný problém, když ho vidím. Někdy však mohou být špatné podmínky odstraněny, vyhlazeny nebo znehodnoceny jinými prostředky; takže to nemusí být příčina. Ale pokud řeknete „15 cm od sebe je v pořádku, téměř v řadě není“, vypadá to opravdu jako tento případ. Zkontrolujte, zda jsou trysky posunuty o 4 cm, a zkontrolujte, zda problém přetrvává.
Takže jste se nemýlili. Matice byly špatně podmíněné kvůli matematické chybě, kterou jsem udělal (transpozice). Děkuji za tip.


Tyto otázky a odpovědi byly automaticky přeloženy z anglického jazyka.Původní obsah je k dispozici na webu stackexchange, za který děkujeme za licenci cc by-sa 3.0, pod kterou je distribuován.
Loading...