diff --git a/figs/gravimeter_gershgorin_radii.eps b/figs/gravimeter_gershgorin_radii.eps index 8712e12..ea4da80 100644 Binary files a/figs/gravimeter_gershgorin_radii.eps and b/figs/gravimeter_gershgorin_radii.eps differ diff --git a/figs/gravimeter_gershgorin_radii.pdf b/figs/gravimeter_gershgorin_radii.pdf index fdc6d03..25b7010 100644 Binary files a/figs/gravimeter_gershgorin_radii.pdf and b/figs/gravimeter_gershgorin_radii.pdf differ diff --git a/figs/gravimeter_gershgorin_radii.png b/figs/gravimeter_gershgorin_radii.png index dda19c0..f414af3 100644 Binary files a/figs/gravimeter_gershgorin_radii.png and b/figs/gravimeter_gershgorin_radii.png differ diff --git a/figs/gravimeter_rga.pdf b/figs/gravimeter_rga.pdf new file mode 100644 index 0000000..4f43128 --- /dev/null +++ b/figs/gravimeter_rga.pdf @@ -0,0 +1,2223 @@ +%PDF-1.4 +% +1 0 obj +<< +/Producer (Apache FOP Version 2.4.0-SNAPSHOT: PDFDocumentGraphics2D) +/CreationDate (D:20201125092243+01'00') +>> +endobj +2 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +3 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +4 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +5 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +6 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +7 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +8 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +9 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +10 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +11 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +12 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +13 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +14 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +15 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +16 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +17 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +18 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +19 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +20 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +21 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +22 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +23 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +24 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +25 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +26 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +27 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +28 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +29 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +30 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +31 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +32 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +33 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +34 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +35 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +36 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +37 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +38 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +39 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +40 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +41 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +42 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +43 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +44 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +45 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +46 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +47 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +48 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +49 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +50 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +51 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +52 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +53 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +54 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +55 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +56 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +57 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +58 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +59 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +60 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +61 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +62 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +63 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +64 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +65 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +66 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +67 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +68 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +69 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +70 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +71 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +72 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +73 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +74 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +75 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +76 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +77 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +78 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +79 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +80 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +81 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +82 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +83 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +84 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +85 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +86 0 obj +<< +/Type /ExtGState +/CA 0.2 +>> +endobj +87 0 obj +<< +/Type /ExtGState +/CA 0.2 +>> +endobj +88 0 obj +<< +/Type /ExtGState +/CA 0.2 +>> +endobj +89 0 obj +<< +/Type /ExtGState +/CA 0.2 +>> +endobj +90 0 obj +<< +/Type /ExtGState +/CA 0.2 +>> +endobj +91 0 obj +<< +/Type /ExtGState +/CA 0.2 +>> +endobj +92 0 obj +<< +/Type /ExtGState +/CA 0.2 +>> +endobj +93 0 obj +<< +/Type /ExtGState +/CA 0.2 +>> +endobj +94 0 obj +<< +/Type /ExtGState +/CA 0.2 +>> +endobj +95 0 obj +<< +/Type /ExtGState +/CA 0.2 +>> +endobj +96 0 obj +<< +/Type /ExtGState +/CA 0.2 +>> +endobj +97 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +98 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +99 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +100 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +101 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +102 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +103 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +104 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +105 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +106 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +107 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +108 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +109 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +110 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +111 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +112 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +113 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +114 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +115 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +116 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +117 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +118 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +119 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +120 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +121 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +122 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +123 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +124 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +125 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +126 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +127 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +128 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +129 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +130 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +131 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +132 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +133 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +134 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +135 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +136 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +137 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +138 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +139 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +140 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +141 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +142 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +143 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +144 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +145 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +146 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +147 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +148 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +149 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +150 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +151 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +152 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +153 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +154 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +155 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +156 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +157 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +158 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +159 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +160 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +161 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +162 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +163 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +164 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +165 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +166 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +167 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +168 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +169 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +170 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +171 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +172 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +173 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +174 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +175 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +176 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +177 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +178 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +179 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +180 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +181 0 obj +<< +/Type /ExtGState +/CA 0.2 +>> +endobj +182 0 obj +<< +/Type /ExtGState +/CA 0.2 +>> +endobj +183 0 obj +<< +/Type /ExtGState +/CA 0.2 +>> +endobj +184 0 obj +<< +/Type /ExtGState +/CA 0.2 +>> +endobj +185 0 obj +<< +/Type /ExtGState +/CA 0.2 +>> +endobj +186 0 obj +<< /Length 187 0 R /Filter /FlateDecode >> +stream +x̽ώl;7OQ/՛I0`R x`gF2$C֊ *sNJ>Iu+w2Wx_?_{E>os.g}{5\1Ʒk5Ux/]oW[ _-BxwE\•CxK__ +)_k,)^9}GǦM5_yG6}ߦMmrem4nJH%8m?MiⅯh+nm_xZ[\6m}ߦMVFW6}ߦM1_c #zڴ}6ŏ#OG߷)\{KJW]7jzޓ'f#8ZFQϻkW֧<> :FQ;H=i7O+,Ycjzޝ[5Q^?wj逸3szޣgjQR_F@G)+SG?`=gKL36?>JB24jzޣPRQG?`=k?0jz֖UaZV}תm*FlpUGߵh[V! {Zp[V#1UGߵk^j <>|{HF^JӪZ5^R//UGߵk B˪Z5^˪Z5^F^V}ͷQ߯bGߵk= &җUGߵk=3EV}ͷ[Mk=Z5ߞC.eJXOp[@_wܔ:Ok|{=KݪZ5΅ +}<>U_^r ӪZ5ߞy 1ҖUGߵk=,V}ͷ#{/gz|]#&qfGߵkwRk|{l=Ywҿۑ4g鯎k|{὞Ywohe^ko|צyv\H;]ّs{?S5;|psd6}qݪ6~_x>M_\ _okw-*LxZkaa6}1NL)|צ/F=!Ӌa9!ykl~}ܳvKk}צRmkd׊+b=ڔ`SH=v5n}צ)udmIʽ/%/:uv}/]͋]͋9m^|5_З q|bkŋYPsk+;KwvV6W֯󛶯`.[z=iu{=r{=ip{=m{=ik{=h{=nf{=c{=5/ζ0Kcѯdfɋy`\,q{'L@Ro#MG΀4&= 멍kV??s ?o}ab*D[5ح6o`cիs7񋻟>߱ {Q 2dBkKKD$3~b-#37kF+}fC׬=z]gW抽ǁ7ߝ;x?Ҟ:[2wk?֫=I=?֧=5i7=JOXؖcIm?$Xo{/{cޞ\h~{>i;y۳70o' }=~{+x/`Ñ+>73~ =ݞb?c#,x秨 )^3<w{~=hݞb?eOE8ݞ#>y}?=ě=?&~ƞGnOQCSw{~]Ӟ?B7s~y!S;'بSrXSk'X23yO'~T|`gHOE;u~<_\#{1-^ga3Ӟriϋ?9Z{{=O=y'>=O=yv=͞=ÞWriϋ?9{{=O}{{=O=y'>=Ow{?왟xO{^g=/3PӞraϫ?9{|=O}{gn+OC^gɑç=/3ÞWriϋ?9`{-|=O~{>yW9z3?y#s^gaƧ9/3Ӟriϋ?9rhiϋ?9{~3?y#<,a{I~X{ ^gh3xC8!yg~_%E"0Fyϭ1CV-$81 +~M3?G?$t"şD}bԀy!\63D?+҄=_=Za5*RgD?u<_Y'+~?5~#-ȯyK xSz?#"KO1{꿼`9҂_wr{:R\%7W{=O -BK fݲ_H3;1$$[9 ATƟO~'$?eFoe ORg3{,.%+}v?>!); +G>x_}@زŷW~S"=ՒjiV"wtCq-~i],\p\505) J喒Vi=vS +I,v-cd{):-ɣޢk#FYr {g k"X15RfJGv7m-3*u-unPbpe⨧%4`)]#WrrӐ+VXY\!esjd!̡9VZza+pccɾ񅇎gF;fZm6`v\ij ?⚶;gdrl^\jOOSR c)i/Zh.esfZjU%;i?"& ĥ3(E/<[v=f~{FU~5cյ:%eÛ]%;:y\o+9ycC0ZxmO!A7h߉yTmҧljwPѡtnK)V7%#w y^#= YЙ#K@L¯ [DŽ_ 0lC+OeBȴ? hRтƨ !Т!lQC@cX# +O!x;xІ7$%N 5CkvDt,hwK2<^ha4΍~4RYZK xp.MZ QHrS%xZE쇑a,Q(o`pSZF&D>B)bGpkX0\x˃kWtx ʉWs@6xH|iW> 8#;(1o)q֡9#;rVHYx5nShLTsu\E7]n⣺ V4.5Ľ%}'(~e.Z,vbiے;vh2^M9Ċ e4JHaFh1-p\pY؟RmcX}>)@Q(+asq@=&壻VKd5rW[0|*]RC*T܁TΉ.S`M#HpS2F_wLIWp y<9TyY:zs<$ Xl:djѲeǕg ['8.S{g[Ƶ L.H#HBxf8ꛕl#LiV-;a~AC`"{q q3i54_!G q6Qq Nh\D ``8Pq[40'Xrh .7< "W2 K`>Qqkv0%-՚)UF ƾF|v!0Ee +H v.jpYep{xIbtiDB$v=l<ܵ sa#ԙՑȶ!zLYpC2;p}HC1+1@LpcLվ_=1iA˔>1VGf$%&Z,7s=.fӐ>U:P8LK)” +gQ‹6r WFrGh_ϼ(/]\JChh~^gu}6ȥ֡qb6CBdrxW%pU0*CHcj 1kv; >^*146lv\k-Ґ`)^4.Du 8eHM1ZO }0Cb5UFIgL6gKSL@,S7`h`ݝ0]~{K.D;L̃燹.)p_JVgh&s˴lDE|ZVlG[͎/<D)sLQZ6иaxL-ɢ}jOtJ1 t\b^45S /_r͖P~*;!iv䳡.-g+ţji +_B巓MIJ9"5nun3%e Z5I[@F5bې’8^5́ +L쌑mpbB;}(10 >#vU~$,aZu5s%9L'MaPZmϓ".ʹn\'F-+btLf{ >ɖHOFT_DJ`Rd <:hv]2ŕ-50DGw2ʹ%pYPf#aCW_2H8[s)atFQjׇ!ndwWG8%&T +M{X(H+Tjn^6!mą+C_%׸d#s~dUMabnSǭf]`7B#O! a^w72-?/<j.& |?< Zb3Tqxy5MU qقt +#|&^Ard"dk]9Sa̫jmTļI˓.1tkgd+Ǒc_WiLӒʰZqԬXpa4pn7'Ն ƒ\}ZTtqh|c59ap!C<%&ݱ#D@г™uCG,{fFӘ>hKFㆰk 7L`-;Scp)32f`[Qd3mV4N!+ܱgV+Hm00%h~9b{q]jQ"TrZ_\RơC_  h ȼWGY%ICۅ3mM*n5UdIԆ!c|1bNzm_섆w 9B"{iKev +Q$rBmC'&N,۱(QcyI +p)^ +5Z)BbpC) Wbl5FҸ/Ԕ 󽱿#e\I}R8rNn<;G-byx.QYEd `b(aSURbkWu<Wsר@z10@`ȲkaJ]gilh!8P$cpOZbpukg4Nْ=*GXR* 1̺Ѕ]*(2m u[n~8r] og%뤙7&y@|l.ozsE Ԟk~akrZT}F1&rNBTjC !x lDϪ~G.[DjEBMƫ\~rUW;B= +qEJ-'SF+x qc5L_j A)n ,ׂnYHc +\5p%DˌlN o\lf9 bN owS .Y%ģa/Hq沴-rc+ƕ oLfbҲq3s.i%H XғkWq˘Yĭ3i,wLLMLS]Hܺu**T`4.W\X4sИJݬH y[ +JߓXKU0Sk27)7A6c^ +ȳg"?)3@K2; d,2ך0uF!DjK\A2>40w)K{g&x+"s^vh9U<<EX +-ߗLý섂Bd#{ެ d{X]i#*~S;|a&u[i(77YY{[׀c9/-wU#za(Jep9/fvE Se@t+=VDg]hgR}',Ɍ$,뎮VVí2u.=ZAx[8)Tuf͈h2' qUPcA>mxLHAVLB/A"noeP5W +n|AT; ^Q7Yutѡ޺̌$s_aT"&ε B4ѱlou4 k*p<^Hnn J4Ǧ"#?,N6XٍAWr)DT꟡j]+[:Mu,ds뼞6Xc;:o\6;ypׅ'1j t_1x,+ZV7p_ +"- ʱ"KvRN-4ϿC 1z\ {uh}^7E 4q>ҽb2S.&mz$iܭuSPޖĂ.i ^G'Q߀ Uc, rpbGahZCzbj1[r{<րw#¥ \?l5|x>Wc͘ijL# }@8 ixk_[5b˞v; d0=F 9 =G%#Sywgc,AA@];C^iK.D< V);_Vtp4Jƒr~A, +ĩuJ 7!j! U6x'Lj[yRfE<ОNTM=Vzά; ZFU^s~e{I^bAcgsc'I /.4neGʦ+KѴ:,@$Q^bxg PHU9 Ӹ7䮤{&K[eTՄK#xYQƱ=eNgJ!Ԭ=Ve׸/ 9Y$D6%5iLZƦ#L뇜Wua_w.PC":.G<귄B gӮ4 +]Yo5sg +JbUR€b?lVkQf`ڬG}Hsw =Ѵl14Yr ZrQka0e{D,|dA5^U H7½8/3l*"0? ۻiʮ/៨˛u YٶNoFˆ ;5Qe #3(i +bj5MN~_Q8S^a-Vl"6Ŵf W+ si:FG)gf}4W@IPK\f4x Zb?z䆚tfCJ+Nf m&xH +2؞WFmEmHC8n[!_SuMi^Ni}KUvˮǂam@<1UɖpSCPQଽC[(]l +nyIngS +\+v{2w))gX 5q!beyew%zk~f({0}7IaZbq_2XX(4L^@0v9]X0cmމ\OVrsFZe=ty#wo܀:r@!q ~WH5JKta*$-린YbV]c'$T4E?֌phzFڽZO,bH[i?dT/$?Ś)qP;x"M$qi褳k˺0XL3fi\&fK}ySb?Ҷj,ygi nқH-pݙ;Rk: Ul::ʬ 6RCf(o}S[F ;ubJ q%gIKY*FgXqs +wy7w:rc5F1-kLȊy +jVǪv?X +P%/@a6JkȆn=XcmF5&ࠝH|I\[([+2VjT6L6V#5~ݚwV#;6ЌWq|jFakV/FjH;ըv9FjɏXTQ1ʓmF6԰APH hd5IhۨXja #vV#5RJwpc5F"uZ`Ap\`֞4&05R:X#5ap5eOaԶHD2.X#طJwQ`ܳe5 auMb5ZIRFMmg hH ֨=֨:Ӗ֨v<ĸ8eo5SbEX&q5Ȝ_vX: kdT%s;aW`BngEDHY?ͮ-Z#{> 5u)16jT)\|ewT#|MB5ٕBSH%ԉx\FD:y >_⫒mFo(Ⱦbm +ƨzKokBuNkd{rL5RcϒP\`jd_rFkXIkTg{Pi][F6:Ekvq i&2!);Q\hi5RPIa"+MX#[˛؏`C{Sk3gDh{5Apkd<W +\[ƨ7/FCk$r rڂ5F911\@`& nnhycvZ(NvY\aYk$ŊsFBZ2S6\cWlQb5jf<; ̞rFXB,({촪hx$r +\#B7e5Q!j`ר7wxD]\FRx;b,y\Xʂ;iQ)z\[F0xFfރu)6ikR2#z5b*R&{nFykF'ȩeS~X\{)&\F^ F a5#F҈6ZL6Ti[쵾>9-2M%ĵEk j9ns +G5I֨wGk3C1Id\F^NZ#ΨM"5RZvZ#)~ Qx}YNkkF(([dLb5 FOb5}1Qt%X_a ȉsפ[7Nk4I^W嗃(KyvFg`޵Ekd|.fӃh`$OmE/!rRqzX#,*ȸh +AU\(4䧝֨x3ShQk>?hJɨrm0a5*CbHЎk~CԹF%`a.v\#cVׁkd"2Ѱ@p;iZAk:тFLMF-'^$c\F[y]'CF-p;EjDg EjԖCaը !Z5wG5?zF@"4; ˬߞp(]ƨ8UNWalf;;Q-Y|5EgN>`Լm,`jjj$oz\kFyM+T8IԶ~qNj3< 9~?5g6N#K#iTQFek2=rֹ5nO"6ciAs_Q͞xY;Q T0lqqWf<;HFu_O +<8IV>/m4U2,+#<8*mv+NN#WiTdgy!;QxچAjd#Bi1?Z_ȶFB!,"5RN7ImqNjL*n) SrzE^x;AT{]zumaG j{5&/vFjv;_'o5꧇ժty&>p5Sl%Ԩ!5-R#Ggׂ͠;QvR#_gf[9Ho,P;1 +hMmvTJhj:PrVtll"g;,PIST#>BvIO\NTk?P4EJF>H8#نj$ߧaQtvNQ +h犳4V{;IvJŮ"5!1Q'^<ԩю\Ԩ3e'5$;.1qh'ˑSioÎjޘuH: PR-&M ;Q㯹)1YRs4RNpvAjԱW쑒u~UI"5v ]-(`5'~㹙ը:ag5&55P;Hچj$>=Xdىѥj$r.j$>'pz;; 5Kv9t'5D$5&y$5hA6R#./jdF׳qq\ZF6xCjtVcid4&idب'qqr3[ON#]֢spj, ʩܛ]vV^3YdEyL?X vBVc~R,YYЀ['&/;qc5`FXpjRZGVcUwjT՝,vUYH&vj$L0S;@5rtŽj,-[?P!nZpڑlf:PCK%:OnG5JȠe̴ %l\wH*!Kj'Zy#5JXy䢟3{43wRc66DԘʮ-P#NbmXIHlU`5$SM?v& 5*(^vP#OV(x5*tkd\YgFF;,ɝH?˟R$;Qv{FV3eFbLNkVIkW.e}A^ĆHvZ#KUgK kT+DuNk*}(`Φil&&k kRZ5rUSEq̀1O8G7F%\AVAGFٗNV|{F3݇F5bصGmnbYљ[?6VcbȤXtr۬p6~ٹV;jYAlJlzqEnHҒ:p[ xz\?ID|ԘTD rx{$5fg:IYMԗO'Q=“_vR#}/$5dx-5ǶaORcj]);QHNHxHT9NjT;OR#Whh{9#p'5VF7Ijb\b{B'%dYۏT8IML01IjSLs$5/͖w=pN#3=S'0@-AIJ؂ȠRq8.CPgQjgb~.Tci0q4np4{7NT#(vR E /P4*0I  ,pmA4UV\wѐRxU &(cA4!he;D4N4699`chH + Ӵ8!UBVC4A4pS s@4lEm6Eô5 iJ646 sLThH3i֚v4 ZhHqT{`4eNFCڵ2AX^][ iU!m- I][d^o'EC/睢!-@ѐ54ECZIކ8)XխyhPcr-"vkh1X=9FC!FCfc4!ʨ޶c4EeFCڥ-X jksv`4$Y1  !tX iU4Va9ahHvf !-9Ѯ-4C(" 8}hHSg5el IgQ439ECZ䊵W ip mh5Y110PsX0x a;x  !vHѐ,; A=ڢhHcm +;ECZYg i?EѐvO4؆AH*ύ! ilFJN(P4]rv%O7d5 kРo<ҬnchP>QB4|e,؃ae 04Dvum14АvӵР1-z%m Il hP% ip8u~FРFouNаQ; Im*ɪ<I*Mho-Z4UV9hhP;]?}h6ppphHvgn'@#i j| v~FgX):gH}39ň-~5;oPym j rϠ/H9P$WwvgP>hl jx[k<8sƵPfcgm;@p4-5 'ahPێ<*]Vs4%34a!T*eSOwE98q j<!p[a^AZTEPy'eAk jw PU+ܭu  J?#4q 6@hP+N{!4T({;>X j,V~ 4X`2۲ĎT5OK:vNР"6yO2o'hPk<65ϤqGhPsV5ݱBE& +c!4BÊ`f;B#)bE&;B,/AgLschP# {е14([;Cm_NF4IkA-簶wj$ہР;̆؆Р4Kn'A#4`IР's;*F`4EV^L7wj^$m#hPݎ'vm4)M4(EH2wQxAAƏX IE0V.$hh޳'<3LVgAvjx][ !n 5L> m6MHhpKq_7lϖ-@AC۷+Nd cAvFRGrK^{4\@0iACK[ G0 , -zG\ݖ"g\XrA攌atV٢N`U:w5 BFaEzQe,:yƖo n9dh!$2IX 5HR郢 qwP4Tn:7,J(q~F`S]][֮zECMu&hqtb5а%E;Z"ăē~dPKrCCa LhvIƐ> .bh(\ +t@4"3M`;DA#rP`C P44lF]GA IH8 L:Yc-6-C:SHQfrmq4!rMmq4dG#CWEѠ['ccq4xA61~h"};Hq4T4sn'G#AFC j* x8j gNzh7H\[ u?8x h$1]흣!SgwKozp4'ek8n o} +Dl,F;h6x ֫\j +m ֚4<) G6Avf:i_jUk xai6vޑ;H36$44۳+Miq4m hiJԲW!{ vo~Ɲl4ԫ(^|;AJg  xRimboDc.H~DqHk\+< #5N%0XA:^C+AQ3j ~4%gpQg%H*9;HCK01A{g WvqAv'HCPCzMm4RA0v4 T y v1iGD2jh0AI6vhXf[gS:9awkJ'GC;9hpRԑͥ;FVx =0tmž M,X1c4K>`4H!8yh 6wFYG/ˠyvr4^y\F"Qƛn'G#wmF ՝DbU38ՆwN4Ox;=>8\e_s4GΪh[|88\ l2 6?NavjS]'H=' .=DQ ;H#3h`'Hݠ6>3Ã:b]Y`؝鱃4XoQdl⓶4X7H#$bkHi$t4Na?G`k ҅3qye7 ֊1)u1 h15G5Qt۱s48x NXփ!3 zs4tp!r@D\lji=.]@y@~0OmAb4-Ad3 G42)-Fo-0߃AH`mI}h<9&dh<㓣!Bl3Ѡk1c4xc4.L&8Б,12N`m]S4xvGpF*)FFڝhH~jGbۉ`u}W'/Thն#F량.YCH*A'w >Ukq<1l(Z;FYx^H}b4N;F^[?8 u<}hp)}N'G+s4xlAIwjˢ8 Zdo \us4j}`&2kG03I߸c4xLRh0 + Uقu4q?A(VƒX K~(UwMiKlQHo~ @jw<(b H@H 걓4.VIta|{$i\~1}Ò5SZbeZH ]څF5V# p0H\׆Efq Kiv&%>)ʒf5OSm`cciC(QWjٷ-ITnMۙlKmF&T{lvѩ;cNlDg.qdlEuifG+5˱KvV'׸tPY)-%f +_ +/}Rj FJS"dptP[LBߵ>`[%/c{-xVz'$n{Ç}HY:)m76BQRY-!{Xŕb\Fŝ bU9XRߙ\S#haMzEߖt4+#*ή٭+͎$uRlTVm V'( LD052J9c7F %>pMvr s'ʕ$rO|[$!^8ðaDgge٣P]b]a5,:Kre[L!A?:Zj3kT^r~\(Kl,,MG[؝>5T.[p?-bbV"y]/ԙ:5D|7&^,aEIT^1w6D^ogaK6SCj̞!vI>|OB"abYs"/6f׳-Cm|g5b +MYd3ixlag5-$.>$,&N$=6x,{EO ?xiZuN\!rĤ:3039=I5%Ŀſ5(2 %m~^$ڳ-uZdǥىS^ iNVj\la*lZQ>6!=]*Ԏ9`f|5jhF iJ!Ȧ0z JQm%J?mћ+uP+̮9/I<ޞzՁ$mc9<΁VYEimRb|GM!I[8Ys s]-OxD,3ʊ6i5EֽRvy[]n̦!hWE +{b~:c4HMm9:f¯OM Xy4Bw!ZL8I[XjLs;byJ +~1uښf-I +_mǙI4k|3o0Zay4R쏋мc\o'Qn7'\[Fix#c5T` 6Jc6XA( ѺIiQ?4Jcp*FiAFi"&xj4Rcx6lw4JKMmiwL$,ѹg;Zk?o4JS(x`0n~4J^h0TŽiƒ-NL4֪:o4J Ӈ][F:6̆((-kI[t;Q;F4Z3iΞiO>8Ԫ߾qG6N#5(Ml0nq8s4jzi4JDiZbc7vN14R*T\[FiwzpV{]֧sE!QS+Cn}QR4r&B +3s4JK ɚq4J$r(mvjNNB&(-DgmFJ`j>0ל޲c<]~`-(bq#FJq4JՊH(޲ !Fu\֩spnFiC4fՙnӨ[9iv?@4*0Քdy4RwNiwP m4*FV0V4Re{x;QkևFBͺ%Zx]R~4R.hFJ٥EiX5֟-L#5LH +7LcV[4jM(4R+̬4 +Wq5R@ ][F]I8P*x\jP:͋P#2o; +kXj5R svb7Fj?btmqmr>wR#툘1FJ5jTY) vN#%xxFgTnFj쨝VONjVpE #wP#%o 8@"WZʤ1.R#5>HwR#5686 Ԩjb4EjFzIjw3嵠s)Yqh0jX1/8YT Fſs5jwBvP?_)lFt14/AY!7~B7P#wd4F+bq|j" +qBȝnd jעzԷs)1;vi@pߎiKL#ytS[,NLw Ө}?wmae&WcFnA>W|-`4R#T̑i;1= m(FjgʻS1P3(ڢ4ߥؼC RDwH#[hv|i̬*o46$1NH#Kz΄Csq1܀~;G 13Gт1k8םјQCph\iXiAg4-VF!11Wش#K̛Ņh̬vhD]!uLD4KեO>dUD#Yz,  h$0繋Y!5~M*70Wtޅ`vB#N*Ah!Y= ,Ezِɶa'Evٹ aP {N>#J֕v > +ۼtg$@aUcxFF AW;Q źotF]G pF#8Ï[YpeT78Ȥ38c߶opF#JVJg('`3&?xĵ;-Y5MmյGpe'HB!s`3y@3FTaRwxg$[Ufr?"B! uJ 0.8#b3꼐URXX0ؘqS't^̈7G'2#n>3qBNc]eǕ$۩s7R3fUܙ"7owLuS̈!TϴML/楅`ƍ@gghF&C~fd91٘e<.D32c1ZhFFhF((hFV=a'Lьڣ՛S44ړ|Yˠk#QM6sYhFVB46hFޏ:F36=1QkͼzhF0I{_fdρÉM)QvdPNhʓ C2zH4#/3_ެ,`FK5k#6N:`FQEti2UsR*욍gR7A2fAJeTu1 _Neܬ޵ʨZk_Neܔ`1'TFˮҭ1QŹv=02RsEqm2_sB(ꙊʨhTWk왌Vݺ]&f2"AYF6u&bmk#Q(tq֬ئC^whM!8+2Xc7'%ڪ!1Jah.6r8Fl{i +0ŏi|u{(icVX0bSW[s"-1?]6)t auh q*j:c>=j:)QՃ;~9QN8F>ŠȀ~oG˸3ne$ԧ=LC/2H +dLk#`SULƃc)\=s62+ڢ4]d$]KbLƃ~ +AB(cZ8SϤPFb'vS^vsF*#m'/TFb D.s*Iݣ˽őxb,QG*j/8T4WUjB"sz#t&MFic9ꕭ EzL&i}KFL&iGrQ2H÷bdV׆GrhQ3Cٵa6sj1eF+KZ0(Tzdumx,o]&im*wmxu_d⑦ &a&im&%DZ0w0HSx0H[ M<5b7 4*2KģO%o`W׺G@ͼţIxΪGZI8xjWַGuyt{GZ9l*x6O>M1ƿFe'&%GkdT=m$#xMDW {{FAS;Oc½#BώO>!f >-zN7F6 Zg/y,!nQ )$'шNgmˣ(<:9v3H9i9Al gv<:$qA'iD+OѨFF+K<(YyA(r6<uV;"Mk˃ʃ> L kDʃbn[g+*[dSCOQfs-=4;ys\3 +]Ep`36~荵PAY47Yz8ۯf$dYzXӃ= R֋˞>Gu>GSnMݵb` ܌L= 9%z47zkUVhaeZ8zm |=-Ʃ6UV׆rl֎4瀗ڰh^/WϭxPt|`FSF$puvNmPۥ'Q :gES[-G㣩yvw0tEE00/u\.UkNZaYӣGN) m^]o(Sdn!|ξAp`f!~+֡]==ڻÜ#E%z4q8l=ᾉha^H)>MmTS1Bqmz1ݶwG_r|=L|="3e_u?_@‰c36kâ-Tʺ~2|=, cBtѢmSQʾCh?@w$_&8O:zKsQV!046|=YwK%8o&a7Nrݻ3|=b4D_)mq[Q.zT,j[I_&_*h.+GUE^\U`o 9̵Q-vMSзxo=ve-h gquCkݛ?GD6=i#ywD2 dݥ3= H/EV׆G @=k而ȉ4 ֬ _vD{PmPh;T/{VY=Ex+.=H=9{D{ +,ߢ P݃F [dpנ.uwܠ՜#H}vm{~Ku+]gO$82GX:qe=GS G|Ӫu,8l->HmrKՍC? umu&l+bkN<7X]6>*cwq(),l8|w*nZtLj3>JpFI;`G3p= >h'"e8\v_FOy')-8| h%Ze> ڡ|6FOU >kAO%$9|жi hit&wtW/GWX^I}u;N.5iڧeL%tOs2Xu@2н=R!Y7DϢ-V|E֯.-|5Xny > ^è|0]R8|J@+m,dsmN!`HpzTCƫ׵۝pJffѺCG !nA ~z׆-S%Oדm?gƵPM=fjCl\놽36'mCc'{ZU&{C׆Z BhKb3~DA/{6=SRT!J>AS=S7 S,{p>=U,,fZg@u˭FSPiϿ\ +V`d!?l;M2=/N~S*{<#a kTy |w+_tl q0};q={U=e0OO]b90H±ꎕ`əŊ]#xGۋvFNn'{;ĩtm{q%W6_tk.uY~wZipc)rVaY +#S*|쬙9vDZ9Væ* Xp\~b)ᣕ/UK5?SWR><_>8|>hCdx1lؓ->~ W[|X8xuiX|*¡] p[,> +AwmX|i;խACl񩜴У{qRuڼ>,lM >d8Jۊ宖T[IQ]cRzʼn45/6-_{bFXWjt.}iEsdvh|lzRPmh9Ͱ5m"A4^EK6̵Mƶ\EUk{@5~GR3M#gg_,M&sϿLU[ަ)Ok/],==PC2RDGm)sZHv> !@D$>[D+t<4Ύp`EeeNPX3'WMmU-M2n34k ЧK2GYZ + iFoV콓}YƵrʬ}wfCh.eh>+bw(7W/No{/M3Hfus}2ۛiA(&6.vt]k,?&c4v󃘿:м61iO9ujsC@N$`' FӀփe_e8qOEriԓ +4:/RkmyݴRqͻx[}V:q_~Wgk)mY:t{|*biIů'[ EܝҘ[~,r`]@y_@Qoڍߦimbɹd]ݿ4,5r? + xxJ:NNPW6zjWB0hEZ:!J h}g ]#s1X_q)˵YDe%~5Hn^t\!Pk7;+{3x k^2'Ճjp\uN%~q)H)a7y KVuՐ(r"uR`BbfrrNql\2w=of㶕 7@xqc6pJ{qϛCƵ n@b=Mh\:ͯ{@ KwCиV +zrF@+v{qցh\huX2H!Icw-qA"mVȌe˺,4NC@Vg4.-45Kh\Z@WLq-q6vBvRքm>Lh\bbBzabC,mߥѸlt)q)Jw mB2 %8"k2Ol\\AlMa໯F^d\\GL!]-KWVWMYN|q/k*׽m9Ao8. Ap&yqy<;^l܍<ǝٸLU3vfl{^l\@f5Ѹ!|qiLZ|zq/t)qے&4.˞7bɸ%ȸ|_ɸfVAR&-ċ иɸ]/2.#ɸd\SOgd{Gˋ'7Ntܐ?=q(ޛK3ӛ[#l\ tиf/6nL%g&72o4w4.N}G6MѸ +q]иۄeHFZ Do4.{Ë7m7I.'K;6qGBo/[X0qjm%0.d9E~37T'0.EVZ/0.֮%0nWL`q,[]'|7UFW+ZB|soWv9_ѸtS*MƭɸwXɸ;F{ -}d\ѸݰuLh\,@o4.ݔF靻FK=dQLl\UGظ|vLb^fuh\!0qQ&By/8 +:qe<ݳ1r97ri5[%']{Dw뽦7!rD͡Z$m%77uOxre^ mxi34&Dn\L\T#\GfF.64m⑊#WGggfH.Uz/)mӵL=1ڽ2arA5\9ߘ\bx#t3&ޠ;cr]ʔܶ,ZRl}e Z3%囓 ?{jFncʞ9G7'ꆚ kQ=m#r։ kcL'8^ɵݵ2ʥ+ߢfPv8r2j@ZCۦ5mצ{r2r +ߠ\wN\jGF>ňa3')AڋCgNn7apOioNn{2$Bk'mN\˜\p -srv NleZ!R.$oxHI(̤ܓy9NfRYzN& V_*N.S`ֹlu2rs?V3-G!aغ=qʽObT:c7r{&Xn{-8gV.9y߬\)NY*.~Y[;ڡq7+)L6$efe}/Vn>30ri2kxW' vt'=/#r)4/w}/|;L\j݋{wԄ57.g&x홗Kq'^. ;xm_1r\[hrK7.7 f\s6m'\hiuۧk=9=h#rۛtD܌˽>S̸}'\>'\n [px$g\.mNp.TLܽ7%rq`-=1#rwkpmMRqnS3.}PC\.Z.ꆝ4}lV3./\n{<`5g5̸} .|=˥v.ICqfqNqŽ{62.u4 '\.*_qݓf\.ngmd\n>pm r إ%h{\gb.O91WPePys\/[̽Eh".}&k]}&Vh8"A~=>:GUO/`qݍ-Cc f>f.|Lo\q3 OR>'.אO'.., k S&\4rO\Xp|.(_\:O_6vD]`L5 SOUc=DO4Z==Qg,GZQx<=R@j-1MpH#rڙltH{jcZ[N#\=]4H֎Ǵ60GW4ʖ9գ7N#z,}1M=#M֖Ljl=s?E[4k`ޢGeh#'cVh둶'[EյaA-0cHMv{ΰH/z$GFtHqppH۴O^]imY7;&i?#mݰ  WE[ս)EWm[ӵơqu*lpH{qGκGZB\=Ҋ㓫GrӕA;_rH2pH }#m3pH } ]=HLiHLi4eփ/jJ ieI:Sh֖/\i@#m%{֝aQV m=`Эe#(݌ |zAGZ*#~S: #~G'p W40LilX|tIK#yz9m]*bUֳ{sGݷ'O4:X2yz!v[t|`r}ivfZT= 򡴭B֣tf(e\ oGZb#zmr׆:ZN%6փvg>zjmvHv#zr3]nh['[bG  +m=h_=Qrш)m| _Z7'_Z[DoޝQ{G|D_\Ԯ _X\%N{nݻ3|=U#AM\]\5Ѷ\v|=hVvR(y*k׃Z׃cvQ( uAd!<ҒvX~_Ɍ}DT&W>'W}'Wt;2zd5qvkt7ՃƦ;wM(ҷyգz7DWq pTmӵ%]=h>cN4❺=>z\=P +Ξ˶46ըփyu֣t 1zPo+0łl"E&SڶaVzuN7QhAkcNkSiD\aiԃVP_1qP"=$ESO]ķdnn?PJBp]ogL=C߬MVhQDݡDWO Ν~CntgS}jz I259I,zBlΎ/SyES敳3hQ3hS ]nLbAC{L=dnzL=lY0-kQ6׆G;#p`!PkZҠVWϦ\5ʻ\=j{.oW~\=f0tG$$iCk[ζS2|0abpw1ZBW2+RkՃ^ђ#alJL{Dr\w]=zP'Wdk,6[Ϲda"աCxh6_]=6ޮ=\{zظnOpk*o[OUSf/z̢wp[YTE;0O:_7z_7zlQj"pNUYO\mrۿ/zӓ-ZG;!"EWv,,+zX-3\l]=Z.San:hânG =lG <wWj۹n zࢄv)DESwr!qߝV\=Y5EWOU_>â{;҂I[-9\-Z WKn۱%WOFkգ~ٵamB__vT"ڞ9bՃ׆I}ߒGvubtTsjb6AgdQqeSOUvv[nʫm=hm=.g_E[TXNH(;[6#AoM4 ~="sldA@XaM>]3n6=Y#*W׆G y#`M&ξ:W%X{DW;CԫCOEj]ۣL +F׀euԴ6a":88{sf=A,C7o_C|쑕`[\/-{pQ˵a0q0 c䵉Gi`IcaahhdaQg>h청kƁGln(%[EUlO_7l=loZpmkpZ +Ktό\5ѵe9&c\=+awlFWjodnQGWzrPsL\m+#rvhaƾ::zjtM=Ϗ{ppq33L=a 7׳W&M(ڽ9ü`|ԩH rmxzШ=H9z.Lዾ.?D>.LaݙKw㻶B:.+KfLt\E>:.D8q}m `Cd:.U{,<#qHzwD/ZM$ ȞŻ6=!qW 1kW f8.gȘ*b[bW",Kd8.vCC|#ϼo8.O E8nU "1]{@tp\Lpg8. Y7F ǥ2C:q7ݪ]x\:ńS`*ԿSǥbxƶWx\}W6Pގx\e c2)ǥjQV͈e'rnM|\8"q5v +e<.`k*x\u>߈ǥp"سMx:zLt0wgWsew_n[%Lݨy)qKE?qqq٣2לӸo:.{cgt\5pkXL%O_qD>KOj pt Hǥ" W{qٴ2]Lef:EK/:.߶$oeǜs踇#]'q!na:-'x/:Aݢ :*)t'[O?knMg̫ECQAۣ?w^XzEHI,3m|(ֿhu!&_qp/2ʟ3î@|rǛaht#o݆mDKEvڈ֠/HѾ]I,i2|͎W{;aa3P5nD@wauͶh}En +On6Gޣ]k̉aPE*:מ EuiV4[j%69akcA*)BF?*EifXRrQrQ@$XvSZ[ VP"x.R[_U#}i=ڛԯ $Hˮ3ZQG{Ԑ % eQ(hvxڻRo{_h&]!@IH^Ն:_6qiF+Î˥q/&ggl?Wd5ݺCE0T{M>Q}s0dݖVi䮋!յn/mTbo~nK֞;}`5f붷;?I8v/ޮ-sc:?툱vdW{Џ4},-iti ꚭp{44|Of`V4ٕ9Ga9(|.y$TF܁79h5/#ωXʎshv$M~](VRLhsLm"Ӷo !Nݓ'ΨdkNE3y번wfg-oEfHͪ"njsVڽO@'_ HnY,ʘ}u= ĥbRIm h?=I-k4d95t=^FYÐV/ڀv7i:g=" FwXV&PM8WaU8* +PI 6uن45j_Z_ +i#{?k7ۯK}*uJWPZ?&5T #U*m[[#u#]͕Fca8Xyo,E7*{qʓ '𚶌ft0AkSw~D8C ޯ"'Lk^v v!(c +{ޮ}ͭKf^N*a8I$UX\}M~%>xhM"I95,H:kg ΘCHU'jwݮY]w>b.PJe!+X{뺬ٴhPҹE:ۈnv?@3:Vomn::w[!-OuS}mMco7.J[Vڋ_StS[Ҟ88*7ضoծ>o]їLN[옴ieA!h[;ʯI[oAK+8}خ=;S[2zb0i,F)3Jkpi f4~:`Fi<12ԮYc,r?2V; )2pڈe4m.nZehZ[fe\e^p؏rM?6rɵhZ]8b%_h˸õh22c,}4XFIR{be4 G}HeTGbJe4aTFi~xKRC-32&e18B5lQd4e)?!:{9QZo'LFixg24\1QR{xhwg2J|˙_Kk +}Wk왌&ڡHzB%#eb*#Z{Ș(Evc*$k#/Ұ[ ]LeDi~Le&k!QZ_e4r@\ɌVO`FI %X ɌhUٺ~ﶘő(5ьҰ-k#Q屆!Q*_(zhFilj(!QZ[Tn>-hF"v?mьdRNNF.$jTF  ]Ch_TF[gUTFGX~!J'4ڣ))QΉٵ( ǺR,vyGne֞j)Mij=bWkcAy6bpm2Jc,v tueD;ÖN({S1QĭƑ(OVGfeҗզFR.4j*rmɼp~z6rtlsy32].\Fi82Jr\1˧(♔!QZe\ ~C,j+{9QZBxBSeԮ核iz!QZUXFi ݏ¬5ѵ(x/2-*cLb˨I7m,b.Jb0k`Fir hlc=1QN Ȇ( hïv?RQڽ=q2"m sۓѳV h։a93 +rW?A1X]emˈ&m2;.F.#eeTـ'B,> 6b-oR-2rGuum2}EϽʨRpO6 HڕSuvm2R%S(#uYړʨMXąTF$.kzHh45pm2[Gl챌H/E*XF~RcLeD#8m;SڎӵʈԦ{뱒O*jDy,274} +eDҐʨ:hUA24BULPDR(#ZUPF/9 5S eD5 C*#ғWc(DBWypSBW5юk7W eLzA/2դ3F(^OCW\5Bu6pMB e1}~Cur^dB(΃88C+.v׬pMrLDi!>5)ZCdu'({H)2|$<ƪojB#)&1]ilvi3s\k#XoxS}dV5o\k#Lj־ȳqhm٭Y21r,fs)1wmRS#$zO3@F675!c#}ccT!6'UF4n*_L8FBS65V yڲ5z JWF #ڶ/'쓄@FFoȨ)O7220l-A'22hj@Fp)2ҩV{ρn9y:nIOL˃Wk02J;Y׍PFԡl9!4{h?(W9ѴV#TFm%2/24Hgb,i[XFӎC=.hNq-(12Jib.iw̧\FjMNhZTlbLV]!ŝ^y&+ѴMܘ`F x3FfٵhE`Fi6^Y^Je4$hH]UzHe4MgۿW*imknhs(M^qHIe4c'/TFڕ_!2FG*i4yhsv{2^RMݿAHe4¶{2vy_U{*$տye4mpR,k^R. . hf+W,kmvFetzvde4FJY0+ѴZdXFN=zq2[g etsB(imsyHbetODZh'fE+QAKTF+r];vm2vWKH)ףk#ѵ'22f!\F.N\rM=y^+ѵ}|et]n={q2v{qe4ZfHmV1ѵÄB/PFlW +e4 `PFVZ B]ӃZھJK)ѵsId욇ɧHFמHhK{E2vڮHF׺:E2k#kHFzCdt3+ѵFR$c׮vmD25HFH-o#M)5;wue[5E[RDFZvE͸( J77;o(m bUs +߱iX+ѵkUz5-ޒ/аЛ:ݗxE]]k)7)FG˒acҘ]˶r{K;9^\˲yU/m;4:(xU>i|u:?4ziT/X5 hkiѳhuhZH퀒myxv?3ԣqn *Q'^Fǡ]2_6O8m0F{14 + |iM'E=} `l_I|DMB\ uAhbh.e>zݮxC3jxɥm8-ܾCAŬSa/q"wd]4:O=j0+[|it03Nm5e?\(T2im{ljٷK/4:V*DG'Ag~}I +Ts^B:,i+^6v#uodLKmvϭs]FzR"%)$Çe=Ϗ K#9FLsipF`{1Eeœc?ޏ># uOP>*=sN]M_Nؖ<$KY,A+K~i{7wM$)"A"EJhͷBJ{RK6mYjIܮ_6xC}bҾı}MZ,/j5ׇj=:?^GB{Ÿg8J WXE$K{ʳ r4a7j,%\Q(=~pLF㋧/roWzZğ=RԼJ*Ç=~IY x;7i:T0]9Wn,4Tn J>m]>^Fg)h$kw9+ƻp:PCI#o.2I[-驐o )>E>4]>6idE61~_!3\G_74FIxIrUH +5٬/ 2j׼ֺ-`",Y<`>{0CR^-wCؽ%schXs=t={ч]{MF5 + Y{8j6 X5?-9i%Ļm/غv2k$?ޯ-j6NY~U|43&1|isx?ƭtH ˶_ֶl;#(XqlgM4rmui ڻvB S*v=ȮY:QcRHT:ópKxiI!_(笐Ak}*pRR-:řHPPmrg']ا9jw/6H6†-X[c+|VOK!NER 0{ߟ@ ezA({O6)N6)MJ?6liDhM6iMwRd}hN 8٤=pi>'':lCpm&큓}HNu8$8ه6dڠMC'lCx&)>'l>ه4d'lCm&->A(lCyC"MZ }hP6iP Bه6ee }hP6iP Bه6ee MZ }hP B[m >((lCm@&-@>)lCm@&-@>))CI m@>))CI mPZ}hR J٤Jه)eҠMZ}hRj(e`OMZ}hS! N٤Nه68eZMR}hS! P٤Pه6@e>*lC먲iZD}hU6iECLCPe*CPe2PePe2IU*CPe?TUU*Cʪk?TU*CPe?TU*CPe?TU*CPe?TU*3U&U*CPeh2PePe*C?T٬Pe?TUPe*C?T[CMU?T%Pe?T*C}hU6I?TKCU6k?TUOM4LoTi$)1L[ꠑ=2Igq C*3-X(L9NϚM2zQ&V t!VOIeeHD*v!@e&]eHeBˤ2ӈ̱A*{L+̴E1LڎtA$uTi4Fnj2B=2 +iUfr8*ʤA*3M"4;afnߋUf%U&*ŵUfIGk̴]UߋUf*3m{Xe +qk̴6ߝcLk+kJM2 +=2팳U&L {̴::쁕=vVfziV&m`e& :UfRO,K2Sta",Vi`}vVilV̤/Ye.@]{Xe*3~/VnfK2IUfVݵUfr8(ʤm4oYeݯf`*Yebn~'Vm4̴xlpbFq"Lk4ͨ2*ETKL U&ͱ̴qJ5LZmT&Mgik4Peh;lATfLõU&3 UfZ?ʨ2H>\{PeTj)߉Tf-R#LaߋUfZw$-ʤ=p[dӾ2L~CDViַEbIqa%iU&0Ϭ2ӬbIYUfҲ:8%$&%q:5Lk͇U&:deVI8Lz/VX4ZZSFVI|ʤvae`e_*T|72WdI+ae&+?IkD+C-L¿o-$]bKV&-5}K2id\{`eaVfɐ V&]-O2ieLK^2iI+eu違Ȼ he.ŵV&$ ZVfڲvZIa_=ʤՀ+VL2)JuOqe qeh=hK W&BE\4v I2ifhev]"ZjԢߋV& pI[̸2IT WY=vY&w\Y&mbOdI2iD%K2im;mK̲?f23ˤy,3ˤ3 +HbI+j͖eBeh3ˤp2i2XfLɼ2il̜ye:W^S2ʤՈE-W& +ҙdL"k*kH+w$•ISބ!" 9_f&\S =2iaW&/ZvC+fh W&ػc"LZڜqehbgI2imظ+7qeh$;;ʤd wك+.ē+ntك+C[r顕I:U-ʤ[jP$Z4pQVִnKD+L2VVpIkE_$ZiviZ4V\qiqeRqeh;['\r/Fȸ2MEkLZWVub?P敭޶^يyWc%R? `s救˒n+ddÐh&Mƣ+cJ]8W!g޼2`\JVE#^mux[q᩼•whe\¨E\*бÓqe,n8;=V|Njq-IhO/<2 *%)M5DlU>pheYBheڿ[q3PxʘγsgZuwOhZɱ[WH22 +c Ͷ}V8W:,D8p-h>>Jq \he4hHk +?ʴ2 ȋuf!julZ2(wO2-pe4zO+-QoW&Vյ+#T= +W.)?a}Ahe,;+XoZw-Ķ[-8hZ\[hej];0Vk_g\Y(ѵ+kkc}ބ+ W7q+# d\+#lU7{g!(èdW%ʈVxX#KZv0_ZqBu-ʸQEZ jZQqVFŔcґdVD\F7(i W3Z0w+;9eH2NV•-7ʖ~ 2)"2 zK8.ޖ6g^١ yenOXa׳YfWF~ӎ2 2Xzpet23pO>ʘCNuݺo\ ++[V8s-v݉Wvʼ20tڸe!pxel9=weh:iG2>& gzbA*au!J/v"depa ɑe 8I'˨r\{H-&A~L,/^DbupC2 & H,ch~+~/b#В/ +VXOw]3 ߻{~obc<)2e/V%dvެ{!؁QvvFO9k, Uo6'd=nY3codI7uF8tt,SC'?2띋f"7m-CRqry|B>Po oL]7)Le +h:,@tJ4Z:z^в"kau7lcfo"Q[|&n{Y%;oOQ/D +T=4@rw>3sg߬. ɵ#l}kdZbJ:!1QZE,cP߽ +#m1YK^,+jX@Hl3ȖXF~-JVˎ("à0޵Xv`{-P:NneS[bIvZbF=Ϝ}2ɇXXg-,[⏞XFr޺Ee/j,33ie,S/V|2[Le^87 ?!Q ,Cl d|/Mvm*`(eT#k0Eh5̪3e;[:Φjyekye @ʨr w+;Wvr拤WVFᤨV69HVF *WC+4s&UpVFBCc*eA4eU6ӱFXezrN]iXe#1Xeٱn`RZ*5q[VGpZVɽ8kQeLuPeT2̦h53#բlhUƮݺTK)ıThd5`ʬlfuVK*8Tl~x*3$zVٲo'г4zRc5 kYeUF8>gSe)ܧ52$؜ԲVjVhe-lG*[͉ f.x*[ 4Z*3ѾVʢ<2lAensܒTt'-@e|SFzI:Ni u2o3Sv(e` |/zN1-E)ell.2*ËR#6ұjH毕i-;H殜2] RZLc!e CnV)Z=L} ReQFAM:FLBke qu211rc%V(˴Qv!:BYY=%V(KĭPFrrZ([HQ9če1c:FM)e74RvӸzJMzB)3Xj="u= K>cRDMe7C%RW(KQVi ,Q:DMe1ʒAū%W)RvSzHM!eYk)e7ūZO))^=,k-zJM)eS. JYZJ٭ RvӿPʒQ.J٥=%%XG)K+5wOJ)K$JY%]ڿ7JYZJ٭[)eYk)eY{RRRVguK{B)KZG)KZG)'uuRRRvk=,k-zJYZJYZJ٭SʲRʲRneZO)ZK)ZK)'+{B)RRRvkSG)ZK)RRRvk=,k- +PneZO)ZK)ZK)RRRvk=,k-,k-K{B)ZC)RK)RRRvK=,k5,+-zNٵ|*TUUvk=,k ,K-zZYZZYZ-[ieYkheZ٭5KzB+ZK+ZK+VVvk=,k-,k-VVVvk=,k-ieYjieYkheIheV*%UZC+VVVi[M+KZG+VVi Ҟ*UZC+KZG+VVi y|B+VVVi ZY:ZY5JkheIpe*%#UZ,KZ,ZVi ,inY5ತuJkeְnUZC/KZG/^Vi ډB/^Vi ,izY:zY5JkeIe*%UZC/^^Vi ,i~Y$u Jk(fpn#UR2fgVi5,IӬY5\5٬RYt$u|Jkg0ΒR*%#UZ:vV ββneeR;:KyX5lQCl - mD ׹}úArBM#CMⵆFnbh5 m>UP/%|026njZ#CCljk 6W024^ X#(\а^WE#c!1!魎>^{FNkmc_s(͚FnU429 +,дv>T\rpLM#3\3!Wp[+5:jnhdԺQ3RYYOhdZbGqdh؇3pdJ` k`.RW58 7"qd$[R‘i;G6`9U ߛÆlsKh71b4܍'@28@2"͜BdV>On\ɐe(cr XA\d&K5$C{GH*VAT@2`{@n ix@x̑dHZMƣ! $C5HV m+ ֖Og0U<2^‘!\GFZ*i8/l82fe9t#JOU8ɪ%O#Cp|/=oggqdh.82fZuHqdhzݧ +GyqrFE#CRSeMAx4824">QШ:‘ca#<2 +0t;f#C;Hcy②֢<24RG7 m;`#C+ӏG6\_Xɛydh$g*fdbDD2pMD2Ph\?}dh0\1{4L2O~חdh"F!,z.\ٍ$C#,#&۲qeIFu9 +FMgdhqd$Cb3}^>y5 ûTL24 HcU+&(F[2̍ Ca-CrV =&;L2hdh# + +kڮdh˼w$CpObNR  mmn&KRPhd SC%Lv}4P!@UVL2$HG$ ,(Iƫ2I>Cdhkލ$cJ.$C3ߥI6~e,+ ƙI {3칰n˾iG +!؊GFޔg6/dxNJG6 !82$"cdfYLh7 WU +&aޔ$ 5툝$`n$ؼі$ö<}'8#;Z}dXMP_߻duDEr>e$y\3$ǵ%$zB9XR_H7 AD2{ddihd g@*"@PydR@y`#!fg@Eoyd &t͊GfxdB/<2u!䋟GF<N]XfE6tp$+ir?34MNl6ɉkh7̴ki_ Vȼ%gf^hXdvpWfs&6+?Y]Vpc7z0["ιS-hy"d nx"cXa_Qd#nۇ +EƄ@mW$2̧9=jw#BQd[uGn# (f*߻Qd;ic>xT(2*EFFd=clPdik$Ȑ}4$2R?4yeE"Cm`v([W՟#BK$2$2c!Am &A9Ƶж*K] )_CK23|odYs@fi g p;|8F[N*t I*k**;v2׾""έ`*VфV!8*V ˲p ٹDأg59V1΂!x 2#c,]֡p*YkW&U #}g -yHh A218\c˫dfsip(ZB͖YfAƶίAf@qmAf@aêA>>Q]_l ZhtyBY[Ybj @F(Z!S@* +ȶIK!qqK!1dqSY-LQ =Hv2sz +2Lϋ'VcVv2Doml~fo6ۢ}B43?5?7H>ES~?g%|Ɔg?NHysŸ$%KqrHWig. ţO9ŭŧš=OhCuP,~r2)v<F^&f uRѨ74xQ8;bEGШFmU4mʟ|I0&!խVM +p*}G[yZD4*}mZ^oӎ!Ҩwj}Uxlm}G^wW@%[U}z}Ta Ҫwa} RZ?V> ^ohȾSeuGѪG]wJGѪGU}G^ُٲKy8yhcA:?UhcA!pW*z}l?[L`*z}l?LKz*}z}l?.%>VMel_kv)|/Ol#o̊hb5<%}m_lqOL' |ՈWpDkܬO4kDѬїf )G4+f}bY{X?r>1D,c4V1?jokp5+f{fȟxMWG_n5k5Ѭїܚo"Y/7sc[69؛U}f}n_Є0f叾ܬύr>7 WO|Q'LM$PZ?r>7kMFklcOڨs#<{F>r>7rzXH=ї~WӺ_K/7s#Q?yX}f}nX NC}Yၘ|^"Oܨύ;ldx-)/7y{/74fCV6ڤ{452ˍd8'_n'#w Nuޟ|QI6'Js}&S?}(hbm[^?rO4 +{r3O4cZ;/7Dߓ&>r4j,~r[G:!/5^7vܜ꼹9uΛ6$Q}ִZMxskfv;V@ 3woޞT=).{w{ME׵doooޞ{k~=d{{{~SzM󛊵7jo_W=O{{~Rzs{~S)FMu󛺸7qooojߞ{{{~S4[5o^彚yB=|Q}4/˛[xn/mMؼ-Kk&.˛[Әv.onMظ-/41̛[Xƴ&2mMkӚǼ5ELk40Y̛[X´&1nMmӚü5Lk +9Ի[Ѵ4mMk@ZҼ5LkE43͛[ʹ3onMc0Zμ5Lk542̛[Ͻ.ۯcqňAma}7 +3p$Gx +^sݯnض~:]C^k_MLُsX#mWMrj }GCe8v:^Q#~vHx8#"6wmʏB#O +bX ??ވ=@w?v]W5mhmnĹow߷N~R"Aɏ5xG׸G? +n/^Y=e͗PdaJ[ Eyryl'I ޖ~SkC_{m?S#7?ZrhޟC?ysg/v?lbo5|:۲%}K/4-XJ¥s*v|dEJVQwSmeJ/F]mޛcw7O +rs܎7Or;<)y{sFmu(xl:f|+is{sù=e6J{Zsܞr~=pnw ҞN8|_jO#\ _nܞrB]tƩ=eJ{Zܞ21~=iqnwҞ֭8l_jPWǯĹ=eT5&N68W&k/l?T謑s{#ȹ=eJ{Z3ܞrE~= rnw!|+i}s{ǹ=|R{=dyϪ!LsCmʹ=eqkmʯS.cW)|+is{J4U{C397̓pR7/ysnw8rӸ6|}+iss˷Ƨ9 _iOkМ]N/gcJ{ZKܞf~鴵b.S/yok +]Яl5nl_:m~i_v=2Ws^N|Krm\RSy33'=o>3 3'=o>3 3't==3krCYМ y"qݞ7?AWyqݞ7?ypݞ7? 7yy3WUs_{՜yyO:3'9o>363'P=o>3B3n3'=o>3/3󧕟U{_YWyyOPO{fޣwfWg=,2xyOI=3M3:<3Oe ߆`{ F-yoJE/i8Щ)}a^¬FW} >8顙6fݴנq;ŵaC46> gWi۾zΡh:s}F"S4GJ뾮d%8D;Oi]:MjZvCקu[f_i5xkZkFCux3a˰,˩vޖedMz>]F"-ǀ)_|ڱ~/iV4XOt85MkMm?WP4d}3,Dȵ,ǶckV| SQ;[07ɹh;kD-Xg?_㼌+ohñqW]Yk`MYՊ\uz&8xM^%MIm5U%uݠ-4yiTW_;;zô;Mvٵӡ6.6`-jdԑ,͵yхO~uD8_Ӻ%̯A_bYB?Sdy +mO1V>}w|4ֹwb:s?Oui>'fγnkj3}dL8oYzVϻzFK;aڴOz=ӼMJ̩u i>M z+9hL:~jnW3ϡma=u3>ieqmw:͸PjDn1݈14`F%qJw^)/mÝ\crvnrvFփ$;m<݇%4<5h[NMPzSUL_4ucЧ_4NǠ߯O4ijj9 5V=;4 L~}e5AcnvMϢ.֐6GR>vZiAQ n`@4x뾯ŜmwhrѸ3 gzZ+C`mlMXoڰkjI{6hPݽWKӫyl6- }lBSwP7VoO+kڜzR6Q26k57s \)4$<:l)Y`h ݼoJZ&wf{ifH.)Ѭi1M?G+iQq+/zQտXWǍ8t=/̹7&"i|֟)@[h +U(腝<\Z^濦_èZaϸ[ agi^MQFLngh^PT,:1 6j8@SG븹;IeƓVdžuq:][| MwGt=}ݭ@MR=ab Vs`EE6㮬PM$hi:!izz{hO)(T l"ZM4}VǀIf}-Sg|:\zCM뎮m;<c_::dkAm>Ed͚5i5*Yh+&6ka6;ZǸN~h`ĵ_<i=;L#a9B\GΤ=,DN[v1?0DÓp'XFv٤u nrFT4 +k +ss4&;@ӥoIDĺpbœY606[lfڎ}E"FECК9lmB?2giϡŧGaer4kB&94GiB?8mp5`8-|,`1hx5=6`+lހ74~4 3->px1eYO#ih 5mYNcdMiYR$MX2J3~vCǁoט M:4úSoҲNLkOZkw5c"u24\ =5MaZRzV~6bQd’6'w5!i2ǃIyz$r=GG! {ZS%f(&pFЪz ?H%Hlzg$Vl@DU/мja$4!1(E34hP=GGGn#lcI#N Ijc^vYKþ @J,].ѕw"65I̤ǥV30"iCB8n3Ϊqd%^@BQi-I CEw^EMK$AFica5pF+Mr$M&BZ zzPY!g)+ߧ _ j]'bUja4Y5,ZJZ`CD`$94_ +I[C? lD~ԝH=\f Нa.Zk_tHbkd)I%1Q3M&i4>ًOR΍&&M,1Ԩl1JA`("`g ~ya.6R3츬E:4jѷfbE~RKئun&ɶ:gP]ú&{j{<)"hkLz/BCWx^iQ^hڕSC:^FKcHzoUr&}lYs0KHf,w V;io2|hxU}xbH0ijcA,RPDfZ;/4fFt p;Ѻ%_-8Nb(LʁxhmkJ$sm<.Y | +h- Pј0 +k&%95˪m [(ܮEi@tܗͶ֤b#,봍[L0 >ʦ|13i # P:OcK?z%FN,t! l)}hlôe1ÖD֋KS6s9-y aV/,eގE7+Gak= 癀q?@ҨO:V֐|0 +Kq4EV)E;H+[- +4C;GoZۋq0GWwG(lO6-_y`I` I+U .9/U!+h=Tpužŀx)U1ⷝIHwl4D+Vt]_9P4mD} .|K|C`ו,GZw;|I0/#[swR-$M[CV#視wۢ k|Yȼ[~ M12);ҙĈYOöu%Y$=\?B_.Ƅ#˹uM) ?<ڡ:Wd;zCZa|-q}a{A{]jhVFGsU8ѥOL B.6[:a4v?~ie'(&4olKۈnYy\؞:#8SU4-XXoL F;M((iي5]8 ?4ϭJ%9M4s|ZW4MpG2c(VGJ x>!ޔ hfN?GW9cΉn>HԞ?2!BhFAJnI4γ1u_8{Ia'#4-uy'(FuX+ 10nqmC +H&]ҙn=,K0Mb,6|wuˆ5SN.Hah+G_,|](Pȳr5{^HPϜ8Fa) |>,qՃH;\۩#Mwt%$JSt +խ(co7MAl+/0i&PiCa?XА +7 %l@ @1,.PNਿH|}:3r@į7Oʠi#ϖNw9%C$oqB<;'NR#QM~捤YZᕤ.*b7MgFa "}?کu?w)Y2WztqBLs[mN H=qVBh +LcИTlͩ^6!kj-W4vKX^@a(к3k͒h.4J3@&Fe).fi8y/f9)ra޲8FX=4Ou5%PF k"9AmoӴ#C7E!!#e^gmwFK26vA?Ӎڞ +EGk`y<u"974s[o ʦ-ilEvphiIcX9ɼ/dXkjf#4uOL״YGpN7x= +j8ًH M+-XϤ7,m6em6neai)9[޺1z"QmNu/;;viӁb-YmQZzاhgS`iYcMދ"i1VEgx@QfG<`Ϛ8 tս3MSDE.SXxrrHdje{ƒe17hӒv;"PdD>ٽ ,ԟW"K &@{z&M]LWɄMĦx!덾w>RƨQp8}tmvK9Yys*6vA|SߙVj^h$!@a/L.6xhz#sx9SLpȰ׈2+=Hv5ybvAZO^+uIhif IpkM -4F$j=cM#*\c}_5qfů'7m4NNhQx<- 'K@%Vv#D14,_9٦1EChbMx$>hbĔŹ^_ h<-_ee+u OkY4vN3[}>%Ŗ 4@lk~L*bkTVl0 &Q1W.Wk +l2ܝ8ҘG56[ݙd -HU),͑d J'mQ,~Qc:Ҫwݎ[d9Z:kZ23ҬQɺ:`K<#BS̨{;f:E8N!SÅgѥl֢ER2=[pfݯ :xƙ5>ƱK`N +F;iE;=M?6`yp8l=9&D'BऋM!-v4r.6Y,S9m`jC%4EFLglpL'!#ۀ ~&=Z)BSr~{ޮm|Q(AT]E†';l7|OQ `$-6$N8@dgTS.Wa}iDq6FV>71q/ZrMy-'ap# 'Kы92M™7)c>؞HVKS]ҐqNVqՇv^ph)DXzT5#뙯iΜ>!It?F|hzmȞ?f%i4=6d(eR/9-Ɔ;Ggvd N-&` E` m'3$:f'4*'K{ԷnErfvOe~Dv@F̡{Kq,'V0-AcL 9=9Z, 3t90tLcDžk@>'8cH>k&)GTn9ʮivVȩbtP\UsNݡil؋.aOLm$" +5κ$kU(cfsNѨH%`h&% T 4tt )kUL;ʤ毝j{NůzMD3I5.X\h5*3fγ4L#tdh +鱫_ ̺-[RӼ~4No:yl;aW6۫qLL9*d65N/%_S+E7# 䳟a;;M&)ءll1Mw654Mv4tyDHARE6q$7MZiB̚`:=D^եu-‘4x|w-NeZ +euB̹z̡kllШ$aWIñ+G3GE*#Hogi.ts[d?$2hYxl'y<0X^?OӇ6z-L@l{5ڲ,4PLE;FZm2vrȡTqHۨ5= MJޔYEdvRlj2}^_!"rV*MmW(V[H[=k"Ll¨qPᗢQo +uW9=P9 IOchyty`ѓP;KZ1Lͤ1Nib(;D6y ]s3~S1"fWf셵%wDnFGfsǂc7h4zυ +nӦЅMIsxp*Gb>IƎIVf/4s*2n5Hm_b隆b <;ΏQ<,B-bRЬXañ6V<Sfn>ŃQib{z@Gt=M rb$4M؇4₴/Aa{0p4pWX!3?P Q4'_i5$A+zcH7@z>+VL[,( v#,Uo+C[b}Af4>$4O + F_X&TXی4,Sng~΀%.<.-!,g 8x:@\]ۈx@?rˠ8a~GhK ̖ɝ94DQf)ۣY9O\AN gg~XY\5rQy mB/^ ERXzR?Am~] [ѠrR! i ԥrF%kAqkJ2?R()mWJ‚n3Βr#DJ"/~VK֥Nӛ.h/Vrv7^7rڱh|mP-DWEVm$@^S(&;BrMSb5`9-nFoRAҳ]`ފ|b +b%9EQz56;;8@h+i4PuqJ\ڲrF.%,w/_(zLՏwudP*tN?H郔Cch35VSh-saU+GhiFWGhsh/?.dN]A~bZCcǶpKVgDd96sA=X!i"FL34uBԉaS6 4w~Oh-,q|YΞv)2+s+i!hFY5g`h3_ +7\8jãaßt٧4gEl[΂3o½ˀ?H5\Hu (50W;,5h uK i/kKI#P#da5rHA"۹{ZFhVH#idvB!b{8YAV۹bmYɯJAHmQ(5Ly.iFZl5z#y i,JUt}Ԃ=\nMfٶchЂY 7vX)AN2ϒjz}oO,zYY"s'kc֝Mn~3fo|o7Tbylhz}mrdw6ra5D4k GNJ+` 74 +6]gs83x%dW<<78VВШ}j@E6r^x]Ж_nO7%pUggܶAZ$j>s(퍅 +1E* +&B[)槃QxL?;0l~ b0fj5+ήi4ÏBډX"qܢ;V,O۞"ifQ55n>8ܢgo{>}pHa ;m}r>n zxv44k,O9֌4ÊB5r([\ %R䋆T .Q0+5<% +Sҙ[2۱%>E%oKͶH%b>Lnx[[LT!\Ɩ(#'^l}-OR+/[K$Ǹkk+SK$0!]B6DB-S%SUtli4yIc cdhIhr0,DҰj;} *7KR,f@^H@DZn;ʷ.'[ޛe΍TML!]>Hm1B\,tY<͝X:òX!]Hx=jW%_s_&JV4e*&欵HQ;WY&/J$i 鲩DH7(TKW&H QI6+,*QzH"]QSvQ (/sJ 'oJ4ATgkJ$=q9keM4\ٙ4}/2dA{}ZzVgneKI231gWJp`*eJy؁VC<)82{RR(ެHit3!%6a-)-G{6U^ fSذHd@IլVb+y+Ivpߒ$OM'J!{(%;[O'Qg8$cHgi3.3 8@!3!,/7$6}Q!X87rS.eh,Pc-?$~tN94'=,FeI9!^WC2^1CnRvCtL_Q"Kh?>vCbv3QcA$0y=ӣ1dU%28jH[ƈ"=ҫ5m1?vlJ0[DRWrv[D:i6y% +@^RV9DN a|"yPG.5XC4;lr*T>{.H UX rZ힓릆 A˒(4^ +N!`6<6`-{*Zy9h9ÜbcyvAw"*i TC$n -meH#8X7!Ҍ*sr +!ra,C$w7KdU&K2g!qa6WĜy/r^]=CNԕwR/i|{vCB 3Ӓ?Dyyg{H,[]Gh=$y=$d8Yc?$[\CqH!9zQ=*H3́'|rO!9ɯV2¯$`JeLiYoz SDSϱSe0D+m>_dH)d9IJtDNX<2f5KPLbADJDɄvDDp "' = > 3fH*` +6$ݻA$v4CHO1eHKҬ^I$+:x6z$6pL&L,E0Dھ̾e1#mxyD ȅtyD#?3鲈ͦ,C$)C`%vč +æ_!ӗ䱰;, 4P"GNr)YZC"G]hr$ݜsӽ+H28}4(ϧ!\L&H`:ݙ+!M`&D.v ɶiT\m9G.%{Ѫ4ba! ! ,(S+{H64쓚vC"-X$m>^d{HWձ|H! US.{H4v lvxeiTH)]vD{UN|*wH4"J\zhi paC!6evjՋa299$ډ{GސhN-Iސh3q!0Z*߲! +ҍ*oH4Ҝ6w*!;ސhxi id€Vސhf7i]ސhBVyC2q i;%sH4VYCrvweFeHdHӰ,69D[XfH Ix̒-"Mٿtm ùli + |dH"sQD "MX d׳Ak%H5 +*HEiLh?kX< ?ké4mAkpe2t@^eieH״\8ϐ.H85:HxĤ "]Z,5AhƦķbyDveW]6DF=Z%D 5 4U^d^Df= 5 +4²19D[K0!Lq_K&)=}rtmݜ:H,ߵd2'lEEL"]N8t.aajvte&ҵIOiw]tMtv/e|[eHteVl"]%% 5:H8_K^^x_I.iY1u.<%ҵRXDDP $IdH{1M&+'DT $/lȴd˄vDvF p6t C7&[/e6 mi;{DDQ8g&:satq./&H0C)!xˣvtMEv crtM39D ?+t&wE+Ck!][H8-?dh!} -!]2$N Њ;dH{;krH!CGVewи {h;dh2!Cv ģrtKyC(մFıw H;dhl?;d(XCF/<yC6͓ 2XewЮ;Cf]i#Qvt3ɽ8GnHSdViX?Cf']١i24KںCG&wJ`<2 e he%24yˣv ,$YHu!]=0%CFjY4gUW!vC<1C1ResX;]搡kC.sа!C75@cܖdYr9dhl+ wKE 4TeN搡3he)!CR(X/kȐ}x֐Q5d8fmIe A_v s53dѶf3kTr,wv,3dhTuΐETr M,3d3d"r m^r,ھ gr 9h[̿vyCag!T Y[JQ"fmu1ثe[Ӣ˶B-3Ւb.Y|`[:SP"80-w=3ĸ0v %a[bH,EUhnlOun]T N8 +Ĥ>ϣ6;y*8/kݙ*,מrk)EÑFeئ[Ί)!FF~³36$8҅u{f1-+bZFm7Q>W@a+Pl "ȭY+jcc](Vlyksےҥ2a3!WjE@h׉BHuܾE*;!yP~Ѽ`{:5o[t̲.y6B.+v ˝ٌӸVLc!Th5q :cf'v1xdފ8ݑ*Z2k:gd*Q)ۂKq-'`tr2/S'өT4ԃ؊lc'nv:Ϡ]m2WK".NJݒ?͓8Zz/w9N܈myϗPʥb"ܶ|HB W2g9JɕDny(v(?$rڬt-.m5ܘC/XZ\& +IYy(<P~ 'jbm"+{~NS}ׯ, ^C`^0e֦;m:sE^y==ԎL97~d[Ő:$>:QfvuDF{{_MuqQiY4UNQA4ILSh2 Xڊ86-j*AH +&m!Cu}X/Q\'!k~)ڇ7?!,k..-uގyv\Mc(*o +i HM eʟOlۻֹb&qۇo +lTu"X\x3mwfZ4ڽhOJc/<}vt9o7ɋۀ4%lUOEXڵuzIZN)5.(ZwJc9ϵZVOTF2C8O+i{b{MR,d筹yPMyE%7 +*C:/tEsY0{1ky/.suwm +m[q|m컊!k~2GXs|RUDH4`?ֵ."T$5O$T(8,.BYT nE.$ ]Ӵy~?٦;%`$a*t%gA؝>grLN|&>>gr>grz>grLNsG39}&>grLN39}&>grLN39}&>grLN39}&>grLN>grLN39}&>|&>>gr39}&|&>gr?Sg39}&>gr>c399>g39y>S`39E +79 *p=ٜ +f:)1:̌N{N ө`&uN3S;N{N ۩`fw*#SL0<O3Sbdy*i +fT0S=u=%D)1=|O3Sbd|*) +fΧXT0>̴O`&~Jl +d꧂)uȟ +f)1?P3Tb*I# TLU0@%F& +`JdP3Tb* +fBU0sB̤P`*y#1T  +fn*1CP{P `f*9#KTLy +fHU=n3YTbd* +fXUW9 +fҨ5*1FQ{Q :`*ɣ#{TL +f_C*I +fH#U0H%F"I`J*!rIdR3Td* +fFH)U)I +fVV*ux +fbuT"* +fr.U0K%Fa`b*!rL$S3Tb*U(#T^TD,*٦ +f7U0ŇSs`&*Y#T; +f橂ꩄ=U0OS~`JT3ULA9 +f*1Pu!UAH) +fR*1RR%Db`JT39UN + +dPU0ST%F`f5U{=U2QUbd* +fHVU0U%F*1RV̜U3iUbd*XU3qU\ +f*1WX Vª` +I +f*12YuYdVΪ`* #USZEcy nzNނk^s_|m)|M%yCL <6فz`K匒mr䡭ST홪CWRl= r5sPXmʝf恻"d\c"D +>yy /z (YpTl|#%YvW 3s%Fr,1g3Yb8+I +fHsV0Dg`:Kdg3Yw +fƳ Ydg Ydl>g Ydl>l2|0e6g,a>g Yf| +f곂,>+#YL}V0s%F,>+ +f}V}V}V s%F`>g3Y~ذg`f?+[`?+ПEF,?g Yd,@h Zdd@h2؀0e6 h-a@ 2 +̆-2ve6h Zd&A`H"c ZfCِĔ-aA-h ZfCk2؃e6Qԧ i̢>mOci̢>mOci>mOci̢>mOcie}Oci +}Ocie}Oci%}O,ӘE}O,Әy}O,ӘE}O,ӘE}`Yw*}`Y,ӘE}`Y,ӘE}B,4fQ,4fQ,4fQ6X֧14fQ6X֧14fQ6X֧14fQ6Xҧ1>Yԧ1>Yԧ14c>PҧK4c>Xҧ+iĒ>Xҧ[>HҧK4c>XҧK4cYF(ӌ4bIF,ӌ4bIF,ӌe}O#i +}O{YO#iĒ>X֧J4bIfЧK4c>XҧK4cYF(ӈ%}BF,ӈ%}O#i +}O#i +}O#iƲ>PҧKU4bIfЧK4bIf,%}O3Vӈ}OاOi}O٧Oӧ> m2hO:P.>ޝփiڪC9 hF|"qCKsGM. -Ӧ==4 Dxi@+x3풩NKNjL4%6 oLk1s{ a9#Ce|i@;hI_6!dK/bw4*.ͦvȔ)}Di@%%` OHs!ȒҦ˭%iH6IN4sA@ދLڂi }l +7a:ȍvu@Kn$G s4ٍ\HS/7!x1ЎFEz>ފvIz≳ !Uh@M^Lҧh ?8Ȅh@.]Z+nڏ̆Zu#24Fhu]譫#Sgێ̄vIyEhi, {py sQXYPO;1b?x!]#3<&}fXv74?ySoo?{}UY~Ժ^g@k[Z"RGπO8ڷV + nD_r=j"?^z¬bJ_/<jOt3I +a Hoh}g@ E;kpkmg@({v';^u(1iGê3 -˱vd3Zsu@ny Ygx͙lR3T~%Hqvd3hn  ݴyGf@o./Av3D7Y IP&Ƭ60X^dfK^Γf@+|!D齓j&vޓ|KPZ}XVwIՕhLivE%$4i;2Ќ=ԫ3Cp Rca(.3YeAȎMf "36(}3D68+9Lc6m:'b:cϐ rM8y yY%*Y }>/pV,H_ +Aʱ !'zp U.(,}Y] L!#3]Ѓ@,.C*Oz[D|u`kh\K{TASrMXYͅ2񱱬!l#ar[P}e(&ux]%¤ %agY1IuRǮ2t>O }N~TPgtIĢ2ԠZ{LCZʖKkmKCRrWX^ڱۍ6K<^Qv.,E|o(ZȲ ʰo^G'xn~d3Aɰd.Ok ;m8Ϻf3ىk U]0"/A_vYKfS[ɰmd_eȔdب9Dԟd¿"&wTGpk']Xl:`²q22ڥ;.2d$@Ud(Dԩl6Z]6Dd==&&fLa ٩/[Pb˨K{p!}NڄL'rۂsG C>⏗ȐFr" +AW, ;1+Hg +C EN>vJ,Y>Gᚐ׻ud1>l1&H= T:y {x +X<kBenCRP[akI.Ո,!ى)t{8 "%7nƍPR"lC%VIݒ(ޯ\c-r//2ʅb4vHN&N +I4䶶T=3v>dNL3<6Wv [dLƯY@1DF僥#S8!Ւ׎0wC_p!zGH~1ӛz1ɨD”*.vhuvdr1Tm]-d:dfWh#3IY veEm >+I+&ٺb$eĎ]GCF񊄘E2( 3 6lWR$C5vV'KvT_wr61,vLu211o=.ud.1Myv`"1hG-I7I#>^*1[=?[6ؖD =CL8Э)dx +gCfoYT:؊}ȄP7,+Z)<:u6po!$CM~?;2ol)m CL`98aaxG{:::L7;v57ECN+_flsZE]WowPiI3- +5f2d(XL`(fiO`WE!@qldoQ=B *,ۋL +?%J[$Q[݉)y ;2C `mw͊HzT}Rz*M[G”PX-uP؇is(T Dj(yޭJ'¨Ԧ0Jtd^(mntZ(T\swPdnkGC +G8'qχΆ +5 +۝mon pq02B(?vu4PHMhI{?oeҞlp6h_ #$yPxWVQ<65[s|P(#A_}P ktPFq˻ACm|}e +&a ,>O +ٌ=k}Ǚw4lP0\ZGE۠ )8w!n yΆ +&\ lE˒=UIP$S 6(Yq6(WQN +dz?ۜ F1r6(=lؠnڊmmP \+ jA!!82d;Ԃ.ln-]# jcf<^yЦ2: j֥eP .XcԲoZr `ޖ%^8Ԃȭ;ڹVtr #Ԋijv]+9*m]P+ܓX]P%5Sw" j90U&eZ`5`ٺ::2 P{%C.(܃ӹܬճz, gԂzؕ=u/',y[d p(9n- mrODx% ;έUj?gQR-Br?Z mg‰t4O8jwdL/:-Rޱ [N$53YƲľVˆ O8QА?](ft'Q>A$1o6h8?=WI ´^AhN&˟0g ɟIvI0iA ۉ=?-XI{id}ݙɟDV 3a}rE&Z!8ղ E`hȟs?ِ?!rТ?MHncX$]mۯ WVmP_y}kOl}}U}pM>a7ȤOؑ_ݳȜOȐ!+h>4`+& ^ Nb+4h#QC{gC44p'N4`׎|5wӣ |B9 h(7'(D}J'(}c17|b +fc"kj 7q pF'ݽ"=->xPk7{=68潳{.UϜ}O(nK_8v$s~?6|OإBᡳ){‹sgd}!|ObI[g-7P7ť:{m'>^h6&I'duO>u =-۔N$q.{O=-r3ٞ>E۞֞KC/{²BɞxIʘkxeO8oM/{;^EG/Dٓ9![3=aw[ˈs'@2=ʨnwq'tag${ŝ ƂI<Tz ai=a;œi˞}~dO萅m=!`b 7wv*'Dbv(;lAӨ6eX'-lZ]Ii=;#'\ }(dOHFhzݝ P3=- 6As=a'-5H9ȞЃYɞ01wF'q@lȞ`~E=^} !XIG=*=aj#r=!S=\O %f3r=!@Eү"}lm*/Ggz¦&UgzBTv^]OwKgzZF\O8nޭ_s=aG<" 'H\.='mmҵiӝ !V| 7Ά EW=7xI`<7ݹPRuE- 5d4 'nFDQ>;#ד ׳`?$hmhÝ E{'?ȻJcgzP.8דdJ~Lz´tF'1h{p=-X5!F3r=n}. n]:$uReDb6 'a=AHQ='8>WX=$_HEDOm#?DO`7 +ƭi„Z3IԦ} mX;s BK zjBΜ +@dS[ȍ̉UJ.ʵDӤܙ='k&6r:4O#yC)ߓ4Or].hPaYY'~4iW,O(Y6EӄP=M'Deљĭ$x4Y3/xڐE. +0d, 6KOa;61'Ƿ[gʫlafSb;ڝ,;US:v}>Q;ߌv6Mdr;a[c*In6Nm~iYN Prhz7b6iZzN~ϺWN82yb'=-:b' ׹w;!ּђ ٪F;a>'IF)dӎ޺(v6`& u˼ IWUio=fdʁh;ml;!cN̩B섰TDgS!}AةeO%vlNvN2N8k;K0-N(=~;r~Y;顸$vjwةY_$vBU]Hgbv^N(5kiׅ֩oMZ'ԙQ:HNH. [T#L +ʒIkvNZTѿNS{$VeS`ulujt:aWLlu3R:[6M5-N~XV:!IOtd*\R:m'; J'-YP:\k6:X2:G3 ?k٧2:NK ӎ `t~}ѩ }2NGW\S NnF]TLF'ǂ S }\iDZ}G^T:KB'Ԓӷ$ t6Y:KB" +0W]O$tj=I9I2'eNm"~v9 TN_oVR99TN;H*'Ǣ ҵr,Elv *'fA44]*'fQKU&*+(r,J4X91"'fQwoޚDN̂ȉQ9MJ,"'fQ!n,"'fA("eG%rbENe(r,d[ rbEN +(rbENe(rji$rbENe(rbENe~³3/rbENe(rbENe(r,(rj ܫDN̢ȉY9 EN̢ȉY9+DN̢i,rbEN̢i,rbENoJ4X91"ȉY91"ȉY91"ȉY91"ȉQ9 EN̢ȉY9 EN̢ȉY9+DN,ENĒX!r"DN +$r"DN(r"DNĒX!r"DNĒX9J"'cȉX9K"'cȉX9K"'cYD(%BD,^V%$r2ENȉX9+DNĒX!r"DNĒX9J"'bId9K"'bId,%BD,%BD,%,r"DNĒeȉX9+DNĒȉX9"'BID,"'b9>G9y2DN_Cj"%mU[Mb_}?7Y{J~(20c2H{[o]>2Ÿۏ_Iۿ&}v&9PJ_W"\pr0*r/RBEιo +~5?sQ᠍m@|Ï\åZCQ +W^?Kr熘uՑC$?ח|DY ?j8u1F_ĜzPAQ/qGe47LBRh]B]H*9PK1EӶ0=Ai}Q qg??ik??ikqG?~`M=Oqg5HO r\|ja䴜]X_:c󮉰_7 +endstream +endobj +187 0 obj +104145 +endobj +188 0 obj +[186 0 R] +endobj +189 0 obj +<< + /Resources 190 0 R + /Type /Page + /MediaBox [0 0 334 298] + /CropBox [0 0 334 298] + /BleedBox [0 0 334 298] + /TrimBox [0 0 334 298] + /Parent 191 0 R + /Contents 188 0 R +>> +endobj +192 0 obj +<< + /Type /FontDescriptor + /FontName /EAAAAA+mwa_cmsy10 + /FontBBox [-28 -959 1123 778] + /Flags 33 + /CapHeight 683 + /Ascent 778 + /Descent -959 + /ItalicAngle 0 + /StemV 0 + /MissingWidth 500 + /FontFile2 193 0 R + /CIDSet 194 0 R +>> +endobj +193 0 obj +<< + /Length1 2020 + /Length 195 0 R + /Filter /FlateDecode +>> +stream +xU]lU,RbivZ̶[ +XhvmeY +vI;Nw7ݲ(hbQテ!`1IbM !>@&3. *m{Y0x ,6ppr`"ЇmhysM7=vO',^ĨxP#_o7Mv]cY&%H9>!q0cs3#7I}5U*Q9H#,/N-*QM-v᱓6:bw]Y/*M6eC o9iml aŐPhqlF͛c #I6l84hcFBC1'), 45K:`whoi~Ctw¼^GsQ訋^++?[fYjVjR<sY(^F-6|uAݬwͶ2"kb}VT5HURvVTJa:?L̲!8^sn`#Y%_Fnirj脗yJfB61p,ז+]Nc8 ;׊'qfMût⮞zRwJ>N$G%^P ةQî'=k7 L.a>6X> +stream +xk``h +endstream +endobj +196 0 obj +12 +endobj +197 0 obj +<< + /Type /Font + /Subtype /Type0 + /BaseFont /EAAAAA+mwa_cmsy10 + /Encoding /Identity-H + /ToUnicode 198 0 R + /DescendantFonts [199 0 R] +>> +endobj +199 0 obj +<< /Type /Font +/BaseFont /EAAAAA+mwa_cmsy10 +/CIDToGIDMap /Identity +/Subtype /CIDFontType2 +/CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> +/FontDescriptor 192 0 R +/DW 0 +/W [ 0 [365 0 ] ] +>> +endobj +198 0 obj +<< /Length 200 0 R /Filter /FlateDecode >> +stream +x]Pj0 +t=,N(Y +9t[[N m琿*cah{lN^X gBpjV& +:G:g<\7^3GZghr4u#K?8PrW2< Dq$s 5jˠ9H$݈ŭL%UM5-`T *>vge#ZR:^ʁc } +endstream +endobj +200 0 obj +236 +endobj +201 0 obj +<< + /Type /FontDescriptor + /FontName /EAAAAB+mwb_cmsy10 + /FontBBox [11 -215 942 727] + /Flags 33 + /CapHeight 0 + /Ascent 727 + /Descent -215 + /ItalicAngle 0 + /StemV 0 + /MissingWidth 500 + /FontFile2 202 0 R + /CIDSet 203 0 R +>> +endobj +202 0 obj +<< + /Length1 1992 + /Length 204 0 R + /Filter /FlateDecode +>> +stream +xUmle=Ҏ{`3^wLz׭s%["AZC[خueAM/CD%:_r4!HBb  m >s/^:jxiZ |'T~lTvvSdg҆70$\qm#U7s3lxl~b{gUg +l;"9I=g,Q!_^~uK_2 +y'.zWJYN,1qPo~eev2EcQw)8fg33 uk5Uuen(H",͍!UYl3&񆞄Mzmb'LHU3vUYy1VMHi=iD%S˺\> 5'- JnML1DIO&^S|r]O>Rl͹-6Wl0ȹAсQMU%EƉRXɤ0Yk4+R%nH+0EYL2&'kQU􀪜EX􊰨$-p&L"aMXTTao BUrIU̺vua7YKn-&#*ĸ9 Ony}-4h"'\YxkC%B5nń`9U;[ֽq_.|[_ޮٰT]ɚ` +U;͞6c%Z!_FΈghyF'ʌ +hR}Bfp'ޥ.Kd km ѽwBxc[EwqrSaw0/;`l>pJv.BLXG uLr0*`-,`l^sMtFS 4ioh:F֠SO KxzGI;MJ$El-Z (;Iˎ9DHu<&*+qdlU;Aԡ٩L*=-m InEb&+ -R@feVbFј*@gKӇQ]'Igt&?H{U5JQ#TG*;Ixtld> +stream +xk +endstream +endobj +205 0 obj +9 +endobj +206 0 obj +<< + /Type /Font + /Subtype /Type0 + /BaseFont /EAAAAB+mwb_cmsy10 + /Encoding /Identity-H + /ToUnicode 207 0 R + /DescendantFonts [208 0 R] +>> +endobj +208 0 obj +<< /Type /Font +/BaseFont /EAAAAB+mwb_cmsy10 +/CIDToGIDMap /Identity +/Subtype /CIDFontType2 +/CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> +/FontDescriptor 201 0 R +/DW 0 +/W [ 0 [750 776 ] ] +>> +endobj +207 0 obj +<< /Length 209 0 R /Filter /FlateDecode >> +stream +x]Pj0+l CԒX}q z0h[lE^X gBpjV& +:G:g} +endstream +endobj +209 0 obj +234 +endobj +210 0 obj +<< + /Type /FontDescriptor + /FontName /EAAAAC+mwa_cmmi10 + /FontBBox [-34 -250 1047 750] + /Flags 33 + /CapHeight 683 + /Ascent 750 + /Descent -250 + /ItalicAngle 0 + /StemV 0 + /MissingWidth 500 + /FontFile2 211 0 R + /CIDSet 212 0 R +>> +endobj +211 0 obj +<< + /Length1 4492 + /Length 213 0 R + /Filter /FlateDecode +>> +stream +xX}P[ו?/=}>}"Y` IHd ! c[p`p:IIu&;4uS'umّl֓xѴ4֓vndI?;['{Cz>t9sRq{mJw-7{bnrZ_".89}t`px)ˎߨ=iʣ*6y̡#;Y C]H3/ _?=2Ëy@v&w#ȣ={s VSퟛ/ ?| 3TŅPif;]$a +OyxYxq +ihHB#4*uz_s}Ľ]~= %8wϙw_ٽLμϼ\eQZKGI ъ_5xy,_%iJ6>Yy\p +m= _p=5nЉַ߲YS.nJhЋ:X/3}g鉝Jx 3ti՚n@2)+:%CL-[fYyr*ufh؇e[-w BuWۇ}Y?͎ ?xqkώH:Mn&ʚ˸m j䙮NܛV]r 2; +?.Խ6wT!5 ^U-8Uz@邱έ|VV^JVV/SL_ t7.)aX3hn pD :Va(s}|Q @16s;0\&m]ؓ//Z$\fT1~VZ:\ NJynǍg;7 ++oz0FaжMZNPq7FP7# " MvmMdWňĵhfic&j7T5n dS45&jkNk[WC)BN3W4&5!NG:Ϡ1!!R t'kúkg4^xpC??ADY_,1tnag8OS9w~u06rrXb9t.FrUn|jUqߠ 7YeeG$*G+ ^iKX{gV)_T ӡ練䱶r5A }qC7 vn=T+\ӥ_SKݟlo#6Я6?<-+,cD|po,!WU3Oݒ*D[, AW.t x9vёDɑmd"iǝaTۈzN&ͲZ '^*]*ۧ<zVCM9]ѣɞ{B~eSا%V;OձF5܎ŝ]Ca pMA_m8C[߾q=}LoQ:U8#e#5;!j'W/*$Q[HލLj]5;ղ!+6%^O1}G-#6aԊtyc?D_[UДdn~^' +Ptݹ봃Cl +q%N^03mϷ2ų{ġy- H?/c\eu[c^Cx5vI^Kk+P"x&>csSNJS!a< ՖLP &jyRX}.bw}tm4lWAO-xzTcA'o~8}fg ӗ!Ip]y6~V#oC%}f\ct=i*D3`%'J4cS907J4HŠ]f4A%thHfq̹^yd`N6S0 y82CifH7,ڦ`>LEMցu-m 6k,8GqMf\_$ofVr!ԥVlVa#x뛝;:?5?$Xss", Sܗ>-Fiy@ rH},nݳ#3;=;45{ ,o-榕4.0Ѻ=h M(<3633CZ$^iq<{HNNjըo\k(Q ?y bX4W.*͉*-g"˅ |R96, avxX15*B!qpF +endstream +endobj +213 0 obj +3315 +endobj +212 0 obj +<< /Length 214 0 R /Filter /FlateDecode >> +stream +xk```rY  +endstream +endobj +214 0 obj +18 +endobj +215 0 obj +<< + /Type /Font + /Subtype /Type0 + /BaseFont /EAAAAC+mwa_cmmi10 + /Encoding /Identity-H + /ToUnicode 216 0 R + /DescendantFonts [217 0 R] +>> +endobj +217 0 obj +<< /Type /Font +/BaseFont /EAAAAC+mwa_cmmi10 +/CIDToGIDMap /Identity +/Subtype /CIDFontType2 +/CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> +/FontDescriptor 210 0 R +/DW 0 +/W [ 0 [365 758 786 750 612 583 827 344 276 411 828 ] ] +>> +endobj +216 0 obj +<< /Length 218 0 R /Filter /FlateDecode >> +stream +x]j0 :NC()дJjh8})PO%d)hѻe:miDh搤.aQnPnUj ɻjlv)tpCL>4ΨzU 9*_N!OX8pB=V9Xflam']( )%/LS”2c:3L+s Qqce-Ӎ,W*}q:Crv.4fA]Y C]h棕 +endstream +endobj +218 0 obj +280 +endobj +219 0 obj +<< + /Type /FontDescriptor + /FontName /EAAAAD+mwa_cmr10 + /FontBBox [-43 -250 1008 750] + /Flags 33 + /CapHeight 683 + /Ascent 750 + /Descent -250 + /ItalicAngle 0 + /StemV 0 + /MissingWidth 500 + /FontFile2 220 0 R + /CIDSet 221 0 R +>> +endobj +220 0 obj +<< + /Length1 6436 + /Length 222 0 R + /Filter /FlateDecode +>> +stream +xY T[יiEHB -H!  /`#m` ؉v؍]lǓɸ>i>陴viSI{i&gy%y$;I;޻ـ9덅[4qDS$/v̍0  ~2>;O& ʉZGN@6KgI/ٻ0Pӳi_@%}nfxa +`) ݾkxf52f> &ܟKa#KxKA%|&&K4<{??o3x RpspN#0[a#$VAڠ  aA8+|?{S"{cn13<0I |gp{ZZ\W2| ^\Q< g< +'!Bs/,<#ai l1ٺ,FR*c%:vK} )m]ܥ)lPSp$Ⱥޞ]ы艾.fIΉ1[o_o_UVAkãIr/^nP2u+m@DGm j ߾~E7R-7JvLvwF$:mxwjL1<7wLo/KnȰ'\)n$E6Cz?j7*%e*@L%8qϐ4) $ /(Q\G*?5)k"]WIZjg[@7+ x񒂛K,C"\da^vj$28 ncb ' }5ƽAx V S-T#N`AQ,yf}_e(lW: &2goWBrPFq5.Yu 46-*{A +۠5qU䝌X.b&FV5H/bW.ҏ'iy;hgO5Ģ \6˧2,])EI:Õʬ DmXgٸYAh%{D  *j%ifhh6l UFj#!vPM +`kk~}9x"5Gxzvxt]ߗ60U&Wlb# +OӞZo j +R(8J% qgA)T>ؠ갡v丂:4B\=JݲM5*_:O&G Pk)-J,IbR\0 hЬellVZ \#kt nf26uյlvFd9ܙt4qpSPjO_[|LEJ?opGj=¥^1%ab 6~Y +6<lL%UY. Jށ} Z Yc.di6ijxf,l= -SkuFa4,.owgG~vp'Z ,ϿbNOrfMo@2"JO f;`†,^LDٖ:d-H@H,5Hhu!3Yg.Ɏk:G;w,_rPg_|#oΗv 81U|.xA:75WGKЁZOʨ@@eQ+h&fXf8q&n?9{ +}LY5ai3Nֺ:gS+IOxU&Ժ~Kp:URgZн7ȇ$|4E{*Vc/Mt,aA_lSGz\ +`遦4On۩G3Y/Y{qǶN64^޺(+rzvj`@]fWkԶ<:&`_cUۃA_eP dLi6YmX+XIcVx[qS|#/f~`ٰe[L52_L_yW)<)TlkQCQ +f(EA1%)XfG=L18.C~"UK@:.).>Z*ʫ*VU^TN*^ثb2$S+L#$QTfƖ%fG?Z~jit0:|Oo>)2ұ`ΦXzYª2“F$V7Th1P*"*MHODB*0/mڽ`e.+W{ .^)JKVLdևraqQL@kwA;v@ K)0^}DH(1R5ȃ' :j5?7/3FQzRȣ-%ꅱVt.nbc" kvA0gSj-xZ~=μF{հ.30Tr?||G(V^#Z 7D>Ml',z'ܹ5gs6؀tJ!{Z?vj +kC{QRKKx$O2,--$*Uy*Q_qE!kW<'%(ξGq+ڬARyf X^$ZO\+St;o@?xVa& l4$k"5%tD C BsxӧIMR9xkFwyCeW??,q:+{+7|ixtt˕rK_lWSlzf1T9\_%=ܾ6>Ҷ学eNLg v5lh¡dzרLo/^ +fe9z֔+#9{ɱ 5100%=(,`e2DHN~s*™, E$˄TNS_au;WFFZ7Wx=y;׸CORU{cg?>3?Lg3W?{bm%.]UkЪѹ+Px<+SM'Jk{GɎ-@/䃩'b:DE>I=gwOеf3zjcQ[AxF>vT3ٔDoOx&/-٘\0-R8nbEX,{o`s:1 Uj .ɓ wk\ue LGPp%Dhv9;| ߩ[P1va/`},wLJ_Y"MѐK* zjNOɣRR˨EɿTlY ~+S%/@w1tMc_]ὫrPIXA?tpʕr 4@zyp +|^.nu#=.%JuyOvDlz8dG VRբ&)&azMeɚsA͍-AAE.yh4QMFFuY}z&+[ CaItff08ɉG)%FA!9*Sj9w@s{8AÍI$&xB__}L$9he);u +Zͪ윎m[㧴' ->XF}~!7א_IO]O@L{Y qE$Aȶ̛numٍ Jyxw稴3 +{4y2rSJ\6w#]>-#PEnh1ҽLޣUZ$:j}>!4 ^W Wp<-mBUwšPޓYBF虧32Yx%# 4+z9i$̀32 vܘ9zC>~%# 4&,"I +CUTA Ina$LbidZ X+HO$6/kcԏw9WLv$iW 4lIb Aٹ={emx~rھ:h^NOc؞cʪճ]t}vzzl]~cӁ6Z`mcWr90m̞*>3Lw!16oz;{qyCZ{v؞T{!J*dOt8P̑ۇ3?Hebe6ݢRnQl{]-[|Yax%XE 1 +endstream +endobj +222 0 obj +4773 +endobj +221 0 obj +<< /Length 223 0 R /Filter /FlateDecode >> +stream +xk0cdX*0[ +endstream +endobj +223 0 obj +20 +endobj +224 0 obj +<< + /Type /Font + /Subtype /Type0 + /BaseFont /EAAAAD+mwa_cmr10 + /Encoding /Identity-H + /ToUnicode 225 0 R + /DescendantFonts [226 0 R] +>> +endobj +226 0 obj +<< /Type /Font +/BaseFont /EAAAAD+mwa_cmr10 +/CIDToGIDMap /Identity +/Subtype /CIDFontType2 +/CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> +/FontDescriptor 219 0 R +/DW 0 +/W [ 0 [365 500 500 500 651 391 443 526 555 555 443 526 276 750 443 276 500 500 916 500 500 276 388 555 388 388 776 ] ] +>> +endobj +225 0 obj +<< /Length 227 0 R /Filter /FlateDecode >> +stream +x]j0E +-Eg!PR +^A~,C- ^+.T\J]Jw kXieif+5t'Lur +߲f2NWX +MP2}q ?]߬"]mb?GZot}U"P)')>C,QFHBhwݸ5xcYʻu;㔃P JA (Sb"GP$HzGA)@-Qu +,(@jWWTO}%cۚBֺ~amNf0*`ʃ +endstream +endobj +227 0 obj +355 +endobj +191 0 obj +<< /Type /Pages +/Count 1 +/Kids [189 0 R ] >> +endobj +228 0 obj +<< + /Type /Catalog + /Pages 191 0 R + /Lang (x-unknown) +>> +endobj +190 0 obj +<< + /Font << + /F1360 197 0 R + /F1358 206 0 R + /F1357 215 0 R + /F1359 224 0 R +>> + /ProcSet [/PDF /ImageB /ImageC /Text] + /ExtGState << + /GS1 2 0 R + /GS2 3 0 R + /GS3 4 0 R + /GS4 5 0 R + /GS5 6 0 R + /GS6 7 0 R + /GS7 8 0 R + /GS8 9 0 R + /GS9 10 0 R + /GS10 11 0 R + /GS11 12 0 R + /GS12 13 0 R + /GS13 14 0 R + /GS14 15 0 R + /GS15 16 0 R + /GS16 17 0 R + /GS17 18 0 R + /GS18 19 0 R + /GS19 20 0 R + /GS20 21 0 R + /GS21 22 0 R + /GS22 23 0 R + /GS23 24 0 R + /GS24 25 0 R + /GS25 26 0 R + /GS26 27 0 R + /GS27 28 0 R + /GS28 29 0 R + /GS29 30 0 R + /GS30 31 0 R + /GS31 32 0 R + /GS32 33 0 R + /GS33 34 0 R + /GS34 35 0 R + /GS35 36 0 R + /GS36 37 0 R + /GS37 38 0 R + /GS38 39 0 R + /GS39 40 0 R + /GS40 41 0 R + /GS41 42 0 R + /GS42 43 0 R + /GS43 44 0 R + /GS44 45 0 R + /GS45 46 0 R + /GS46 47 0 R + /GS47 48 0 R + /GS48 49 0 R + /GS49 50 0 R + /GS50 51 0 R + /GS51 52 0 R + /GS52 53 0 R + /GS53 54 0 R + /GS54 55 0 R + /GS55 56 0 R + /GS56 57 0 R + /GS57 58 0 R + /GS58 59 0 R + /GS59 60 0 R + /GS60 61 0 R + /GS61 62 0 R + /GS62 63 0 R + /GS63 64 0 R + /GS64 65 0 R + /GS65 66 0 R + /GS66 67 0 R + /GS67 68 0 R + /GS68 69 0 R + /GS69 70 0 R + /GS70 71 0 R + /GS71 72 0 R + /GS72 73 0 R + /GS73 74 0 R + /GS74 75 0 R + /GS75 76 0 R + /GS76 77 0 R + /GS77 78 0 R + /GS78 79 0 R + /GS79 80 0 R + /GS80 81 0 R + /GS81 82 0 R + /GS82 83 0 R + /GS83 84 0 R + /GS84 85 0 R + /GS85 86 0 R + /GS86 87 0 R + /GS87 88 0 R + /GS88 89 0 R + /GS89 90 0 R + /GS90 91 0 R + /GS91 92 0 R + /GS92 93 0 R + /GS93 94 0 R + /GS94 95 0 R + /GS95 96 0 R + /GS96 97 0 R + /GS97 98 0 R + /GS98 99 0 R + /GS99 100 0 R + /GS100 101 0 R + /GS101 102 0 R + /GS102 103 0 R + /GS103 104 0 R + /GS104 105 0 R + /GS105 106 0 R + /GS106 107 0 R + /GS107 108 0 R + /GS108 109 0 R + /GS109 110 0 R + /GS110 111 0 R + /GS111 112 0 R + /GS112 113 0 R + /GS113 114 0 R + /GS114 115 0 R + /GS115 116 0 R + /GS116 117 0 R + /GS117 118 0 R + /GS118 119 0 R + /GS119 120 0 R + /GS120 121 0 R + /GS121 122 0 R + /GS122 123 0 R + /GS123 124 0 R + /GS124 125 0 R + /GS125 126 0 R + /GS126 127 0 R + /GS127 128 0 R + /GS128 129 0 R + /GS129 130 0 R + /GS130 131 0 R + /GS131 132 0 R + /GS132 133 0 R + /GS133 134 0 R + /GS134 135 0 R + /GS135 136 0 R + /GS136 137 0 R + /GS137 138 0 R + /GS138 139 0 R + /GS139 140 0 R + /GS140 141 0 R + /GS141 142 0 R + /GS142 143 0 R + /GS143 144 0 R + /GS144 145 0 R + /GS145 146 0 R + /GS146 147 0 R + /GS147 148 0 R + /GS148 149 0 R + /GS149 150 0 R + /GS150 151 0 R + /GS151 152 0 R + /GS152 153 0 R + /GS153 154 0 R + /GS154 155 0 R + /GS155 156 0 R + /GS156 157 0 R + /GS157 158 0 R + /GS158 159 0 R + /GS159 160 0 R + /GS160 161 0 R + /GS161 162 0 R + /GS162 163 0 R + /GS163 164 0 R + /GS164 165 0 R + /GS165 166 0 R + /GS166 167 0 R + /GS167 168 0 R + /GS168 169 0 R + /GS169 170 0 R + /GS170 171 0 R + /GS171 172 0 R + /GS172 173 0 R + /GS173 174 0 R + /GS174 175 0 R + /GS175 176 0 R + /GS176 177 0 R + /GS177 178 0 R + /GS178 179 0 R + /GS179 180 0 R + /GS180 181 0 R + /GS181 182 0 R + /GS182 183 0 R + /GS183 184 0 R + /GS184 185 0 R +>> +>> +endobj +xref +0 229 +0000000000 65535 f +0000000015 00000 n +0000000145 00000 n +0000000197 00000 n +0000000249 00000 n +0000000301 00000 n +0000000353 00000 n +0000000405 00000 n +0000000457 00000 n +0000000509 00000 n +0000000561 00000 n +0000000614 00000 n +0000000667 00000 n +0000000720 00000 n +0000000773 00000 n +0000000826 00000 n +0000000879 00000 n +0000000932 00000 n +0000000985 00000 n +0000001038 00000 n +0000001091 00000 n +0000001144 00000 n +0000001197 00000 n +0000001250 00000 n +0000001303 00000 n +0000001356 00000 n +0000001409 00000 n +0000001463 00000 n +0000001517 00000 n +0000001571 00000 n +0000001625 00000 n +0000001678 00000 n +0000001731 00000 n +0000001784 00000 n +0000001837 00000 n +0000001890 00000 n +0000001943 00000 n +0000001996 00000 n +0000002049 00000 n +0000002102 00000 n +0000002155 00000 n +0000002208 00000 n +0000002261 00000 n +0000002314 00000 n +0000002367 00000 n +0000002420 00000 n +0000002473 00000 n +0000002526 00000 n +0000002579 00000 n +0000002632 00000 n +0000002685 00000 n +0000002738 00000 n +0000002791 00000 n +0000002844 00000 n +0000002897 00000 n +0000002950 00000 n +0000003003 00000 n +0000003056 00000 n +0000003109 00000 n +0000003162 00000 n +0000003215 00000 n +0000003268 00000 n +0000003321 00000 n +0000003374 00000 n +0000003427 00000 n +0000003480 00000 n +0000003533 00000 n +0000003586 00000 n +0000003639 00000 n +0000003692 00000 n +0000003745 00000 n +0000003798 00000 n +0000003851 00000 n +0000003904 00000 n +0000003957 00000 n +0000004010 00000 n +0000004063 00000 n +0000004116 00000 n +0000004169 00000 n +0000004222 00000 n +0000004275 00000 n +0000004329 00000 n +0000004383 00000 n +0000004437 00000 n +0000004491 00000 n +0000004545 00000 n +0000004599 00000 n +0000004646 00000 n +0000004693 00000 n +0000004740 00000 n +0000004787 00000 n +0000004834 00000 n +0000004881 00000 n +0000004928 00000 n +0000004975 00000 n +0000005022 00000 n +0000005069 00000 n +0000005116 00000 n +0000005169 00000 n +0000005222 00000 n +0000005275 00000 n +0000005329 00000 n +0000005383 00000 n +0000005437 00000 n +0000005491 00000 n +0000005545 00000 n +0000005599 00000 n +0000005653 00000 n +0000005707 00000 n +0000005761 00000 n +0000005815 00000 n +0000005869 00000 n +0000005923 00000 n +0000005977 00000 n +0000006031 00000 n +0000006085 00000 n +0000006139 00000 n +0000006193 00000 n +0000006247 00000 n +0000006301 00000 n +0000006355 00000 n +0000006409 00000 n +0000006464 00000 n +0000006519 00000 n +0000006574 00000 n +0000006629 00000 n +0000006683 00000 n +0000006737 00000 n +0000006791 00000 n +0000006845 00000 n +0000006899 00000 n +0000006953 00000 n +0000007007 00000 n +0000007061 00000 n +0000007115 00000 n +0000007169 00000 n +0000007223 00000 n +0000007277 00000 n +0000007331 00000 n +0000007385 00000 n +0000007439 00000 n +0000007493 00000 n +0000007547 00000 n +0000007601 00000 n +0000007655 00000 n +0000007709 00000 n +0000007763 00000 n +0000007817 00000 n +0000007871 00000 n +0000007925 00000 n +0000007979 00000 n +0000008033 00000 n +0000008087 00000 n +0000008141 00000 n +0000008195 00000 n +0000008249 00000 n +0000008303 00000 n +0000008357 00000 n +0000008411 00000 n +0000008465 00000 n +0000008519 00000 n +0000008573 00000 n +0000008627 00000 n +0000008681 00000 n +0000008735 00000 n +0000008789 00000 n +0000008843 00000 n +0000008897 00000 n +0000008951 00000 n +0000009005 00000 n +0000009059 00000 n +0000009113 00000 n +0000009167 00000 n +0000009221 00000 n +0000009275 00000 n +0000009329 00000 n +0000009384 00000 n +0000009439 00000 n +0000009494 00000 n +0000009549 00000 n +0000009604 00000 n +0000009659 00000 n +0000009707 00000 n +0000009755 00000 n +0000009803 00000 n +0000009851 00000 n +0000009899 00000 n +0000114122 00000 n +0000114146 00000 n +0000114173 00000 n +0000130424 00000 n +0000130285 00000 n +0000114371 00000 n +0000114627 00000 n +0000116103 00000 n +0000116081 00000 n +0000116193 00000 n +0000116213 00000 n +0000116602 00000 n +0000116373 00000 n +0000116916 00000 n +0000116937 00000 n +0000117189 00000 n +0000118633 00000 n +0000118611 00000 n +0000118720 00000 n +0000118739 00000 n +0000119130 00000 n +0000118899 00000 n +0000119442 00000 n +0000119463 00000 n +0000119719 00000 n +0000123154 00000 n +0000123132 00000 n +0000123250 00000 n +0000123270 00000 n +0000123697 00000 n +0000123430 00000 n +0000124055 00000 n +0000124076 00000 n +0000124331 00000 n +0000129224 00000 n +0000129202 00000 n +0000129322 00000 n +0000129342 00000 n +0000129831 00000 n +0000129501 00000 n +0000130264 00000 n +0000130347 00000 n +trailer +<< + /Root 228 0 R + /Info 1 0 R + /ID [<5A6BEB75E7805F3A4889F5594EB60BEA> <5A6BEB75E7805F3A4889F5594EB60BEA>] + /Size 229 +>> +startxref +133502 +%%EOF diff --git a/figs/gravimeter_rga.png b/figs/gravimeter_rga.png new file mode 100644 index 0000000..5029382 Binary files /dev/null and b/figs/gravimeter_rga.png differ diff --git a/gravimeter/align.m b/gravimeter/align.m deleted file mode 100644 index da0a06b..0000000 --- a/gravimeter/align.m +++ /dev/null @@ -1,15 +0,0 @@ -function [A] = align(V) -%A!ALIGN(V) returns a constat matrix A which is the real alignment of the -%INVERSE of the complex input matrix V -%from Mohit slides - - if (nargin ==0) || (nargin > 1) - disp('usage: mat_inv_real = align(mat)') - return - end - - D = pinv(real(V'*V)); - A = D*real(V'*diag(exp(1i * angle(diag(V*D*V.'))/2))); - - -end diff --git a/gravimeter/pzmap_testCL.m b/gravimeter/pzmap_testCL.m deleted file mode 100644 index f148bff..0000000 --- a/gravimeter/pzmap_testCL.m +++ /dev/null @@ -1,34 +0,0 @@ -function [] = pzmap_testCL(system,H,gain,feedin,feedout) -% evaluate and plot the pole-zero map for the closed loop system for -% different values of the gain - - [~, n] = size(gain); - [m1, n1, ~] = size(H); - [~,n2] = size(feedin); - - figure - for i = 1:n - % if n1 == n2 - system_CL = feedback(system,gain(i)*H,feedin,feedout); - - [P,Z] = pzmap(system_CL); - plot(real(P(:)),imag(P(:)),'x',real(Z(:)),imag(Z(:)),'o');hold on - xlabel('Real axis (s^{-1})');ylabel('Imaginary Axis (s^{-1})'); - % clear P Z - % else - % system_CL = feedback(system,gain(i)*H(:,1+(i-1)*m1:m1+(i-1)*m1),feedin,feedout); - % - % [P,Z] = pzmap(system_CL); - % plot(real(P(:)),imag(P(:)),'x',real(Z(:)),imag(Z(:)),'o');hold on - % xlabel('Real axis (s^{-1})');ylabel('Imaginary Axis (s^{-1})'); - % clear P Z - % end - end - str = {strcat('gain = ' , num2str(gain(1)))}; % at the end of first loop, z being loop output - str = [str , strcat('gain = ' , num2str(gain(1)))]; % after 2nd loop - for i = 2:n - str = [str , strcat('gain = ' , num2str(gain(i)))]; % after 2nd loop - str = [str , strcat('gain = ' , num2str(gain(i)))]; % after 2nd loop - end - legend(str{:}) -end diff --git a/gravimeter/script.m b/gravimeter/script.m index dee8039..4322cd9 100644 --- a/gravimeter/script.m +++ b/gravimeter/script.m @@ -4,13 +4,23 @@ clear; close all; clc; %% Intialize Laplace variable s = zpk('s'); -% Simscape Model - Parameters +freqs = logspace(-1, 2, 1000); + +% Gravimeter Model - Parameters +% <> + open('gravimeter.slx') -% Parameters +% The model of the gravimeter is schematically shown in Figure [[fig:gravimeter_model]]. + +% #+name: fig:gravimeter_model +% #+caption: Model of the gravimeter +% [[file:figs/gravimeter_model.png]] + +% The parameters used for the simulation are the following: l = 1.0; % Length of the mass [m] h = 1.7; % Height of the mass [m] @@ -22,13 +32,15 @@ m = 400; % Mass [kg] I = 115; % Inertia [kg m^2] k = 15e3; % Actuator Stiffness [N/m] -c = 0.03; % Actuator Damping [N/(m/s)] +c = 2e1; % Actuator Damping [N/(m/s)] deq = 0.2; % Length of the actuators [m] g = 0; % Gravity [m/s2] -% System Identification - Without Gravity +% System Identification +% <> + %% Name of the Simulink File mdl = 'gravimeter'; @@ -54,32 +66,21 @@ G.OutputName = {'Ax1', 'Az1', 'Ax2', 'Az2'}; % #+RESULTS: % [[file:figs/gravimeter_plant_schematic.png]] -% \begin{equation} -% \bm{a} = \begin{bmatrix} a_{1x} \\ a_{1z} \\ a_{2x} \\ a_{2z} \end{bmatrix} -% \end{equation} - -% \begin{equation} -% \bm{\tau} = \begin{bmatrix}\tau_1 \\ \tau_2 \\ \tau_2 \end{bmatrix} -% \end{equation} - % We can check the poles of the plant: - pole(G) % #+RESULTS: -% #+begin_example -% -0.000183495485977108 + 13.546056874877i -% -0.000183495485977108 - 13.546056874877i -% -7.49842878906757e-05 + 8.65934902322567i -% -7.49842878906757e-05 - 8.65934902322567i -% -1.33171230256362e-05 + 3.64924169037897i -% -1.33171230256362e-05 - 3.64924169037897i -% #+end_example +% | -0.12243+13.551i | +% | -0.12243-13.551i | +% | -0.05+8.6601i | +% | -0.05-8.6601i | +% | -0.0088785+3.6493i | +% | -0.0088785-3.6493i | -% The plant as 6 states as expected (2 translations + 1 rotation) +% As expected, the plant as 6 states (2 translations + 1 rotation) size(G) @@ -91,8 +92,6 @@ size(G) % The bode plot of all elements of the plant are shown in Figure [[fig:open_loop_tf]]. -freqs = logspace(-1, 2, 1000); - figure; tiledlayout(4, 3, 'TileSpacing', 'None', 'Padding', 'None'); @@ -124,7 +123,7 @@ end % #+RESULTS: % [[file:figs/gravimeter_decouple_jacobian.png]] -% The jacobian corresponding to the sensors and actuators are defined below. +% The Jacobian corresponding to the sensors and actuators are defined below: Ja = [1 0 h/2 0 1 -l/2 @@ -135,17 +134,25 @@ Jt = [1 0 ha 0 1 -la 0 1 la]; + + +% And the plant $\bm{G}_x$ is computed: + Gx = pinv(Ja)*G*pinv(Jt'); Gx.InputName = {'Fx', 'Fz', 'My'}; Gx.OutputName = {'Dx', 'Dz', 'Ry'}; +size(Gx) + +% #+RESULTS: +% : size(Gx) +% : State-space model with 3 outputs, 3 inputs, and 6 states. + % The diagonal and off-diagonal elements of $G_x$ are shown in Figure [[fig:gravimeter_jacobian_plant]]. -freqs = logspace(-1, 2, 1000); - figure; % Magnitude @@ -168,10 +175,12 @@ xlabel('Frequency [Hz]'); ylabel('Magnitude'); legend('location', 'southeast'); ylim([1e-8, 1e0]); -% Real Approximation of $G$ at the decoupling frequency -% <> +% Decoupling using the SVD +% <> -% Let's compute a real approximation of the complex matrix $H_1$ which corresponds to the the transfer function $G_u(j\omega_c)$ from forces applied by the actuators to the measured acceleration of the top platform evaluated at the frequency $\omega_c$. +% In order to decouple the plant using the SVD, first a real approximation of the plant transfer function matrix as the crossover frequency is required. + +% Let's compute a real approximation of the complex matrix $H_1$ which corresponds to the the transfer function $G(j\omega_c)$ from forces applied by the actuators to the measured acceleration of the top platform evaluated at the frequency $\omega_c$. wc = 2*pi*10; % Decoupling frequency [rad/s] @@ -182,16 +191,23 @@ H1 = evalfr(G, j*wc); % The real approximation is computed as follows: D = pinv(real(H1'*H1)); -H1 = inv(D*real(H1'*diag(exp(j*angle(diag(H1*D*H1.'))/2)))); +H1 = pinv(D*real(H1'*diag(exp(j*angle(diag(H1*D*H1.'))/2)))); -% SVD Decoupling -% <> -% First, the Singular Value Decomposition of $H_1$ is performed: + +% #+caption: Real approximate of $G$ at the decoupling frequency $\omega_c$ +% #+RESULTS: +% | 0.0092 | -0.0039 | 0.0039 | +% | -0.0039 | 0.0048 | 0.00028 | +% | -0.004 | 0.0038 | -0.0038 | +% | 8.4e-09 | 0.0025 | 0.0025 | + + +% Now, the Singular Value Decomposition of $H_1$ is performed: % \[ H_1 = U \Sigma V^H \] -[U,~,V] = svd(H1); +[U,S,V] = svd(H1); @@ -201,18 +217,27 @@ H1 = inv(D*real(H1'*diag(exp(j*angle(diag(H1*D*H1.'))/2)))); % [[file:figs/gravimeter_decouple_svd.png]] % The decoupled plant is then: -% \[ G_{SVD}(s) = U^{-1} G_u(s) V^{-H} \] +% \[ \bm{G}_{SVD}(s) = U^{-1} \bm{G}(s) V^{-H} \] Gsvd = inv(U)*G*inv(V'); +size(Gsvd) + + + +% #+RESULTS: +% : size(Gsvd) +% : State-space model with 4 outputs, 3 inputs, and 6 states. + +% The 4th output (corresponding to the null singular value) is discarded, and we only keep the $3 \times 3$ plant: + +Gsvd = Gsvd(1:3, 1:3); + % The diagonal and off-diagonal elements of the "SVD" plant are shown in Figure [[fig:gravimeter_svd_plant]]. - -freqs = logspace(-1, 2, 1000); - figure; % Magnitude @@ -232,25 +257,22 @@ end hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); xlabel('Frequency [Hz]'); ylabel('Magnitude'); -legend('location', 'southeast', 'FontSize', 8); +legend('location', 'southwest', 'FontSize', 8); ylim([1e-8, 1e0]); -% TODO Verification of the decoupling using the "Gershgorin Radii" -% <> +% Verification of the decoupling using the "Gershgorin Radii" +% <> % The "Gershgorin Radii" is computed for the coupled plant $G(s)$, for the "Jacobian plant" $G_x(s)$ and the "SVD Decoupled Plant" $G_{SVD}(s)$: % The "Gershgorin Radii" of a matrix $S$ is defined by: % \[ \zeta_i(j\omega) = \frac{\sum\limits_{j\neq i}|S_{ij}(j\omega)|}{|S_{ii}(j\omega)|} \] -% This is computed over the following frequencies. - -freqs = logspace(-2, 2, 1000); % [Hz] % Gershgorin Radii for the coupled plant: -Gr_coupled = zeros(length(freqs), size(Gu,2)); -H = abs(squeeze(freqresp(Gu, freqs, 'Hz'))); -for out_i = 1:size(Gu,2) +Gr_coupled = zeros(length(freqs), size(G,2)); +H = abs(squeeze(freqresp(G, freqs, 'Hz'))); +for out_i = 1:size(G,2) Gr_coupled(:, out_i) = squeeze((sum(H(out_i,:,:)) - H(out_i,out_i,:))./H(out_i, out_i, :)); end @@ -273,7 +295,7 @@ hold on; plot(freqs, Gr_coupled(:,1), 'DisplayName', 'Coupled'); plot(freqs, Gr_decoupled(:,1), 'DisplayName', 'SVD'); plot(freqs, Gr_jacobian(:,1), 'DisplayName', 'Jacobian'); -for in_i = 2:6 +for in_i = 2:3 set(gca,'ColorOrderIndex',1) plot(freqs, Gr_coupled(:,in_i), 'HandleVisibility', 'off'); set(gca,'ColorOrderIndex',2) @@ -284,25 +306,99 @@ end set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); hold off; xlabel('Frequency (Hz)'); ylabel('Gershgorin Radii') -legend('location', 'northwest'); -ylim([1e-3, 1e3]); +legend('location', 'southwest'); +ylim([1e-4, 1e2]); -% TODO Obtained Decoupled Plants +% Verification of the decoupling using the "Relative Gain Array" +% <> + +% The relative gain array (RGA) is defined as: +% \begin{equation} +% \Lambda\big(G(s)\big) = G(s) \times \big( G(s)^{-1} \big)^T +% \end{equation} +% where $\times$ denotes an element by element multiplication and $G(s)$ is an $n \times n$ square transfer matrix. + +% The obtained RGA elements are shown in Figure [[fig:gravimeter_rga]]. + + +% Relative Gain Array for the decoupled plant using SVD: +RGA_svd = zeros(length(freqs), size(Gsvd,1), size(Gsvd,2)); +Gsvd_inv = inv(Gsvd); +for f_i = 1:length(freqs) + RGA_svd(f_i, :, :) = abs(evalfr(Gsvd, j*2*pi*freqs(f_i)).*evalfr(Gsvd_inv, j*2*pi*freqs(f_i))'); +end + +% Relative Gain Array for the decoupled plant using the Jacobian: +RGA_x = zeros(length(freqs), size(Gx,1), size(Gx,2)); +Gx_inv = inv(Gx); +for f_i = 1:length(freqs) + RGA_x(f_i, :, :) = abs(evalfr(Gx, j*2*pi*freqs(f_i)).*evalfr(Gx_inv, j*2*pi*freqs(f_i))'); +end + +figure; +tiledlayout(1, 2, 'TileSpacing', 'None', 'Padding', 'None'); + +ax1 = nexttile; +hold on; +for i_in = 1:3 + for i_out = [1:i_in-1, i_in+1:3] + plot(freqs, RGA_svd(:, i_out, i_in), '--', 'color', [0 0 0 0.2], ... + 'HandleVisibility', 'off'); + end +end +plot(freqs, RGA_svd(:, 1, 2), '--', 'color', [0 0 0 0.2], ... + 'DisplayName', '$RGA_{SVD}(i,j),\ i \neq j$'); + +plot(freqs, RGA_svd(:, 1, 1), 'k-', ... + 'DisplayName', '$RGA_{SVD}(i,i)$'); +for ch_i = 1:3 + plot(freqs, RGA_svd(:, ch_i, ch_i), 'k-', ... + 'HandleVisibility', 'off'); +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Magnitude'); xlabel('Frequency [Hz]'); +legend('location', 'southwest'); + +ax2 = nexttile; +hold on; +for i_in = 1:3 + for i_out = [1:i_in-1, i_in+1:3] + plot(freqs, RGA_x(:, i_out, i_in), '--', 'color', [0 0 0 0.2], ... + 'HandleVisibility', 'off'); + end +end +plot(freqs, RGA_x(:, 1, 2), '--', 'color', [0 0 0 0.2], ... + 'DisplayName', '$RGA_{X}(i,j),\ i \neq j$'); + +plot(freqs, RGA_x(:, 1, 1), 'k-', ... + 'DisplayName', '$RGA_{X}(i,i)$'); +for ch_i = 1:3 + plot(freqs, RGA_x(:, ch_i, ch_i), 'k-', ... + 'HandleVisibility', 'off'); +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +xlabel('Frequency [Hz]'); set(gca, 'YTickLabel',[]); +legend('location', 'southwest'); + +linkaxes([ax1,ax2],'y'); +ylim([1e-5, 1e1]); + +% Obtained Decoupled Plants % <> -% The bode plot of the diagonal and off-diagonal elements of $G_{SVD}$ are shown in Figure [[fig:simscape_model_decoupled_plant_svd]]. +% The bode plot of the diagonal and off-diagonal elements of $G_{SVD}$ are shown in Figure [[fig:gravimeter_decoupled_plant_svd]]. -freqs = logspace(-1, 2, 1000); - figure; tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None'); % Magnitude ax1 = nexttile([2, 1]); hold on; -for i_in = 1:6 - for i_out = [1:i_in-1, i_in+1:6] +for i_in = 1:3 + for i_out = [1:i_in-1, i_in+1:3] plot(freqs, abs(squeeze(freqresp(Gsvd(i_out, i_in), freqs, 'Hz'))), 'color', [0,0,0,0.2], ... 'HandleVisibility', 'off'); end @@ -310,20 +406,20 @@ end plot(freqs, abs(squeeze(freqresp(Gsvd(1, 2), freqs, 'Hz'))), 'color', [0,0,0,0.5], ... 'DisplayName', '$G_{SVD}(i,j),\ i \neq j$'); set(gca,'ColorOrderIndex',1) -for ch_i = 1:6 +for ch_i = 1:3 plot(freqs, abs(squeeze(freqresp(Gsvd(ch_i, ch_i), freqs, 'Hz'))), ... 'DisplayName', sprintf('$G_{SVD}(%i,%i)$', ch_i, ch_i)); end hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); ylabel('Magnitude'); set(gca, 'XTickLabel',[]); -legend('location', 'northwest'); -ylim([1e-1, 1e5]) +legend('location', 'southwest'); +ylim([1e-8, 1e0]) % Phase ax2 = nexttile; hold on; -for ch_i = 1:6 +for ch_i = 1:3 plot(freqs, 180/pi*angle(squeeze(freqresp(Gsvd(ch_i, ch_i), freqs, 'Hz')))); end hold off; @@ -336,24 +432,22 @@ linkaxes([ax1,ax2],'x'); -% #+name: fig:simscape_model_decoupled_plant_svd +% #+name: fig:gravimeter_decoupled_plant_svd % #+caption: Decoupled Plant using SVD % #+RESULTS: -% [[file:figs/simscape_model_decoupled_plant_svd.png]] +% [[file:figs/gravimeter_decoupled_plant_svd.png]] -% Similarly, the bode plots of the diagonal elements and off-diagonal elements of the decoupled plant $G_x(s)$ using the Jacobian are shown in Figure [[fig:simscape_model_decoupled_plant_jacobian]]. +% Similarly, the bode plots of the diagonal elements and off-diagonal elements of the decoupled plant $G_x(s)$ using the Jacobian are shown in Figure [[fig:gravimeter_decoupled_plant_jacobian]]. -freqs = logspace(-1, 2, 1000); - figure; tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None'); % Magnitude ax1 = nexttile([2, 1]); hold on; -for i_in = 1:6 - for i_out = [1:i_in-1, i_in+1:6] +for i_in = 1:3 + for i_out = [1:i_in-1, i_in+1:3] plot(freqs, abs(squeeze(freqresp(Gx(i_out, i_in), freqs, 'Hz'))), 'color', [0,0,0,0.2], ... 'HandleVisibility', 'off'); end @@ -361,41 +455,35 @@ end plot(freqs, abs(squeeze(freqresp(Gx(1, 2), freqs, 'Hz'))), 'color', [0,0,0,0.5], ... 'DisplayName', '$G_x(i,j),\ i \neq j$'); set(gca,'ColorOrderIndex',1) -plot(freqs, abs(squeeze(freqresp(Gx('Ax', 'Fx'), freqs, 'Hz'))), 'DisplayName', '$G_x(1,1) = A_x/F_x$'); -plot(freqs, abs(squeeze(freqresp(Gx('Ay', 'Fy'), freqs, 'Hz'))), 'DisplayName', '$G_x(2,2) = A_y/F_y$'); -plot(freqs, abs(squeeze(freqresp(Gx('Az', 'Fz'), freqs, 'Hz'))), 'DisplayName', '$G_x(3,3) = A_z/F_z$'); -plot(freqs, abs(squeeze(freqresp(Gx('Arx', 'Mx'), freqs, 'Hz'))), 'DisplayName', '$G_x(4,4) = A_{R_x}/M_x$'); -plot(freqs, abs(squeeze(freqresp(Gx('Ary', 'My'), freqs, 'Hz'))), 'DisplayName', '$G_x(5,5) = A_{R_y}/M_y$'); -plot(freqs, abs(squeeze(freqresp(Gx('Arz', 'Mz'), freqs, 'Hz'))), 'DisplayName', '$G_x(6,6) = A_{R_z}/M_z$'); +plot(freqs, abs(squeeze(freqresp(Gx(1, 1), freqs, 'Hz'))), 'DisplayName', '$G_x(1,1) = A_x/F_x$'); +plot(freqs, abs(squeeze(freqresp(Gx(2, 2), freqs, 'Hz'))), 'DisplayName', '$G_x(2,2) = A_y/F_y$'); +plot(freqs, abs(squeeze(freqresp(Gx(3, 3), freqs, 'Hz'))), 'DisplayName', '$G_x(3,3) = R_y/M_y$'); hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); ylabel('Magnitude'); set(gca, 'XTickLabel',[]); -legend('location', 'northwest'); -ylim([1e-2, 2e6]) +legend('location', 'southwest'); +ylim([1e-8, 1e0]) % Phase ax2 = nexttile; hold on; -plot(freqs, 180/pi*angle(squeeze(freqresp(Gx('Ax', 'Fx'), freqs, 'Hz')))); -plot(freqs, 180/pi*angle(squeeze(freqresp(Gx('Ay', 'Fy'), freqs, 'Hz')))); -plot(freqs, 180/pi*angle(squeeze(freqresp(Gx('Az', 'Fz'), freqs, 'Hz')))); -plot(freqs, 180/pi*angle(squeeze(freqresp(Gx('Arx', 'Mx'), freqs, 'Hz')))); -plot(freqs, 180/pi*angle(squeeze(freqresp(Gx('Ary', 'My'), freqs, 'Hz')))); -plot(freqs, 180/pi*angle(squeeze(freqresp(Gx('Arz', 'Mz'), freqs, 'Hz')))); +plot(freqs, 180/pi*angle(squeeze(freqresp(Gx(1, 1), freqs, 'Hz')))); +plot(freqs, 180/pi*angle(squeeze(freqresp(Gx(2, 2), freqs, 'Hz')))); +plot(freqs, 180/pi*angle(squeeze(freqresp(Gx(3, 3), freqs, 'Hz')))); hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); ylabel('Phase [deg]'); xlabel('Frequency [Hz]'); -ylim([0, 180]); +ylim([-180, 180]); yticks([0:45:360]); linkaxes([ax1,ax2],'x'); -% #+name: fig:svd_control +% #+name: fig:svd_control_gravimeter % #+caption: Control Diagram for the SVD control % #+RESULTS: -% [[file:figs/svd_control.png]] +% [[file:figs/svd_control_gravimeter.png]] % We choose the controller to be a low pass filter: @@ -404,24 +492,23 @@ linkaxes([ax1,ax2],'x'); % $G_0$ is tuned such that the crossover frequency corresponding to the diagonal terms of the loop gain is equal to $\omega_c$ -wc = 2*pi*80; % Crossover Frequency [rad/s] +wc = 2*pi*10; % Crossover Frequency [rad/s] w0 = 2*pi*0.1; % Controller Pole [rad/s] K_cen = diag(1./diag(abs(evalfr(Gx, j*wc))))*(1/abs(evalfr(1/(1 + s/w0), j*wc)))/(1 + s/w0); L_cen = K_cen*Gx; -G_cen = feedback(G, pinv(J')*K_cen, [7:12], [1:6]); +G_cen = feedback(G, pinv(Jt')*K_cen*pinv(Ja)); K_svd = diag(1./diag(abs(evalfr(Gsvd, j*wc))))*(1/abs(evalfr(1/(1 + s/w0), j*wc)))/(1 + s/w0); L_svd = K_svd*Gsvd; -G_svd = feedback(G, inv(V')*K_svd*inv(U), [7:12], [1:6]); +U_inv = inv(U); +G_svd = feedback(G, inv(V')*K_svd*U_inv(1:3, :)); % The obtained diagonal elements of the loop gains are shown in Figure [[fig:gravimeter_comp_loop_gain_diagonal]]. -freqs = logspace(-1, 2, 1000); - figure; tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None'); @@ -429,7 +516,7 @@ tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None'); ax1 = nexttile([2, 1]); hold on; plot(freqs, abs(squeeze(freqresp(L_svd(1, 1), freqs, 'Hz'))), 'DisplayName', '$L_{SVD}(i,i)$'); -for i_in_out = 2:6 +for i_in_out = 2:3 set(gca,'ColorOrderIndex',1) plot(freqs, abs(squeeze(freqresp(L_svd(i_in_out, i_in_out), freqs, 'Hz'))), 'HandleVisibility', 'off'); end @@ -437,7 +524,7 @@ end set(gca,'ColorOrderIndex',2) plot(freqs, abs(squeeze(freqresp(L_cen(1, 1), freqs, 'Hz'))), ... 'DisplayName', '$L_{J}(i,i)$'); -for i_in_out = 2:6 +for i_in_out = 2:3 set(gca,'ColorOrderIndex',2) plot(freqs, abs(squeeze(freqresp(L_cen(i_in_out, i_in_out), freqs, 'Hz'))), 'HandleVisibility', 'off'); end @@ -450,12 +537,12 @@ ylim([5e-2, 2e3]) % Phase ax2 = nexttile; hold on; -for i_in_out = 1:6 +for i_in_out = 1:3 set(gca,'ColorOrderIndex',1) plot(freqs, 180/pi*angle(squeeze(freqresp(L_svd(i_in_out, i_in_out), freqs, 'Hz')))); end set(gca,'ColorOrderIndex',2) -for i_in_out = 1:6 +for i_in_out = 1:3 set(gca,'ColorOrderIndex',2) plot(freqs, 180/pi*angle(squeeze(freqresp(L_cen(i_in_out, i_in_out), freqs, 'Hz')))); end @@ -467,7 +554,7 @@ yticks([-180:90:360]); linkaxes([ax1,ax2],'x'); -% TODO Closed-Loop system Performances +% Closed-Loop system Performances % <> % Let's first verify the stability of the closed-loop systems: @@ -497,53 +584,39 @@ isstable(G_svd) freqs = logspace(-2, 2, 1000); figure; -tiledlayout(2, 2, 'TileSpacing', 'None', 'Padding', 'None'); +tiledlayout(1, 3, 'TileSpacing', 'None', 'Padding', 'None'); ax1 = nexttile; hold on; -plot(freqs, abs(squeeze(freqresp(G( 'Ax', 'Dwx')/s^2, freqs, 'Hz'))), 'DisplayName', 'Open-Loop'); -plot(freqs, abs(squeeze(freqresp(G_cen('Ax', 'Dwx')/s^2, freqs, 'Hz'))), 'DisplayName', 'Centralized'); -plot(freqs, abs(squeeze(freqresp(G_svd('Ax', 'Dwx')/s^2, freqs, 'Hz'))), '--', 'DisplayName', 'SVD'); -set(gca,'ColorOrderIndex',1) -plot(freqs, abs(squeeze(freqresp(G( 'Ay', 'Dwy')/s^2, freqs, 'Hz'))), 'HandleVisibility', 'off'); -plot(freqs, abs(squeeze(freqresp(G_cen('Ay', 'Dwy')/s^2, freqs, 'Hz'))), 'HandleVisibility', 'off'); -plot(freqs, abs(squeeze(freqresp(G_svd('Ay', 'Dwy')/s^2, freqs, 'Hz'))), '--', 'HandleVisibility', 'off'); +plot(freqs, abs(squeeze(freqresp(G( 1,1)/s^2, freqs, 'Hz'))), 'DisplayName', 'Open-Loop'); +plot(freqs, abs(squeeze(freqresp(G_cen(1,1)/s^2, freqs, 'Hz'))), 'DisplayName', 'Centralized'); +plot(freqs, abs(squeeze(freqresp(G_svd(1,1)/s^2, freqs, 'Hz'))), '--', 'DisplayName', 'SVD'); hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -ylabel('$D_x/D_{w,x}$, $D_y/D_{w, y}$'); set(gca, 'XTickLabel',[]); +ylabel('Transmissibility'); xlabel('Frequency [Hz]'); +title('$D_x/D_{w,x}$'); legend('location', 'southwest'); ax2 = nexttile; hold on; -plot(freqs, abs(squeeze(freqresp(G( 'Az', 'Dwz')/s^2, freqs, 'Hz')))); -plot(freqs, abs(squeeze(freqresp(G_cen('Az', 'Dwz')/s^2, freqs, 'Hz')))); -plot(freqs, abs(squeeze(freqresp(G_svd('Az', 'Dwz')/s^2, freqs, 'Hz'))), '--'); +plot(freqs, abs(squeeze(freqresp(G( 2,2)/s^2, freqs, 'Hz')))); +plot(freqs, abs(squeeze(freqresp(G_cen(2,2)/s^2, freqs, 'Hz')))); +plot(freqs, abs(squeeze(freqresp(G_svd(2,2)/s^2, freqs, 'Hz'))), '--'); hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -ylabel('$D_z/D_{w,z}$'); set(gca, 'XTickLabel',[]); +set(gca, 'YTickLabel',[]); xlabel('Frequency [Hz]'); +title('$D_z/D_{w,z}$'); ax3 = nexttile; hold on; -plot(freqs, abs(squeeze(freqresp(G( 'Arx', 'Rwx')/s^2, freqs, 'Hz')))); -plot(freqs, abs(squeeze(freqresp(G_cen('Arx', 'Rwx')/s^2, freqs, 'Hz')))); -plot(freqs, abs(squeeze(freqresp(G_svd('Arx', 'Rwx')/s^2, freqs, 'Hz'))), '--'); -set(gca,'ColorOrderIndex',1) -plot(freqs, abs(squeeze(freqresp(G( 'Ary', 'Rwy')/s^2, freqs, 'Hz')))); -plot(freqs, abs(squeeze(freqresp(G_cen('Ary', 'Rwy')/s^2, freqs, 'Hz')))); -plot(freqs, abs(squeeze(freqresp(G_svd('Ary', 'Rwy')/s^2, freqs, 'Hz'))), '--'); +plot(freqs, abs(squeeze(freqresp(G( 3,3)/s^2, freqs, 'Hz')))); +plot(freqs, abs(squeeze(freqresp(G_cen(3,3)/s^2, freqs, 'Hz')))); +plot(freqs, abs(squeeze(freqresp(G_svd(3,3)/s^2, freqs, 'Hz'))), '--'); hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -ylabel('$R_x/R_{w,x}$, $R_y/R_{w,y}$'); xlabel('Frequency [Hz]'); +set(gca, 'YTickLabel',[]); xlabel('Frequency [Hz]'); +title('$R_y/R_{w,y}$'); -ax4 = nexttile; -hold on; -plot(freqs, abs(squeeze(freqresp(G( 'Arz', 'Rwz')/s^2, freqs, 'Hz')))); -plot(freqs, abs(squeeze(freqresp(G_cen('Arz', 'Rwz')/s^2, freqs, 'Hz')))); -plot(freqs, abs(squeeze(freqresp(G_svd('Arz', 'Rwz')/s^2, freqs, 'Hz'))), '--'); -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -ylabel('$R_z/R_{w,z}$'); xlabel('Frequency [Hz]'); - -linkaxes([ax1,ax2,ax3,ax4],'xy'); +linkaxes([ax1,ax2,ax3],'xy'); xlim([freqs(1), freqs(end)]); -ylim([1e-3, 1e2]); +xlim([1e-2, 5e1]); ylim([1e-7, 1e-2]); diff --git a/index.html b/index.html index 2fcf158..78e5621 100644 --- a/index.html +++ b/index.html @@ -3,9 +3,9 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - + -SVD Control +Diagonal control using the SVD and the Jacobian Matrix @@ -25,68 +25,103 @@ | HOME
-

SVD Control

+

Diagonal control using the SVD and the Jacobian Matrix

Table of Contents

-
-

1 Gravimeter - Simscape Model

+

+In this document, the use of the Jacobian matrix and the Singular Value Decomposition to render a physical plant diagonal dominant is studied. +Then, a diagonal controller is used. +

+ +

+These two methods are tested on two plants: +

+
    +
  • In Section 1 on a 3-DoF gravimeter
  • +
  • In Section 2 on a 6-DoF Stewart platform
  • +
+ +
+

1 Gravimeter - Simscape Model

-
-
-

1.1 Introduction

+

+ +

-
-

1.2 Simscape Model - Parameters

+
+

1.1 Introduction

+
+

+In this part, diagonal control using both the SVD and the Jacobian matrices are applied on a gravimeter model: +

+
    +
  • Section 1.2: the model is described and its parameters are defined.
  • +
  • Section 1.3: the plant dynamics from the actuators to the sensors is computed from a Simscape model.
  • +
  • Section 1.4: the plant is decoupled using the Jacobian matrices.
  • +
  • Section 1.5: the Singular Value Decomposition is performed on a real approximation of the plant transfer matrix and further use to decouple the system.
  • +
  • Section 1.6: the effectiveness of the decoupling is computed using the Gershorin radii
  • +
  • Section 1.7: the effectiveness of the decoupling is computed using the Relative Gain Array
  • +
  • Section 1.8: the obtained decoupled plants are compared
  • +
  • Section 1.9: the diagonal controller is developed
  • +
  • Section 1.10: the obtained closed-loop performances for the two methods are compared
  • +
+
+
+ +
+

1.2 Gravimeter Model - Parameters

-
-
open('gravimeter.slx')
-
-
+

+ +

+ +

+The model of the gravimeter is schematically shown in Figure 1. +

-
+

gravimeter_model.png

Figure 1: Model of the gravimeter

-Parameters +The parameters used for the simulation are the following:

l  = 1.0; % Length of the mass [m]
@@ -109,9 +144,13 @@ g = 0; % Gravity [m/s2]
 
-
-

1.3 System Identification - Without Gravity

+
+

1.3 System Identification

+

+ +

+
%% Name of the Simulink File
 mdl = 'gravimeter';
@@ -133,7 +172,7 @@ G.OutputName = {'Ax1', 
 

-The inputs and outputs of the plant are shown in Figure 2. +The inputs and outputs of the plant are shown in Figure 2.

@@ -150,7 +189,7 @@ And 4 outputs (the two 2-DoF accelerometers): \end{equation} -

+

gravimeter_plant_schematic.png

Figure 2: Schematic of the gravimeter plant

@@ -206,11 +245,11 @@ State-space model with 4 outputs, 3 inputs, and 6 states.

-The bode plot of all elements of the plant are shown in Figure 3. +The bode plot of all elements of the plant are shown in Figure 3.

-
+

open_loop_tf.png

Figure 3: Open Loop Transfer Function from 3 Actuators to 4 Accelerometers

@@ -218,15 +257,15 @@ The bode plot of all elements of the plant are shown in Figure -

1.4 Physical Decoupling using the Jacobian

+
+

1.4 Decoupling using the Jacobian

- +

-Consider the control architecture shown in Figure 4. +Consider the control architecture shown in Figure 4.

@@ -244,16 +283,16 @@ The Jacobian matrix \(J_{a}\) is used to compute the vertical acceleration, hori \end{equation}

-We thus define a new plant as defined in Figure 4. +We thus define a new plant as defined in Figure 4. \[ \bm{G}_x(s) = J_a^{-1} \bm{G}(s) J_{\tau}^{-T} \]

-\(\bm{G}_x(s)\) correspond to the $3 × 3$transfer function matrix from forces and torques applied to the gravimeter at its center of mass to the absolute acceleration of the gravimeter’s center of mass (Figure 4). +\(\bm{G}_x(s)\) correspond to the $3 × 3$transfer function matrix from forces and torques applied to the gravimeter at its center of mass to the absolute acceleration of the gravimeter’s center of mass (Figure 4).

-
+

gravimeter_decouple_jacobian.png

Figure 4: Decoupled plant \(\bm{G}_x\) using the Jacobian matrix \(J\)

@@ -291,11 +330,11 @@ State-space model with 3 outputs, 3 inputs, and 6 states.

-The diagonal and off-diagonal elements of \(G_x\) are shown in Figure 5. +The diagonal and off-diagonal elements of \(G_x\) are shown in Figure 5.

-
+

gravimeter_jacobian_plant.png

Figure 5: Diagonal and off-diagonal elements of \(G_x\)

@@ -303,18 +342,17 @@ The diagonal and off-diagonal elements of \(G_x\) are shown in Figure -

1.5 SVD Decoupling

+
+

1.5 Decoupling using the SVD

- +

In order to decouple the plant using the SVD, first a real approximation of the plant transfer function matrix as the crossover frequency is required.

-

Let’s compute a real approximation of the complex matrix \(H_1\) which corresponds to the the transfer function \(G(j\omega_c)\) from forces applied by the actuators to the measured acceleration of the top platform evaluated at the frequency \(\omega_c\).

@@ -383,11 +421,11 @@ Now, the Singular Value Decomposition of \(H_1\) is performed:

-The obtained matrices \(U\) and \(V\) are used to decouple the system as shown in Figure 6. +The obtained matrices \(U\) and \(V\) are used to decouple the system as shown in Figure 6.

-
+

gravimeter_decouple_svd.png

Figure 6: Decoupled plant \(\bm{G}_{SVD}\) using the Singular Value Decomposition

@@ -418,10 +456,10 @@ The 4th output (corresponding to the null singular value) is discarded, and we o

-The diagonal and off-diagonal elements of the “SVD” plant are shown in Figure 7. +The diagonal and off-diagonal elements of the “SVD” plant are shown in Figure 7.

-
+

gravimeter_svd_plant.png

Figure 7: Diagonal and off-diagonal elements of \(G_{svd}\)

@@ -429,11 +467,11 @@ The diagonal and off-diagonal elements of the “SVD” plant are shown
-
-

1.6 Verification of the decoupling using the “Gershgorin Radii”

+
+

1.6 Verification of the decoupling using the “Gershgorin Radii”

- +

@@ -454,7 +492,7 @@ This is computed over the following frequencies.

-
+

gravimeter_gershgorin_radii.png

Figure 8: Gershgorin Radii of the Coupled and Decoupled plants

@@ -462,43 +500,73 @@ This is computed over the following frequencies.
-
-

1.7 Obtained Decoupled Plants

+
+

1.7 Verification of the decoupling using the “Relative Gain Array”

- +

-The bode plot of the diagonal and off-diagonal elements of \(G_{SVD}\) are shown in Figure 9. +The relative gain array (RGA) is defined as:

- - -
-

gravimeter_decoupled_plant_svd.png +\begin{equation} + \Lambda\big(G(s)\big) = G(s) \times \big( G(s)^{-1} \big)^T +\end{equation} +

+where \(\times\) denotes an element by element multiplication and \(G(s)\) is an \(n \times n\) square transfer matrix.

-

Figure 9: Decoupled Plant using SVD

-

-Similarly, the bode plots of the diagonal elements and off-diagonal elements of the decoupled plant \(G_x(s)\) using the Jacobian are shown in Figure 10. +The obtained RGA elements are shown in Figure 9.

-
-

gravimeter_decoupled_plant_jacobian.png +

+

gravimeter_rga.png

-

Figure 10: Gravimeter Platform Plant from forces (resp. torques) applied by the legs to the acceleration (resp. angular acceleration) of the platform as well as all the coupling terms between the two (non-diagonal terms of the transfer function matrix)

+

Figure 9: Obtained norm of RGA elements for the SVD decoupled plant and the Jacobian decoupled plant

-
-

1.8 Diagonal Controller

+
+

1.8 Obtained Decoupled Plants

- -The control diagram for the centralized control is shown in Figure 11. + +

+ +

+The bode plot of the diagonal and off-diagonal elements of \(G_{SVD}\) are shown in Figure 10. +

+ + +
+

gravimeter_decoupled_plant_svd.png +

+

Figure 10: Decoupled Plant using SVD

+
+ +

+Similarly, the bode plots of the diagonal elements and off-diagonal elements of the decoupled plant \(G_x(s)\) using the Jacobian are shown in Figure 11. +

+ + +
+

gravimeter_decoupled_plant_jacobian.png +

+

Figure 11: Gravimeter Platform Plant from forces (resp. torques) applied by the legs to the acceleration (resp. angular acceleration) of the platform as well as all the coupling terms between the two (non-diagonal terms of the transfer function matrix)

+
+
+
+ +
+

1.9 Diagonal Controller

+
+

+ +The control diagram for the centralized control is shown in Figure 12.

@@ -507,22 +575,22 @@ The Jacobian is used to convert forces in the cartesian frame to forces applied

-
+

centralized_control_gravimeter.png

-

Figure 11: Control Diagram for the Centralized control

+

Figure 12: Control Diagram for the Centralized control

-The SVD control architecture is shown in Figure 12. +The SVD control architecture is shown in Figure 13. The matrices \(U\) and \(V\) are used to decoupled the plant \(G\).

-
+

svd_control_gravimeter.png

-

Figure 12: Control Diagram for the SVD control

+

Figure 13: Control Diagram for the SVD control

@@ -557,23 +625,23 @@ G_svd = feedback(G, inv(V')

-The obtained diagonal elements of the loop gains are shown in Figure 13. +The obtained diagonal elements of the loop gains are shown in Figure 14.

-
+

gravimeter_comp_loop_gain_diagonal.png

-

Figure 13: Comparison of the diagonal elements of the loop gains for the SVD control architecture and the Jacobian one

+

Figure 14: Comparison of the diagonal elements of the loop gains for the SVD control architecture and the Jacobian one

-
-

1.9 Closed-Loop system Performances

-
+
+

1.10 Closed-Loop system Performances

+

- +

@@ -604,24 +672,27 @@ ans =

-The obtained transmissibility in Open-loop, for the centralized control as well as for the SVD control are shown in Figure 14. +The obtained transmissibility in Open-loop, for the centralized control as well as for the SVD control are shown in Figure 15.

-
+

gravimeter_platform_simscape_cl_transmissibility.png

-

Figure 14: Obtained Transmissibility

+

Figure 15: Obtained Transmissibility

-
-

2 Stewart Platform - Simscape Model

+
+

2 Stewart Platform - Simscape Model

-In this analysis, we wish to applied SVD control to the Stewart Platform shown in Figure 15. + +

+

+In this analysis, we wish to applied SVD control to the Stewart Platform shown in Figure 16.

@@ -634,32 +705,33 @@ Some notes about the system: -

+

SP_assembly.png

-

Figure 15: Stewart Platform CAD View

+

Figure 16: Stewart Platform CAD View

-The analysis of the SVD control applied to the Stewart platform is performed in the following sections: +The analysis of the SVD/Jacobian control applied to the Stewart platform is performed in the following sections:

    -
  • Section 2.1: The parameters of the Simscape model of the Stewart platform are defined
  • -
  • Section 2.2: The plant is identified from the Simscape model and the system coupling is shown
  • -
  • Section 2.3: The plant is first decoupled using the Jacobian
  • -
  • Section 2.4: A real approximation of the plant is computed for further decoupling using the Singular Value Decomposition (SVD)
  • -
  • Section 2.5: The decoupling is performed thanks to the SVD
  • -
  • Section 1.6: The effectiveness of the decoupling with the Jacobian and SVD are compared using the Gershorin Radii
  • -
  • Section 2.8: The dynamics of the decoupled plants are shown
  • -
  • Section 2.9: A diagonal controller is defined to control the decoupled plant
  • -
  • Section 2.10: Finally, the closed loop system properties are studied
  • +
  • Section 2.1: The parameters of the Simscape model of the Stewart platform are defined
  • +
  • Section 2.2: The plant is identified from the Simscape model and the system coupling is shown
  • +
  • Section 2.3: The plant is first decoupled using the Jacobian
  • +
  • Section 2.4: The decoupling is performed thanks to the SVD. To do so a real approximation of the plant is computed.
  • +
  • Section 2.5: The effectiveness of the decoupling with the Jacobian and SVD are compared using the Gershorin Radii
  • +
  • Section 2.6:
  • +
  • Section 2.7: The dynamics of the decoupled plants are shown
  • +
  • Section 2.8: A diagonal controller is defined to control the decoupled plant
  • +
  • Section 2.9: Finally, the closed loop system properties are studied
-
-

2.1 Simscape Model - Parameters

+ +
+

2.1 Simscape Model - Parameters

- +

open('drone_platform.slx');
@@ -715,30 +787,30 @@ Kc = tf(zeros(6));
 
-
+

stewart_simscape.png

-

Figure 16: General view of the Simscape Model

+

Figure 17: General view of the Simscape Model

-
+

stewart_platform_details.png

-

Figure 17: Simscape model of the Stewart platform

+

Figure 18: Simscape model of the Stewart platform

-
-

2.2 Identification of the plant

+
+

2.2 Identification of the plant

- +

-The plant shown in Figure 18 is identified from the Simscape model. +The plant shown in Figure 19 is identified from the Simscape model.

@@ -754,10 +826,10 @@ The outputs are the 6 accelerations measured by the inertial unit.

-
+

stewart_platform_plant.png

-

Figure 18: Considered plant \(\bm{G} = \begin{bmatrix}G_d\\G_u\end{bmatrix}\). \(D_w\) is the translation/rotation of the support, \(\tau\) the actuator forces, \(a\) the acceleration/angular acceleration of the top platform

+

Figure 19: Considered plant \(\bm{G} = \begin{bmatrix}G_d\\G_u\end{bmatrix}\). \(D_w\) is the translation/rotation of the support, \(\tau\) the actuator forces, \(a\) the acceleration/angular acceleration of the top platform

@@ -796,7 +868,7 @@ State-space model with 6 outputs, 12 inputs, and 24 states.

-The elements of the transfer matrix \(\bm{G}\) corresponding to the transfer function from actuator forces \(\tau\) to the measured acceleration \(a\) are shown in Figure 19. +The elements of the transfer matrix \(\bm{G}\) corresponding to the transfer function from actuator forces \(\tau\) to the measured acceleration \(a\) are shown in Figure 20.

@@ -804,20 +876,20 @@ One can easily see that the system is strongly coupled.

-
+

stewart_platform_coupled_plant.png

-

Figure 19: Magnitude of all 36 elements of the transfer function matrix \(G_u\)

+

Figure 20: Magnitude of all 36 elements of the transfer function matrix \(G_u\)

-
-

2.3 Physical Decoupling using the Jacobian

+
+

2.3 Decoupling using the Jacobian

- -Consider the control architecture shown in Figure 20. + +Consider the control architecture shown in Figure 21. The Jacobian matrix is used to transform forces/torques applied on the top platform to the equivalent forces applied by each actuator.

@@ -899,10 +971,10 @@ The Jacobian matrix is computed from the geometry of the platform (position and -
+

plant_decouple_jacobian.png

-

Figure 20: Decoupled plant \(\bm{G}_x\) using the Jacobian matrix \(J\)

+

Figure 21: Decoupled plant \(\bm{G}_x\) using the Jacobian matrix \(J\)

@@ -922,11 +994,15 @@ Gx.InputName = {'Fx',

-
-

2.4 Real Approximation of \(G\) at the decoupling frequency

+
+

2.4 Decoupling using the SVD

- + +

+ +

+In order to decouple the plant using the SVD, first a real approximation of the plant transfer function matrix as the crossover frequency is required.

@@ -1100,18 +1176,9 @@ This can be verified below where only the real value of \(G_u(\omega_c)\) is sho -

-
- -
-

2.5 SVD Decoupling

-
-

- -

-First, the Singular Value Decomposition of \(H_1\) is performed: +Now, the Singular Value Decomposition of \(H_1\) is performed: \[ H_1 = U \Sigma V^H \]

@@ -1267,14 +1334,14 @@ First, the Singular Value Decomposition of \(H_1\) is performed:

-The obtained matrices \(U\) and \(V\) are used to decouple the system as shown in Figure 21. +The obtained matrices \(U\) and \(V\) are used to decouple the system as shown in Figure 22.

-
+

plant_decouple_svd.png

-

Figure 21: Decoupled plant \(\bm{G}_{SVD}\) using the Singular Value Decomposition

+

Figure 22: Decoupled plant \(\bm{G}_{SVD}\) using the Singular Value Decomposition

@@ -1289,11 +1356,11 @@ The decoupled plant is then:

-
-

2.6 Verification of the decoupling using the “Gershgorin Radii”

-
+
+

2.5 Verification of the decoupling using the “Gershgorin Radii”

+

- +

@@ -1309,17 +1376,21 @@ The “Gershgorin Radii” of a matrix \(S\) is defined by: This is computed over the following frequencies.

-
+

simscape_model_gershgorin_radii.png

-

Figure 22: Gershgorin Radii of the Coupled and Decoupled plants

+

Figure 23: Gershgorin Radii of the Coupled and Decoupled plants

-
-

2.7 Verification of the decoupling using the “Relative Gain Array”

-
+
+

2.6 Verification of the decoupling using the “Relative Gain Array”

+
+

+ +

+

The relative gain array (RGA) is defined as:

@@ -1331,55 +1402,55 @@ where \(\times\) denotes an element by element multiplication and \(G(s)\) is an

-The obtained RGA elements are shown in Figure 23. +The obtained RGA elements are shown in Figure 24.

-
+

simscape_model_rga.png

-

Figure 23: Obtained norm of RGA elements for the SVD decoupled plant and the Jacobian decoupled plant

+

Figure 24: Obtained norm of RGA elements for the SVD decoupled plant and the Jacobian decoupled plant

-
-

2.8 Obtained Decoupled Plants

-
+
+

2.7 Obtained Decoupled Plants

+

- +

-The bode plot of the diagonal and off-diagonal elements of \(G_{SVD}\) are shown in Figure 24. +The bode plot of the diagonal and off-diagonal elements of \(G_{SVD}\) are shown in Figure 25.

-
+

simscape_model_decoupled_plant_svd.png

-

Figure 24: Decoupled Plant using SVD

+

Figure 25: Decoupled Plant using SVD

-Similarly, the bode plots of the diagonal elements and off-diagonal elements of the decoupled plant \(G_x(s)\) using the Jacobian are shown in Figure 25. +Similarly, the bode plots of the diagonal elements and off-diagonal elements of the decoupled plant \(G_x(s)\) using the Jacobian are shown in Figure 26.

-
+

simscape_model_decoupled_plant_jacobian.png

-

Figure 25: Stewart Platform Plant from forces (resp. torques) applied by the legs to the acceleration (resp. angular acceleration) of the platform as well as all the coupling terms between the two (non-diagonal terms of the transfer function matrix)

+

Figure 26: Stewart Platform Plant from forces (resp. torques) applied by the legs to the acceleration (resp. angular acceleration) of the platform as well as all the coupling terms between the two (non-diagonal terms of the transfer function matrix)

-
-

2.9 Diagonal Controller

-
+
+

2.8 Diagonal Controller

+

- -The control diagram for the centralized control is shown in Figure 26. + +The control diagram for the centralized control is shown in Figure 27.

@@ -1388,22 +1459,22 @@ The Jacobian is used to convert forces in the cartesian frame to forces applied

-
+

centralized_control.png

-

Figure 26: Control Diagram for the Centralized control

+

Figure 27: Control Diagram for the Centralized control

-The SVD control architecture is shown in Figure 27. +The SVD control architecture is shown in Figure 28. The matrices \(U\) and \(V\) are used to decoupled the plant \(G\).

-
+

svd_control.png

-

Figure 27: Control Diagram for the SVD control

+

Figure 28: Control Diagram for the SVD control

@@ -1437,23 +1508,23 @@ G_svd = feedback(G, inv(V')

-The obtained diagonal elements of the loop gains are shown in Figure 28. +The obtained diagonal elements of the loop gains are shown in Figure 29.

-
+

stewart_comp_loop_gain_diagonal.png

-

Figure 28: Comparison of the diagonal elements of the loop gains for the SVD control architecture and the Jacobian one

+

Figure 29: Comparison of the diagonal elements of the loop gains for the SVD control architecture and the Jacobian one

-
-

2.10 Closed-Loop system Performances

-
+
+

2.9 Closed-Loop system Performances

+

- +

@@ -1484,63 +1555,14 @@ ans =

-The obtained transmissibility in Open-loop, for the centralized control as well as for the SVD control are shown in Figure 29. +The obtained transmissibility in Open-loop, for the centralized control as well as for the SVD control are shown in Figure 30.

-
+

stewart_platform_simscape_cl_transmissibility.png

-

Figure 29: Obtained Transmissibility

-
-
-
- -
-

2.11 Small error on the sensor location   no_export

-
-

-Let’s now consider a small position error of the sensor: -

-
-
sens_pos_error = [105 5 -1]*1e-3; % [m]
-
-
- -

-The system is identified again: -

-
-
Gx = Gu*inv(J');
-Gx.InputName  = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'};
-
-
- -
-
Gsvd = inv(U)*Gu*inv(V');
-
-
- -
-
L_cen = K_cen*Gx;
-G_cen = feedback(G, pinv(J')*K_cen, [7:12], [1:6]);
-
-
- -
-
L_svd = K_svd*Gsvd;
-G_svd = feedback(G, inv(V')*K_svd*inv(U), [7:12], [1:6]);
-
-
- -
-
isstable(G_cen)
-
-
- -
-
isstable(G_svd)
-
+

Figure 30: Obtained Transmissibility

@@ -1548,7 +1570,7 @@ G_svd = feedback(G, inv(V')

Author: Dehaeze Thomas

-

Created: 2020-11-25 mer. 09:16

+

Created: 2020-11-25 mer. 09:32

diff --git a/index.org b/index.org index c9f95b9..9aec051 100644 --- a/index.org +++ b/index.org @@ -1,4 +1,4 @@ -#+TITLE: SVD Control +#+TITLE: Diagonal control using the SVD and the Jacobian Matrix :DRAWER: #+STARTUP: overview @@ -38,12 +38,34 @@ #+PROPERTY: header-args:latex+ :post pdf2svg(file=*this*, ext="png") :END: +* Introduction :ignore: + +In this document, the use of the Jacobian matrix and the Singular Value Decomposition to render a physical plant diagonal dominant is studied. +Then, a diagonal controller is used. + +These two methods are tested on two plants: +- In Section [[sec:gravimeter]] on a 3-DoF gravimeter +- In Section [[sec:stewart_platform]] on a 6-DoF Stewart platform + * Gravimeter - Simscape Model :PROPERTIES: :header-args:matlab+: :tangle gravimeter/script.m :END: +<> + ** Introduction +In this part, diagonal control using both the SVD and the Jacobian matrices are applied on a gravimeter model: +- Section [[sec:gravimeter_model]]: the model is described and its parameters are defined. +- Section [[sec:gravimeter_identification]]: the plant dynamics from the actuators to the sensors is computed from a Simscape model. +- Section [[sec:gravimeter_jacobian_decoupling]]: the plant is decoupled using the Jacobian matrices. +- Section [[sec:gravimeter_svd_decoupling]]: the Singular Value Decomposition is performed on a real approximation of the plant transfer matrix and further use to decouple the system. +- Section [[sec:gravimeter_gershgorin_radii]]: the effectiveness of the decoupling is computed using the Gershorin radii +- Section [[sec:gravimeter_rga]]: the effectiveness of the decoupling is computed using the Relative Gain Array +- Section [[sec:gravimeter_decoupled_plant]]: the obtained decoupled plants are compared +- Section [[sec:gravimeter_diagonal_control]]: the diagonal controller is developed +- Section [[sec:gravimeter_closed_loop_results]]: the obtained closed-loop performances for the two methods are compared + ** Matlab Init :noexport:ignore: #+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name) <> @@ -57,16 +79,24 @@ addpath('gravimeter'); #+end_src -** Simscape Model - Parameters #+begin_src matlab + freqs = logspace(-1, 2, 1000); +#+end_src + +** Gravimeter Model - Parameters +<> + +#+begin_src matlab :exports none open('gravimeter.slx') #+end_src +The model of the gravimeter is schematically shown in Figure [[fig:gravimeter_model]]. + #+name: fig:gravimeter_model #+caption: Model of the gravimeter [[file:figs/gravimeter_model.png]] -Parameters +The parameters used for the simulation are the following: #+begin_src matlab l = 1.0; % Length of the mass [m] h = 1.7; % Height of the mass [m] @@ -85,7 +115,9 @@ Parameters g = 0; % Gravity [m/s2] #+end_src -** System Identification - Without Gravity +** System Identification +<> + #+begin_src matlab %% Name of the Simulink File mdl = 'gravimeter'; @@ -155,8 +187,6 @@ As expected, the plant as 6 states (2 translations + 1 rotation) The bode plot of all elements of the plant are shown in Figure [[fig:open_loop_tf]]. #+begin_src matlab :exports none - freqs = logspace(-1, 2, 1000); - figure; tiledlayout(4, 3, 'TileSpacing', 'None', 'Padding', 'None'); @@ -191,7 +221,7 @@ The bode plot of all elements of the plant are shown in Figure [[fig:open_loop_t #+RESULTS: [[file:figs/open_loop_tf.png]] -** Physical Decoupling using the Jacobian +** Decoupling using the Jacobian <> Consider the control architecture shown in Figure [[fig:gravimeter_decouple_jacobian]]. @@ -265,8 +295,6 @@ And the plant $\bm{G}_x$ is computed: The diagonal and off-diagonal elements of $G_x$ are shown in Figure [[fig:gravimeter_jacobian_plant]]. #+begin_src matlab :exports none - freqs = logspace(-1, 2, 1000); - figure; % Magnitude @@ -299,12 +327,11 @@ The diagonal and off-diagonal elements of $G_x$ are shown in Figure [[fig:gravim #+RESULTS: [[file:figs/gravimeter_jacobian_plant.png]] -** SVD Decoupling +** Decoupling using the SVD <> In order to decouple the plant using the SVD, first a real approximation of the plant transfer function matrix as the crossover frequency is required. - Let's compute a real approximation of the complex matrix $H_1$ which corresponds to the the transfer function $G(j\omega_c)$ from forces applied by the actuators to the measured acceleration of the top platform evaluated at the frequency $\omega_c$. #+begin_src matlab wc = 2*pi*10; % Decoupling frequency [rad/s] @@ -386,8 +413,6 @@ The 4th output (corresponding to the null singular value) is discarded, and we o The diagonal and off-diagonal elements of the "SVD" plant are shown in Figure [[fig:gravimeter_svd_plant]]. #+begin_src matlab :exports none - freqs = logspace(-1, 2, 1000); - figure; % Magnitude @@ -421,18 +446,13 @@ The diagonal and off-diagonal elements of the "SVD" plant are shown in Figure [[ [[file:figs/gravimeter_svd_plant.png]] ** Verification of the decoupling using the "Gershgorin Radii" -<> +<> The "Gershgorin Radii" is computed for the coupled plant $G(s)$, for the "Jacobian plant" $G_x(s)$ and the "SVD Decoupled Plant" $G_{SVD}(s)$: The "Gershgorin Radii" of a matrix $S$ is defined by: \[ \zeta_i(j\omega) = \frac{\sum\limits_{j\neq i}|S_{ij}(j\omega)|}{|S_{ii}(j\omega)|} \] -This is computed over the following frequencies. -#+begin_src matlab - freqs = logspace(-2, 2, 1000); % [Hz] -#+end_src - #+begin_src matlab :exports none % Gershgorin Radii for the coupled plant: Gr_coupled = zeros(length(freqs), size(G,2)); @@ -473,7 +493,7 @@ This is computed over the following frequencies. set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); hold off; xlabel('Frequency (Hz)'); ylabel('Gershgorin Radii') - legend('location', 'northwest'); + legend('location', 'southwest'); ylim([1e-4, 1e2]); #+end_src @@ -486,14 +506,100 @@ This is computed over the following frequencies. #+RESULTS: [[file:figs/gravimeter_gershgorin_radii.png]] +** Verification of the decoupling using the "Relative Gain Array" +<> + +The relative gain array (RGA) is defined as: +\begin{equation} + \Lambda\big(G(s)\big) = G(s) \times \big( G(s)^{-1} \big)^T +\end{equation} +where $\times$ denotes an element by element multiplication and $G(s)$ is an $n \times n$ square transfer matrix. + +The obtained RGA elements are shown in Figure [[fig:gravimeter_rga]]. + +#+begin_src matlab :exports none + % Relative Gain Array for the decoupled plant using SVD: + RGA_svd = zeros(length(freqs), size(Gsvd,1), size(Gsvd,2)); + Gsvd_inv = inv(Gsvd); + for f_i = 1:length(freqs) + RGA_svd(f_i, :, :) = abs(evalfr(Gsvd, j*2*pi*freqs(f_i)).*evalfr(Gsvd_inv, j*2*pi*freqs(f_i))'); + end + + % Relative Gain Array for the decoupled plant using the Jacobian: + RGA_x = zeros(length(freqs), size(Gx,1), size(Gx,2)); + Gx_inv = inv(Gx); + for f_i = 1:length(freqs) + RGA_x(f_i, :, :) = abs(evalfr(Gx, j*2*pi*freqs(f_i)).*evalfr(Gx_inv, j*2*pi*freqs(f_i))'); + end +#+end_src + +#+begin_src matlab :exports none + figure; + tiledlayout(1, 2, 'TileSpacing', 'None', 'Padding', 'None'); + + ax1 = nexttile; + hold on; + for i_in = 1:3 + for i_out = [1:i_in-1, i_in+1:3] + plot(freqs, RGA_svd(:, i_out, i_in), '--', 'color', [0 0 0 0.2], ... + 'HandleVisibility', 'off'); + end + end + plot(freqs, RGA_svd(:, 1, 2), '--', 'color', [0 0 0 0.2], ... + 'DisplayName', '$RGA_{SVD}(i,j),\ i \neq j$'); + + plot(freqs, RGA_svd(:, 1, 1), 'k-', ... + 'DisplayName', '$RGA_{SVD}(i,i)$'); + for ch_i = 1:3 + plot(freqs, RGA_svd(:, ch_i, ch_i), 'k-', ... + 'HandleVisibility', 'off'); + end + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Magnitude'); xlabel('Frequency [Hz]'); + legend('location', 'southwest'); + + ax2 = nexttile; + hold on; + for i_in = 1:3 + for i_out = [1:i_in-1, i_in+1:3] + plot(freqs, RGA_x(:, i_out, i_in), '--', 'color', [0 0 0 0.2], ... + 'HandleVisibility', 'off'); + end + end + plot(freqs, RGA_x(:, 1, 2), '--', 'color', [0 0 0 0.2], ... + 'DisplayName', '$RGA_{X}(i,j),\ i \neq j$'); + + plot(freqs, RGA_x(:, 1, 1), 'k-', ... + 'DisplayName', '$RGA_{X}(i,i)$'); + for ch_i = 1:3 + plot(freqs, RGA_x(:, ch_i, ch_i), 'k-', ... + 'HandleVisibility', 'off'); + end + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + xlabel('Frequency [Hz]'); set(gca, 'YTickLabel',[]); + legend('location', 'southwest'); + + linkaxes([ax1,ax2],'y'); + ylim([1e-5, 1e1]); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace + exportFig('figs/gravimeter_rga.pdf', 'width', 'wide', 'height', 'tall'); +#+end_src + +#+name: fig:gravimeter_rga +#+caption: Obtained norm of RGA elements for the SVD decoupled plant and the Jacobian decoupled plant +#+RESULTS: +[[file:figs/gravimeter_rga.png]] + ** Obtained Decoupled Plants <> The bode plot of the diagonal and off-diagonal elements of $G_{SVD}$ are shown in Figure [[fig:gravimeter_decoupled_plant_svd]]. #+begin_src matlab :exports none - freqs = logspace(-1, 2, 1000); - figure; tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None'); @@ -546,8 +652,6 @@ The bode plot of the diagonal and off-diagonal elements of $G_{SVD}$ are shown i Similarly, the bode plots of the diagonal elements and off-diagonal elements of the decoupled plant $G_x(s)$ using the Jacobian are shown in Figure [[fig:gravimeter_decoupled_plant_jacobian]]. #+begin_src matlab :exports none - freqs = logspace(-1, 2, 1000); - figure; tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None'); @@ -686,8 +790,6 @@ $G_0$ is tuned such that the crossover frequency corresponding to the diagonal t The obtained diagonal elements of the loop gains are shown in Figure [[fig:gravimeter_comp_loop_gain_diagonal]]. #+begin_src matlab :exports none - freqs = logspace(-1, 2, 1000); - figure; tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None'); @@ -806,7 +908,7 @@ The obtained transmissibility in Open-loop, for the centralized control as well linkaxes([ax1,ax2,ax3],'xy'); xlim([freqs(1), freqs(end)]); - ylim([1e-7, 1e-2]); + xlim([1e-2, 5e1]); ylim([1e-7, 1e-2]); #+end_src #+begin_src matlab :tangle no :exports results :results file replace @@ -820,8 +922,10 @@ The obtained transmissibility in Open-loop, for the centralized control as well * Stewart Platform - Simscape Model :PROPERTIES: -:header-args:matlab+: :tangle stewart_platform/simscape_model.m +:header-args:matlab+: :tangle stewart_platform/script.m :END: +<> + ** Introduction :ignore: In this analysis, we wish to applied SVD control to the Stewart Platform shown in Figure [[fig:SP_assembly]]. @@ -835,13 +939,13 @@ Some notes about the system: #+caption: Stewart Platform CAD View [[file:figs/SP_assembly.png]] -The analysis of the SVD control applied to the Stewart platform is performed in the following sections: +The analysis of the SVD/Jacobian control applied to the Stewart platform is performed in the following sections: - Section [[sec:stewart_simscape]]: The parameters of the Simscape model of the Stewart platform are defined - Section [[sec:stewart_identification]]: The plant is identified from the Simscape model and the system coupling is shown - Section [[sec:stewart_jacobian_decoupling]]: The plant is first decoupled using the Jacobian -- Section [[sec:stewart_real_approx]]: A real approximation of the plant is computed for further decoupling using the Singular Value Decomposition (SVD) -- Section [[sec:stewart_svd_decoupling]]: The decoupling is performed thanks to the SVD -- Section [[sec:comp_decoupling]]: The effectiveness of the decoupling with the Jacobian and SVD are compared using the Gershorin Radii +- Section [[sec:stewart_svd_decoupling]]: The decoupling is performed thanks to the SVD. To do so a real approximation of the plant is computed. +- Section [[sec:stewart_gershorin_radii]]: The effectiveness of the decoupling with the Jacobian and SVD are compared using the Gershorin Radii +- Section [[sec:stewart_rga]]: - Section [[sec:stewart_decoupled_plant]]: The dynamics of the decoupled plants are shown - Section [[sec:stewart_diagonal_control]]: A diagonal controller is defined to control the decoupled plant - Section [[sec:stewart_closed_loop_results]]: Finally, the closed loop system properties are studied @@ -1047,7 +1151,7 @@ One can easily see that the system is strongly coupled. #+RESULTS: [[file:figs/stewart_platform_coupled_plant.png]] -** Physical Decoupling using the Jacobian +** Decoupling using the Jacobian <> Consider the control architecture shown in Figure [[fig:plant_decouple_jacobian]]. The Jacobian matrix is used to transform forces/torques applied on the top platform to the equivalent forces applied by each actuator. @@ -1099,8 +1203,10 @@ $G_x(s)$ correspond to the transfer function from forces and torques applied to Gx.InputName = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'}; #+end_src -** Real Approximation of $G$ at the decoupling frequency -<> +** Decoupling using the SVD +<> + +In order to decouple the plant using the SVD, first a real approximation of the plant transfer function matrix as the crossover frequency is required. Let's compute a real approximation of the complex matrix $H_1$ which corresponds to the the transfer function $G_u(j\omega_c)$ from forces applied by the actuators to the measured acceleration of the top platform evaluated at the frequency $\omega_c$. #+begin_src matlab @@ -1146,10 +1252,7 @@ This can be verified below where only the real value of $G_u(\omega_c)$ is shown | -162.0 | -237.0 | -237.0 | -162.0 | 398.9 | 398.9 | | 220.6 | -220.6 | 220.6 | -220.6 | 220.6 | -220.6 | -** SVD Decoupling -<> - -First, the Singular Value Decomposition of $H_1$ is performed: +Now, the Singular Value Decomposition of $H_1$ is performed: \[ H_1 = U \Sigma V^H \] #+begin_src matlab @@ -1217,7 +1320,7 @@ The decoupled plant is then: #+end_src ** Verification of the decoupling using the "Gershgorin Radii" -<> +<> The "Gershgorin Radii" is computed for the coupled plant $G(s)$, for the "Jacobian plant" $G_x(s)$ and the "SVD Decoupled Plant" $G_{SVD}(s)$: @@ -1279,6 +1382,8 @@ This is computed over the following frequencies. [[file:figs/simscape_model_gershgorin_radii.png]] ** Verification of the decoupling using the "Relative Gain Array" +<> + The relative gain array (RGA) is defined as: \begin{equation} \Lambda\big(G(s)\big) = G(s) \times \big( G(s)^{-1} \big)^T @@ -1713,156 +1818,3 @@ The obtained transmissibility in Open-loop, for the centralized control as well #+RESULTS: [[file:figs/stewart_platform_simscape_cl_transmissibility.png]] -** Small error on the sensor location :no_export: -Let's now consider a small position error of the sensor: -#+begin_src matlab - sens_pos_error = [105 5 -1]*1e-3; % [m] -#+end_src - -The system is identified again: -#+begin_src matlab :exports none - %% Name of the Simulink File - mdl = 'drone_platform'; - - %% Input/Output definition - clear io; io_i = 1; - io(io_i) = linio([mdl, '/Dw'], 1, 'openinput'); io_i = io_i + 1; % Ground Motion - io(io_i) = linio([mdl, '/V-T'], 1, 'openinput'); io_i = io_i + 1; % Actuator Forces - io(io_i) = linio([mdl, '/Inertial Sensor'], 1, 'openoutput'); io_i = io_i + 1; % Top platform acceleration - - G = linearize(mdl, io); - G.InputName = {'Dwx', 'Dwy', 'Dwz', 'Rwx', 'Rwy', 'Rwz', ... - 'F1', 'F2', 'F3', 'F4', 'F5', 'F6'}; - G.OutputName = {'Ax', 'Ay', 'Az', 'Arx', 'Ary', 'Arz'}; - - % Plant - Gu = G(:, {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'}); - % Disturbance dynamics - Gd = G(:, {'Dwx', 'Dwy', 'Dwz', 'Rwx', 'Rwy', 'Rwz'}); -#+end_src - -#+begin_src matlab - Gx = Gu*inv(J'); - Gx.InputName = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'}; -#+end_src - -#+begin_src matlab - Gsvd = inv(U)*Gu*inv(V'); -#+end_src - -#+begin_src matlab :exports none - % Gershgorin Radii for the coupled plant: - Gr_coupled = zeros(length(freqs), size(Gu,2)); - H = abs(squeeze(freqresp(Gu, freqs, 'Hz'))); - for out_i = 1:size(Gu,2) - Gr_coupled(:, out_i) = squeeze((sum(H(out_i,:,:)) - H(out_i,out_i,:))./H(out_i, out_i, :)); - end - - % Gershgorin Radii for the decoupled plant using SVD: - Gr_decoupled = zeros(length(freqs), size(Gsvd,2)); - H = abs(squeeze(freqresp(Gsvd, freqs, 'Hz'))); - for out_i = 1:size(Gsvd,2) - Gr_decoupled(:, out_i) = squeeze((sum(H(out_i,:,:)) - H(out_i,out_i,:))./H(out_i, out_i, :)); - end - - % Gershgorin Radii for the decoupled plant using the Jacobian: - Gr_jacobian = zeros(length(freqs), size(Gx,2)); - H = abs(squeeze(freqresp(Gx, freqs, 'Hz'))); - for out_i = 1:size(Gx,2) - Gr_jacobian(:, out_i) = squeeze((sum(H(out_i,:,:)) - H(out_i,out_i,:))./H(out_i, out_i, :)); - end -#+end_src - -#+begin_src matlab :exports results - figure; - hold on; - plot(freqs, Gr_coupled(:,1), 'DisplayName', 'Coupled'); - plot(freqs, Gr_decoupled(:,1), 'DisplayName', 'SVD'); - plot(freqs, Gr_jacobian(:,1), 'DisplayName', 'Jacobian'); - for in_i = 2:6 - set(gca,'ColorOrderIndex',1) - plot(freqs, Gr_coupled(:,in_i), 'HandleVisibility', 'off'); - set(gca,'ColorOrderIndex',2) - plot(freqs, Gr_decoupled(:,in_i), 'HandleVisibility', 'off'); - set(gca,'ColorOrderIndex',3) - plot(freqs, Gr_jacobian(:,in_i), 'HandleVisibility', 'off'); - end - set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); - hold off; - xlabel('Frequency (Hz)'); ylabel('Gershgorin Radii') - legend('location', 'northwest'); - ylim([1e-3, 1e3]); -#+end_src - -#+begin_src matlab - L_cen = K_cen*Gx; - G_cen = feedback(G, pinv(J')*K_cen, [7:12], [1:6]); -#+end_src - -#+begin_src matlab - L_svd = K_svd*Gsvd; - G_svd = feedback(G, inv(V')*K_svd*inv(U), [7:12], [1:6]); -#+end_src - -#+begin_src matlab :results output replace text - isstable(G_cen) -#+end_src - -#+begin_src matlab :results output replace text - isstable(G_svd) -#+end_src - -#+begin_src matlab :exports results - figure; - tiledlayout(2, 2, 'TileSpacing', 'None', 'Padding', 'None'); - - ax1 = nexttile; - hold on; - plot(freqs, abs(squeeze(freqresp(G( 'Ax', 'Dwx')/s^2, freqs, 'Hz'))), 'DisplayName', 'Open-Loop'); - plot(freqs, abs(squeeze(freqresp(G_cen('Ax', 'Dwx')/s^2, freqs, 'Hz'))), 'DisplayName', 'Centralized'); - plot(freqs, abs(squeeze(freqresp(G_svd('Ax', 'Dwx')/s^2, freqs, 'Hz'))), '--', 'DisplayName', 'SVD'); - set(gca,'ColorOrderIndex',1) - plot(freqs, abs(squeeze(freqresp(G( 'Ay', 'Dwy')/s^2, freqs, 'Hz'))), 'HandleVisibility', 'off'); - plot(freqs, abs(squeeze(freqresp(G_cen('Ay', 'Dwy')/s^2, freqs, 'Hz'))), 'HandleVisibility', 'off'); - plot(freqs, abs(squeeze(freqresp(G_svd('Ay', 'Dwy')/s^2, freqs, 'Hz'))), '--', 'HandleVisibility', 'off'); - hold off; - set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); - ylabel('$D_x/D_{w,x}$, $D_y/D_{w, y}$'); set(gca, 'XTickLabel',[]); - legend('location', 'southwest'); - - ax2 = nexttile; - hold on; - plot(freqs, abs(squeeze(freqresp(G( 'Az', 'Dwz')/s^2, freqs, 'Hz')))); - plot(freqs, abs(squeeze(freqresp(G_cen('Az', 'Dwz')/s^2, freqs, 'Hz')))); - plot(freqs, abs(squeeze(freqresp(G_svd('Az', 'Dwz')/s^2, freqs, 'Hz'))), '--'); - hold off; - set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); - ylabel('$D_z/D_{w,z}$'); set(gca, 'XTickLabel',[]); - - ax3 = nexttile; - hold on; - plot(freqs, abs(squeeze(freqresp(G( 'Arx', 'Rwx')/s^2, freqs, 'Hz')))); - plot(freqs, abs(squeeze(freqresp(G_cen('Arx', 'Rwx')/s^2, freqs, 'Hz')))); - plot(freqs, abs(squeeze(freqresp(G_svd('Arx', 'Rwx')/s^2, freqs, 'Hz'))), '--'); - set(gca,'ColorOrderIndex',1) - plot(freqs, abs(squeeze(freqresp(G( 'Ary', 'Rwy')/s^2, freqs, 'Hz')))); - plot(freqs, abs(squeeze(freqresp(G_cen('Ary', 'Rwy')/s^2, freqs, 'Hz')))); - plot(freqs, abs(squeeze(freqresp(G_svd('Ary', 'Rwy')/s^2, freqs, 'Hz'))), '--'); - hold off; - set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); - ylabel('$R_x/R_{w,x}$, $R_y/R_{w,y}$'); xlabel('Frequency [Hz]'); - - ax4 = nexttile; - hold on; - plot(freqs, abs(squeeze(freqresp(G( 'Arz', 'Rwz')/s^2, freqs, 'Hz')))); - plot(freqs, abs(squeeze(freqresp(G_cen('Arz', 'Rwz')/s^2, freqs, 'Hz')))); - plot(freqs, abs(squeeze(freqresp(G_svd('Arz', 'Rwz')/s^2, freqs, 'Hz'))), '--'); - hold off; - set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); - ylabel('$R_z/R_{w,z}$'); xlabel('Frequency [Hz]'); - - linkaxes([ax1,ax2,ax3,ax4],'xy'); - xlim([freqs(1), freqs(end)]); - ylim([1e-3, 1e2]); -#+end_src - diff --git a/stewart_platform/analytical_model.m b/stewart_platform/analytical_model.m deleted file mode 100644 index e1139f5..0000000 --- a/stewart_platform/analytical_model.m +++ /dev/null @@ -1,196 +0,0 @@ -%% Clear Workspace and Close figures -clear; close all; clc; - -%% Intialize Laplace variable -s = zpk('s'); - -%% Bode plot options -opts = bodeoptions('cstprefs'); -opts.FreqUnits = 'Hz'; -opts.MagUnits = 'abs'; -opts.MagScale = 'log'; -opts.PhaseWrapping = 'on'; -opts.xlim = [1 1000]; - -% Characteristics - -L = 0.055; % Leg length [m] -Zc = 0; % ? -m = 0.2; % Top platform mass [m] -k = 1e3; % Total vertical stiffness [N/m] -c = 2*0.1*sqrt(k*m); % Damping ? [N/(m/s)] - -Rx = 0.04; % ? -Rz = 0.04; % ? -Ix = m*Rx^2; % ? -Iy = m*Rx^2; % ? -Iz = m*Rz^2; % ? - -% Mass Matrix - -M = m*[1 0 0 0 Zc 0; - 0 1 0 -Zc 0 0; - 0 0 1 0 0 0; - 0 -Zc 0 Rx^2+Zc^2 0 0; - Zc 0 0 0 Rx^2+Zc^2 0; - 0 0 0 0 0 Rz^2]; - -% Jacobian Matrix - -Bj=1/sqrt(6)*[ 1 1 -2 1 1 -2; - sqrt(3) -sqrt(3) 0 sqrt(3) -sqrt(3) 0; - sqrt(2) sqrt(2) sqrt(2) sqrt(2) sqrt(2) sqrt(2); - 0 0 L L -L -L; - -L*2/sqrt(3) -L*2/sqrt(3) L/sqrt(3) L/sqrt(3) L/sqrt(3) L/sqrt(3); - L*sqrt(2) -L*sqrt(2) L*sqrt(2) -L*sqrt(2) L*sqrt(2) -L*sqrt(2)]; - -% Stifnness and Damping matrices - -kv = k/3; % Vertical Stiffness of the springs [N/m] -kh = 0.5*k/3; % Horizontal Stiffness of the springs [N/m] - -K = diag([3*kh, 3*kh, 3*kv, 3*kv*Rx^2/2, 3*kv*Rx^2/2, 3*kh*Rx^2]); % Stiffness Matrix -C = c*K/100000; % Damping Matrix - -% State Space System - -A = [ zeros(6) eye(6); ... - -M\K -M\C]; -Bw = [zeros(6); -eye(6)]; -Bu = [zeros(6); M\Bj]; - -Co = [-M\K -M\C]; - -D = [zeros(6) M\Bj]; - -ST = ss(A,[Bw Bu],Co,D); - - - -% - OUT 1-6: 6 dof -% - IN 1-6 : ground displacement in the directions of the legs -% - IN 7-12: forces in the actuators. - -ST.StateName = {'x';'y';'z';'theta_x';'theta_y';'theta_z';... - 'dx';'dy';'dz';'dtheta_x';'dtheta_y';'dtheta_z'}; - -ST.InputName = {'w1';'w2';'w3';'w4';'w5';'w6';... - 'u1';'u2';'u3';'u4';'u5';'u6'}; - -ST.OutputName = {'ax';'ay';'az';'atheta_x';'atheta_y';'atheta_z'}; - -% Transmissibility - -TR=ST*[eye(6); zeros(6)]; - -figure -subplot(231) -bodemag(TR(1,1)); -subplot(232) -bodemag(TR(2,2)); -subplot(233) -bodemag(TR(3,3)); -subplot(234) -bodemag(TR(4,4)); -subplot(235) -bodemag(TR(5,5)); -subplot(236) -bodemag(TR(6,6)); - -% Real approximation of $G(j\omega)$ at decoupling frequency - -sys1 = ST*[zeros(6); eye(6)]; % take only the forces inputs - -dec_fr = 20; -H1 = evalfr(sys1,j*2*pi*dec_fr); -H2 = H1; -D = pinv(real(H2'*H2)); -H1 = inv(D*real(H2'*diag(exp(j*angle(diag(H2*D*H2.'))/2)))) ; -[U,S,V] = svd(H1); - -wf = logspace(-1,2,1000); -for i = 1:length(wf) - H = abs(evalfr(sys1,j*2*pi*wf(i))); - H_dec = abs(evalfr(U'*sys1*V,j*2*pi*wf(i))); - for j = 1:size(H,2) - g_r1(i,j) = (sum(H(j,:))-H(j,j))/H(j,j); - g_r2(i,j) = (sum(H_dec(j,:))-H_dec(j,j))/H_dec(j,j); - % keyboard - end - g_lim(i) = 0.5; -end - -% Coupled and Decoupled Plant "Gershgorin Radii" - -figure; -title('Coupled plant') -loglog(wf,g_r1(:,1),wf,g_r1(:,2),wf,g_r1(:,3),wf,g_r1(:,4),wf,g_r1(:,5),wf,g_r1(:,6),wf,g_lim,'--'); -legend('$a_x$','$a_y$','$a_z$','$\theta_x$','$\theta_y$','$\theta_z$','Limit'); -xlabel('Frequency (Hz)'); ylabel('Gershgorin Radii') - - - -% #+name: fig:gershorin_raddii_coupled_analytical -% #+caption: Gershorin Raddi for the coupled plant -% #+RESULTS: -% [[file:figs/gershorin_raddii_coupled_analytical.png]] - - -figure; -title('Decoupled plant (10 Hz)') -loglog(wf,g_r2(:,1),wf,g_r2(:,2),wf,g_r2(:,3),wf,g_r2(:,4),wf,g_r2(:,5),wf,g_r2(:,6),wf,g_lim,'--'); -legend('$S_1$','$S_2$','$S_3$','$S_4$','$S_5$','$S_6$','Limit'); -xlabel('Frequency (Hz)'); ylabel('Gershgorin Radii') - -% Decoupled Plant - -figure; -bodemag(U'*sys1*V,opts) - -% Controller - -fc = 2*pi*0.1; % Crossover Frequency [rad/s] -c_gain = 50; % - -cont = eye(6)*c_gain/(s+fc); - -% Closed Loop System - -FEEDIN = [7:12]; % Input of controller -FEEDOUT = [1:6]; % Output of controller - - - -% Centralized Control - -STcen = feedback(ST, inv(Bj)*cont, FEEDIN, FEEDOUT); -TRcen = STcen*[eye(6); zeros(6)]; - - - -% SVD Control - -STsvd = feedback(ST, pinv(V')*cont*pinv(U), FEEDIN, FEEDOUT); -TRsvd = STsvd*[eye(6); zeros(6)]; - -% Results - -figure -subplot(231) -bodemag(TR(1,1),TRcen(1,1),TRsvd(1,1),opts) -legend('OL','Centralized','SVD') -subplot(232) -bodemag(TR(2,2),TRcen(2,2),TRsvd(2,2),opts) -legend('OL','Centralized','SVD') -subplot(233) -bodemag(TR(3,3),TRcen(3,3),TRsvd(3,3),opts) -legend('OL','Centralized','SVD') -subplot(234) -bodemag(TR(4,4),TRcen(4,4),TRsvd(4,4),opts) -legend('OL','Centralized','SVD') -subplot(235) -bodemag(TR(5,5),TRcen(5,5),TRsvd(5,5),opts) -legend('OL','Centralized','SVD') -subplot(236) -bodemag(TR(6,6),TRcen(6,6),TRsvd(6,6),opts) -legend('OL','Centralized','SVD') diff --git a/stewart_platform/drone_platform.slx b/stewart_platform/drone_platform.slx index 46fcbe2..5808106 100644 Binary files a/stewart_platform/drone_platform.slx and b/stewart_platform/drone_platform.slx differ diff --git a/stewart_platform/drone_platform_DataFile.m b/stewart_platform/drone_platform_DataFile.m deleted file mode 100644 index 766d70c..0000000 --- a/stewart_platform/drone_platform_DataFile.m +++ /dev/null @@ -1,156 +0,0 @@ -% Simscape(TM) Multibody(TM) version: 5.1 - -% This is a model data file derived from a Simscape Multibody Import XML file using the smimport function. -% The data in this file sets the block parameter values in an imported Simscape Multibody model. -% For more information on this file, see the smimport function help page in the Simscape Multibody documentation. -% You can modify numerical values, but avoid any other changes to this file. -% Do not add code to this file. Do not edit the physical units shown in comments. - -%%%VariableName:smiData - - -%============= RigidTransform =============% - -%Initialize the RigidTransform structure array by filling in null values. -smiData.RigidTransform(12).translation = [0.0 0.0 0.0]; -smiData.RigidTransform(12).angle = 0.0; -smiData.RigidTransform(12).axis = [0.0 0.0 0.0]; -smiData.RigidTransform(12).ID = ''; - -%Translation Method - Cartesian -%Rotation Method - Arbitrary Axis -smiData.RigidTransform(1).translation = [17.500000000021 30.310889132419 5.1574606296500001]; % mm -smiData.RigidTransform(1).angle = 0.093902078374528131; % rad -smiData.RigidTransform(1).axis = [0 0 1]; -smiData.RigidTransform(1).ID = 'AssemblyGround[Drone_Stewart_Platform_V8 voice-coil.CATProduct-1:Spring cylinder.CATPart-1]'; - -%Translation Method - Cartesian -%Rotation Method - Arbitrary Axis -smiData.RigidTransform(2).translation = [0 0 0]; % mm -smiData.RigidTransform(2).angle = 0; % rad -smiData.RigidTransform(2).axis = [0 0 0]; -smiData.RigidTransform(2).ID = 'AssemblyGround[Drone_Stewart_Platform_V8 voice-coil.CATProduct-1:Upper_Stewart_Platform_V8.CATPart-1]'; - -%Translation Method - Cartesian -%Rotation Method - Arbitrary Axis -smiData.RigidTransform(3).translation = [17.500000000021 -30.310889132492001 5.1574606296500001]; % mm -smiData.RigidTransform(3).angle = 0.093902078374528131; % rad -smiData.RigidTransform(3).axis = [0 0 1]; -smiData.RigidTransform(3).ID = 'AssemblyGround[Drone_Stewart_Platform_V8 voice-coil.CATProduct-1:Spring cylinder.CATPart-3]'; - -%Translation Method - Cartesian -%Rotation Method - Arbitrary Axis -smiData.RigidTransform(4).translation = [9.6240451994409995 -30.811470883506999 19.383957937758002]; % mm -smiData.RigidTransform(4).angle = 3.1415926535897931; % rad -smiData.RigidTransform(4).axis = [0.88807383397699313 6.3170900042374556e-16 -0.45970084338121897]; -smiData.RigidTransform(4).ID = 'AssemblyGround[Drone_Stewart_Platform_V8 voice-coil.CATProduct-1:Voice-coil.CATPart-1]'; - -%Translation Method - Cartesian -%Rotation Method - Arbitrary Axis -smiData.RigidTransform(5).translation = [21.871493913361999 -23.740403071639001 19.383957937758002]; % mm -smiData.RigidTransform(5).angle = 2.6777446800421498; % rad -smiData.RigidTransform(5).axis = [-0.79025275363749503 -0.45625264004045041 -0.40906492617245471]; -smiData.RigidTransform(5).ID = 'AssemblyGround[Drone_Stewart_Platform_V8 voice-coil.CATProduct-1:Voice-coil.CATPart-2]'; - -%Translation Method - Cartesian -%Rotation Method - Arbitrary Axis -smiData.RigidTransform(6).translation = [21.871493913361 23.740403071566 19.383957937758002]; % mm -smiData.RigidTransform(6).angle = 2.3226757410894345; % rad -smiData.RigidTransform(6).axis = [0.4840501729431676 0.83839949295006799 -0.25056280708588496]; -smiData.RigidTransform(6).ID = 'AssemblyGround[Drone_Stewart_Platform_V8 voice-coil.CATProduct-1:Voice-coil.CATPart-3]'; - -%Translation Method - Cartesian -%Rotation Method - Arbitrary Axis -smiData.RigidTransform(7).translation = [9.6240451994409995 30.811470883434001 19.383957937758002]; % mm -smiData.RigidTransform(7).angle = 2.1862760354647519; % rad -smiData.RigidTransform(7).axis = [5.6189562004407762e-16 -1 -1.3924588923326856e-16]; -smiData.RigidTransform(7).ID = 'AssemblyGround[Drone_Stewart_Platform_V8 voice-coil.CATProduct-1:Voice-coil.CATPart-4]'; - -%Translation Method - Cartesian -%Rotation Method - Arbitrary Axis -smiData.RigidTransform(8).translation = [-31.495539112739003 7.0710678118320001 19.383957937758002]; % mm -smiData.RigidTransform(8).angle = 2.3226757410894345; % rad -smiData.RigidTransform(8).axis = [-0.48405017294316754 0.83839949295006766 0.25056280708588635]; -smiData.RigidTransform(8).ID = 'AssemblyGround[Drone_Stewart_Platform_V8 voice-coil.CATProduct-1:Voice-coil.CATPart-5]'; - -%Translation Method - Cartesian -%Rotation Method - Arbitrary Axis -smiData.RigidTransform(9).translation = [-31.495539112739003 -7.0710678119050003 19.383957937758002]; % mm -smiData.RigidTransform(9).angle = 2.6777446800421507; % rad -smiData.RigidTransform(9).axis = [0.79025275363749525 -0.45625264004045002 0.40906492617245482]; -smiData.RigidTransform(9).ID = 'AssemblyGround[Drone_Stewart_Platform_V8 voice-coil.CATProduct-1:Voice-coil.CATPart-6]'; - -%Translation Method - Cartesian -%Rotation Method - Arbitrary Axis -smiData.RigidTransform(10).translation = [0 0 0]; % mm -smiData.RigidTransform(10).angle = 0; % rad -smiData.RigidTransform(10).axis = [0 0 0]; -smiData.RigidTransform(10).ID = 'AssemblyGround[Drone_Stewart_Platform_V8 voice-coil.CATProduct-1:Bottom_Stewart_Platform_V8.CATPart-1]'; - -%Translation Method - Cartesian -%Rotation Method - Arbitrary Axis -smiData.RigidTransform(11).translation = [-34.999999999978996 -3.7000000000000001e-11 5.1574606296500001]; % mm -smiData.RigidTransform(11).angle = 0.093902078374528131; % rad -smiData.RigidTransform(11).axis = [0 0 1]; -smiData.RigidTransform(11).ID = 'AssemblyGround[Drone_Stewart_Platform_V8 voice-coil.CATProduct-1:Spring cylinder.CATPart-2]'; - -%Translation Method - Cartesian -%Rotation Method - Arbitrary Axis -smiData.RigidTransform(12).translation = [0 0 0]; % mm -smiData.RigidTransform(12).angle = 0; % rad -smiData.RigidTransform(12).axis = [0 0 0]; -smiData.RigidTransform(12).ID = 'RootGround[Drone_Stewart_Platform_V8 voice-coil.CATProduct-1]'; - - -%============= Solid =============% -%Center of Mass (CoM) %Moments of Inertia (MoI) %Product of Inertia (PoI) - -%Initialize the Solid structure array by filling in null values. -smiData.Solid(4).mass = 0.0; -smiData.Solid(4).CoM = [0.0 0.0 0.0]; -smiData.Solid(4).MoI = [0.0 0.0 0.0]; -smiData.Solid(4).PoI = [0.0 0.0 0.0]; -smiData.Solid(4).color = [0.0 0.0 0.0]; -smiData.Solid(4).opacity = 0.0; -smiData.Solid(4).ID = ''; - -%Inertia Type - Custom -%Visual Properties - Simple -smiData.Solid(1).mass = 0.002953024625510399; % kg -smiData.Solid(1).CoM = [0.00019528918640542437 -0.0030390869707000701 3.4103846069334764]; % mm -smiData.Solid(1).MoI = [0.094245235034989605 0.095111221695610218 0.060564976663331278]; % kg*mm^2 -smiData.Solid(1).PoI = [9.2822238167834426e-07 0.0015998098386190715 -2.9934446424201115e-05]; % kg*mm^2 -smiData.Solid(1).color = [0.82352941176470584 0.82352941176470584 1]; -smiData.Solid(1).opacity = 1; -smiData.Solid(1).ID = 'Spring cylinder.CATPart*:*Default'; - -%Inertia Type - Custom -%Visual Properties - Simple -smiData.Solid(2).mass = 0.200; % kg -smiData.Solid(2).CoM = [0 0 22.029956321592298]; % mm -smiData.Solid(2).MoI = [10.958807269683136 10.958651478878741 21.418645161274547]; % kg*mm^2 -smiData.Solid(2).PoI = [-2.7272640778847972e-06 2.0116845742236026e-06 2.0925824216820959e-06]; % kg*mm^2 -smiData.Solid(2).color = [0 1 1]; -smiData.Solid(2).opacity = 1; -smiData.Solid(2).ID = 'Upper_Stewart_Platform_V8.CATPart*:*Default'; - -%Inertia Type - Custom -%Visual Properties - Simple -smiData.Solid(3).mass = 0.00072851613140055473; % kg -smiData.Solid(3).CoM = [1.6672752107505068e-07 0.049264195897497115 6.8426699166844651]; % mm -smiData.Solid(3).MoI = [0.023642069482559629 0.023409631588225184 0.0076150552208997047]; % kg*mm^2 -smiData.Solid(3).PoI = [0.00019174011014260877 5.6635742238393906e-10 -6.4605353421422721e-10]; % kg*mm^2 -smiData.Solid(3).color = [0.82352941176470584 0.82352941176470584 1]; -smiData.Solid(3).opacity = 1; -smiData.Solid(3).ID = 'Voice-coil.CATPart*:*Default'; - -%Inertia Type - Custom -%Visual Properties - Simple -smiData.Solid(4).mass = 0.036808422349281396; % kg -smiData.Solid(4).CoM = [1.5151381609408909e-08 -2.5842738425576439e-08 3.8488764942888207]; % mm -smiData.Solid(4).MoI = [16.573140175725058 16.573140156158694 32.475141872846649]; % kg*mm^2 -smiData.Solid(4).PoI = [4.9976421207227284e-09 -2.8421200098863714e-09 -1.3395036264003659e-08]; % kg*mm^2 -smiData.Solid(4).color = [1 1 0]; -smiData.Solid(4).opacity = 1; -smiData.Solid(4).ID = 'Bottom_Stewart_Platform_V8.CATPart*:*Default'; - diff --git a/stewart_platform/drone_platform_DataFile1.m b/stewart_platform/drone_platform_DataFile1.m deleted file mode 100644 index 75cbd76..0000000 --- a/stewart_platform/drone_platform_DataFile1.m +++ /dev/null @@ -1,156 +0,0 @@ -% Simscape(TM) Multibody(TM) version: 5.1 - -% This is a model data file derived from a Simscape Multibody Import XML file using the smimport function. -% The data in this file sets the block parameter values in an imported Simscape Multibody model. -% For more information on this file, see the smimport function help page in the Simscape Multibody documentation. -% You can modify numerical values, but avoid any other changes to this file. -% Do not add code to this file. Do not edit the physical units shown in comments. - -%%%VariableName:smiData - - -%============= RigidTransform =============% - -%Initialize the RigidTransform structure array by filling in null values. -smiData.RigidTransform(12).translation = [0.0 0.0 0.0]; -smiData.RigidTransform(12).angle = 0.0; -smiData.RigidTransform(12).axis = [0.0 0.0 0.0]; -smiData.RigidTransform(12).ID = ''; - -%Translation Method - Cartesian -%Rotation Method - Arbitrary Axis -smiData.RigidTransform(1).translation = [17.500000000021 30.310889132419 5.1574606296500001]; % mm -smiData.RigidTransform(1).angle = 0.093902078374528131; % rad -smiData.RigidTransform(1).axis = [0 0 1]; -smiData.RigidTransform(1).ID = 'AssemblyGround[Drone_Stewart_Platform_V8 voice-coil.CATProduct-1:Spring cylinder.CATPart-1]'; - -%Translation Method - Cartesian -%Rotation Method - Arbitrary Axis -smiData.RigidTransform(2).translation = [0 0 0]; % mm -smiData.RigidTransform(2).angle = 0; % rad -smiData.RigidTransform(2).axis = [0 0 0]; -smiData.RigidTransform(2).ID = 'AssemblyGround[Drone_Stewart_Platform_V8 voice-coil.CATProduct-1:Upper_Stewart_Platform_V8.CATPart-1]'; - -%Translation Method - Cartesian -%Rotation Method - Arbitrary Axis -smiData.RigidTransform(3).translation = [17.500000000021 -30.310889132492001 5.1574606296500001]; % mm -smiData.RigidTransform(3).angle = 0.093902078374528131; % rad -smiData.RigidTransform(3).axis = [0 0 1]; -smiData.RigidTransform(3).ID = 'AssemblyGround[Drone_Stewart_Platform_V8 voice-coil.CATProduct-1:Spring cylinder.CATPart-3]'; - -%Translation Method - Cartesian -%Rotation Method - Arbitrary Axis -smiData.RigidTransform(4).translation = [9.6240451994409995 -30.811470883506999 19.383957937758002]; % mm -smiData.RigidTransform(4).angle = 3.1415926535897931; % rad -smiData.RigidTransform(4).axis = [0.88807383397699313 6.3170900042374556e-16 -0.45970084338121897]; -smiData.RigidTransform(4).ID = 'AssemblyGround[Drone_Stewart_Platform_V8 voice-coil.CATProduct-1:Voice-coil.CATPart-1]'; - -%Translation Method - Cartesian -%Rotation Method - Arbitrary Axis -smiData.RigidTransform(5).translation = [21.871493913361999 -23.740403071639001 19.383957937758002]; % mm -smiData.RigidTransform(5).angle = 2.6777446800421498; % rad -smiData.RigidTransform(5).axis = [-0.79025275363749503 -0.45625264004045041 -0.40906492617245471]; -smiData.RigidTransform(5).ID = 'AssemblyGround[Drone_Stewart_Platform_V8 voice-coil.CATProduct-1:Voice-coil.CATPart-2]'; - -%Translation Method - Cartesian -%Rotation Method - Arbitrary Axis -smiData.RigidTransform(6).translation = [21.871493913361 23.740403071566 19.383957937758002]; % mm -smiData.RigidTransform(6).angle = 2.3226757410894345; % rad -smiData.RigidTransform(6).axis = [0.4840501729431676 0.83839949295006799 -0.25056280708588496]; -smiData.RigidTransform(6).ID = 'AssemblyGround[Drone_Stewart_Platform_V8 voice-coil.CATProduct-1:Voice-coil.CATPart-3]'; - -%Translation Method - Cartesian -%Rotation Method - Arbitrary Axis -smiData.RigidTransform(7).translation = [9.6240451994409995 30.811470883434001 19.383957937758002]; % mm -smiData.RigidTransform(7).angle = 2.1862760354647519; % rad -smiData.RigidTransform(7).axis = [5.6189562004407762e-16 -1 -1.3924588923326856e-16]; -smiData.RigidTransform(7).ID = 'AssemblyGround[Drone_Stewart_Platform_V8 voice-coil.CATProduct-1:Voice-coil.CATPart-4]'; - -%Translation Method - Cartesian -%Rotation Method - Arbitrary Axis -smiData.RigidTransform(8).translation = [-31.495539112739003 7.0710678118320001 19.383957937758002]; % mm -smiData.RigidTransform(8).angle = 2.3226757410894345; % rad -smiData.RigidTransform(8).axis = [-0.48405017294316754 0.83839949295006766 0.25056280708588635]; -smiData.RigidTransform(8).ID = 'AssemblyGround[Drone_Stewart_Platform_V8 voice-coil.CATProduct-1:Voice-coil.CATPart-5]'; - -%Translation Method - Cartesian -%Rotation Method - Arbitrary Axis -smiData.RigidTransform(9).translation = [-31.495539112739003 -7.0710678119050003 19.383957937758002]; % mm -smiData.RigidTransform(9).angle = 2.6777446800421507; % rad -smiData.RigidTransform(9).axis = [0.79025275363749525 -0.45625264004045002 0.40906492617245482]; -smiData.RigidTransform(9).ID = 'AssemblyGround[Drone_Stewart_Platform_V8 voice-coil.CATProduct-1:Voice-coil.CATPart-6]'; - -%Translation Method - Cartesian -%Rotation Method - Arbitrary Axis -smiData.RigidTransform(10).translation = [0 0 0]; % mm -smiData.RigidTransform(10).angle = 0; % rad -smiData.RigidTransform(10).axis = [0 0 0]; -smiData.RigidTransform(10).ID = 'AssemblyGround[Drone_Stewart_Platform_V8 voice-coil.CATProduct-1:Bottom_Stewart_Platform_V8.CATPart-1]'; - -%Translation Method - Cartesian -%Rotation Method - Arbitrary Axis -smiData.RigidTransform(11).translation = [-34.999999999978996 -3.7000000000000001e-11 5.1574606296500001]; % mm -smiData.RigidTransform(11).angle = 0.093902078374528131; % rad -smiData.RigidTransform(11).axis = [0 0 1]; -smiData.RigidTransform(11).ID = 'AssemblyGround[Drone_Stewart_Platform_V8 voice-coil.CATProduct-1:Spring cylinder.CATPart-2]'; - -%Translation Method - Cartesian -%Rotation Method - Arbitrary Axis -smiData.RigidTransform(12).translation = [0 0 0]; % mm -smiData.RigidTransform(12).angle = 0; % rad -smiData.RigidTransform(12).axis = [0 0 0]; -smiData.RigidTransform(12).ID = 'RootGround[Drone_Stewart_Platform_V8 voice-coil.CATProduct-1]'; - - -%============= Solid =============% -%Center of Mass (CoM) %Moments of Inertia (MoI) %Product of Inertia (PoI) - -%Initialize the Solid structure array by filling in null values. -smiData.Solid(4).mass = 0.0; -smiData.Solid(4).CoM = [0.0 0.0 0.0]; -smiData.Solid(4).MoI = [0.0 0.0 0.0]; -smiData.Solid(4).PoI = [0.0 0.0 0.0]; -smiData.Solid(4).color = [0.0 0.0 0.0]; -smiData.Solid(4).opacity = 0.0; -smiData.Solid(4).ID = ''; - -%Inertia Type - Custom -%Visual Properties - Simple -smiData.Solid(1).mass = 0.002953024625510399; % kg -smiData.Solid(1).CoM = [0.00019528918640542437 -0.0030390869707000701 3.4103846069334764]; % mm -smiData.Solid(1).MoI = [0.094245235034989605 0.095111221695610218 0.060564976663331278]; % kg*mm^2 -smiData.Solid(1).PoI = [9.2822238167834426e-07 0.0015998098386190715 -2.9934446424201115e-05]; % kg*mm^2 -smiData.Solid(1).color = [0.82352941176470584 0.82352941176470584 1]; -smiData.Solid(1).opacity = 1; -smiData.Solid(1).ID = 'Spring cylinder.CATPart*:*Default'; - -%Inertia Type - Custom -%Visual Properties - Simple -smiData.Solid(2).mass = 0.032807859410420866; % kg -smiData.Solid(2).CoM = [4.3204111866222267e-05 6.4929928363256894e-06 22.029956321592298]; % mm -smiData.Solid(2).MoI = [10.958807269683136 10.958651478878741 21.418645161274547]; % kg*mm^2 -smiData.Solid(2).PoI = [-2.7272640778847972e-06 2.0116845742236026e-06 2.0925824216820959e-06]; % kg*mm^2 -smiData.Solid(2).color = [0 1 1]; -smiData.Solid(2).opacity = 1; -smiData.Solid(2).ID = 'Upper_Stewart_Platform_V8.CATPart*:*Default'; - -%Inertia Type - Custom -%Visual Properties - Simple -smiData.Solid(3).mass = 0.00072851613140055473; % kg -smiData.Solid(3).CoM = [1.6672752107505068e-07 0.049264195897497115 6.8426699166844651]; % mm -smiData.Solid(3).MoI = [0.023642069482559629 0.023409631588225184 0.0076150552208997047]; % kg*mm^2 -smiData.Solid(3).PoI = [0.00019174011014260877 5.6635742238393906e-10 -6.4605353421422721e-10]; % kg*mm^2 -smiData.Solid(3).color = [0.82352941176470584 0.82352941176470584 1]; -smiData.Solid(3).opacity = 1; -smiData.Solid(3).ID = 'Voice-coil.CATPart*:*Default'; - -%Inertia Type - Custom -%Visual Properties - Simple -smiData.Solid(4).mass = 0.036808422349281396; % kg -smiData.Solid(4).CoM = [1.5151381609408909e-08 -2.5842738425576439e-08 3.8488764942888207]; % mm -smiData.Solid(4).MoI = [16.573140175725058 16.573140156158694 32.475141872846649]; % kg*mm^2 -smiData.Solid(4).PoI = [4.9976421207227284e-09 -2.8421200098863714e-09 -1.3395036264003659e-08]; % kg*mm^2 -smiData.Solid(4).color = [1 1 0]; -smiData.Solid(4).opacity = 1; -smiData.Solid(4).ID = 'Bottom_Stewart_Platform_V8.CATPart*:*Default'; - diff --git a/stewart_platform/drone_platform_R2017b.slx b/stewart_platform/drone_platform_R2017b.slx deleted file mode 100644 index f509555..0000000 Binary files a/stewart_platform/drone_platform_R2017b.slx and /dev/null differ diff --git a/stewart_platform/drone_platform_jacobian.slx b/stewart_platform/drone_platform_jacobian.slx index 541c141..53cf898 100644 Binary files a/stewart_platform/drone_platform_jacobian.slx and b/stewart_platform/drone_platform_jacobian.slx differ diff --git a/stewart_platform/simscape_model.m b/stewart_platform/script.m similarity index 76% rename from stewart_platform/simscape_model.m rename to stewart_platform/script.m index 9abdc03..90a8603 100644 --- a/stewart_platform/simscape_model.m +++ b/stewart_platform/script.m @@ -132,8 +132,10 @@ legend('location', 'northwest'); Gx = Gu*inv(J'); Gx.InputName = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'}; -% Real Approximation of $G$ at the decoupling frequency -% <> +% Decoupling using the SVD +% <> + +% In order to decouple the plant using the SVD, first a real approximation of the plant transfer function matrix as the crossover frequency is required. % Let's compute a real approximation of the complex matrix $H_1$ which corresponds to the the transfer function $G_u(j\omega_c)$ from forces applied by the actuators to the measured acceleration of the top platform evaluated at the frequency $\omega_c$. @@ -148,10 +150,18 @@ H1 = evalfr(Gu, j*wc); D = pinv(real(H1'*H1)); H1 = inv(D*real(H1'*diag(exp(j*angle(diag(H1*D*H1.'))/2)))); -% SVD Decoupling -% <> -% First, the Singular Value Decomposition of $H_1$ is performed: + +% #+caption: Real part of $G$ at the decoupling frequency $\omega_c$ +% #+RESULTS: +% | 4.4 | -2.1 | -2.1 | 4.4 | -2.4 | -2.4 | +% | -0.2 | -3.9 | 3.9 | 0.2 | -3.8 | 3.8 | +% | 3.4 | 3.4 | 3.4 | 3.4 | 3.4 | 3.4 | +% | -367.1 | -323.8 | 323.8 | 367.1 | 43.3 | -43.3 | +% | -162.0 | -237.0 | -237.0 | -162.0 | 398.9 | 398.9 | +% | 220.6 | -220.6 | 220.6 | -220.6 | 220.6 | -220.6 | + +% Now, the Singular Value Decomposition of $H_1$ is performed: % \[ H_1 = U \Sigma V^H \] @@ -171,7 +181,7 @@ H1 = inv(D*real(H1'*diag(exp(j*angle(diag(H1*D*H1.'))/2)))); Gsvd = inv(U)*Gu*inv(V'); % Verification of the decoupling using the "Gershgorin Radii" -% <> +% <> % The "Gershgorin Radii" is computed for the coupled plant $G(s)$, for the "Jacobian plant" $G_x(s)$ and the "SVD Decoupled Plant" $G_{SVD}(s)$: @@ -221,6 +231,8 @@ legend('location', 'northwest'); ylim([1e-3, 1e3]); % Verification of the decoupling using the "Relative Gain Array" +% <> + % The relative gain array (RGA) is defined as: % \begin{equation} % \Lambda\big(G(s)\big) = G(s) \times \big( G(s)^{-1} \big)^T @@ -502,141 +514,6 @@ isstable(G_svd) % The obtained transmissibility in Open-loop, for the centralized control as well as for the SVD control are shown in Figure [[fig:stewart_platform_simscape_cl_transmissibility]]. -figure; -tiledlayout(2, 2, 'TileSpacing', 'None', 'Padding', 'None'); - -ax1 = nexttile; -hold on; -plot(freqs, abs(squeeze(freqresp(G( 'Ax', 'Dwx')/s^2, freqs, 'Hz'))), 'DisplayName', 'Open-Loop'); -plot(freqs, abs(squeeze(freqresp(G_cen('Ax', 'Dwx')/s^2, freqs, 'Hz'))), 'DisplayName', 'Centralized'); -plot(freqs, abs(squeeze(freqresp(G_svd('Ax', 'Dwx')/s^2, freqs, 'Hz'))), '--', 'DisplayName', 'SVD'); -set(gca,'ColorOrderIndex',1) -plot(freqs, abs(squeeze(freqresp(G( 'Ay', 'Dwy')/s^2, freqs, 'Hz'))), 'HandleVisibility', 'off'); -plot(freqs, abs(squeeze(freqresp(G_cen('Ay', 'Dwy')/s^2, freqs, 'Hz'))), 'HandleVisibility', 'off'); -plot(freqs, abs(squeeze(freqresp(G_svd('Ay', 'Dwy')/s^2, freqs, 'Hz'))), '--', 'HandleVisibility', 'off'); -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -ylabel('$D_x/D_{w,x}$, $D_y/D_{w, y}$'); set(gca, 'XTickLabel',[]); -legend('location', 'southwest'); - -ax2 = nexttile; -hold on; -plot(freqs, abs(squeeze(freqresp(G( 'Az', 'Dwz')/s^2, freqs, 'Hz')))); -plot(freqs, abs(squeeze(freqresp(G_cen('Az', 'Dwz')/s^2, freqs, 'Hz')))); -plot(freqs, abs(squeeze(freqresp(G_svd('Az', 'Dwz')/s^2, freqs, 'Hz'))), '--'); -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -ylabel('$D_z/D_{w,z}$'); set(gca, 'XTickLabel',[]); - -ax3 = nexttile; -hold on; -plot(freqs, abs(squeeze(freqresp(G( 'Arx', 'Rwx')/s^2, freqs, 'Hz')))); -plot(freqs, abs(squeeze(freqresp(G_cen('Arx', 'Rwx')/s^2, freqs, 'Hz')))); -plot(freqs, abs(squeeze(freqresp(G_svd('Arx', 'Rwx')/s^2, freqs, 'Hz'))), '--'); -set(gca,'ColorOrderIndex',1) -plot(freqs, abs(squeeze(freqresp(G( 'Ary', 'Rwy')/s^2, freqs, 'Hz')))); -plot(freqs, abs(squeeze(freqresp(G_cen('Ary', 'Rwy')/s^2, freqs, 'Hz')))); -plot(freqs, abs(squeeze(freqresp(G_svd('Ary', 'Rwy')/s^2, freqs, 'Hz'))), '--'); -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -ylabel('$R_x/R_{w,x}$, $R_y/R_{w,y}$'); xlabel('Frequency [Hz]'); - -ax4 = nexttile; -hold on; -plot(freqs, abs(squeeze(freqresp(G( 'Arz', 'Rwz')/s^2, freqs, 'Hz')))); -plot(freqs, abs(squeeze(freqresp(G_cen('Arz', 'Rwz')/s^2, freqs, 'Hz')))); -plot(freqs, abs(squeeze(freqresp(G_svd('Arz', 'Rwz')/s^2, freqs, 'Hz'))), '--'); -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -ylabel('$R_z/R_{w,z}$'); xlabel('Frequency [Hz]'); - -linkaxes([ax1,ax2,ax3,ax4],'xy'); -xlim([freqs(1), freqs(end)]); -ylim([1e-3, 1e2]); - -% Small error on the sensor location :no_export: -% Let's now consider a small position error of the sensor: - -sens_pos_error = [105 5 -1]*1e-3; % [m] - - - -% The system is identified again: - -%% Name of the Simulink File -mdl = 'drone_platform'; - -%% Input/Output definition -clear io; io_i = 1; -io(io_i) = linio([mdl, '/Dw'], 1, 'openinput'); io_i = io_i + 1; % Ground Motion -io(io_i) = linio([mdl, '/V-T'], 1, 'openinput'); io_i = io_i + 1; % Actuator Forces -io(io_i) = linio([mdl, '/Inertial Sensor'], 1, 'openoutput'); io_i = io_i + 1; % Top platform acceleration - -G = linearize(mdl, io); -G.InputName = {'Dwx', 'Dwy', 'Dwz', 'Rwx', 'Rwy', 'Rwz', ... - 'F1', 'F2', 'F3', 'F4', 'F5', 'F6'}; -G.OutputName = {'Ax', 'Ay', 'Az', 'Arx', 'Ary', 'Arz'}; - -% Plant -Gu = G(:, {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'}); -% Disturbance dynamics -Gd = G(:, {'Dwx', 'Dwy', 'Dwz', 'Rwx', 'Rwy', 'Rwz'}); - -Gx = Gu*inv(J'); -Gx.InputName = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'}; - -Gsvd = inv(U)*Gu*inv(V'); - -% Gershgorin Radii for the coupled plant: -Gr_coupled = zeros(length(freqs), size(Gu,2)); -H = abs(squeeze(freqresp(Gu, freqs, 'Hz'))); -for out_i = 1:size(Gu,2) - Gr_coupled(:, out_i) = squeeze((sum(H(out_i,:,:)) - H(out_i,out_i,:))./H(out_i, out_i, :)); -end - -% Gershgorin Radii for the decoupled plant using SVD: -Gr_decoupled = zeros(length(freqs), size(Gsvd,2)); -H = abs(squeeze(freqresp(Gsvd, freqs, 'Hz'))); -for out_i = 1:size(Gsvd,2) - Gr_decoupled(:, out_i) = squeeze((sum(H(out_i,:,:)) - H(out_i,out_i,:))./H(out_i, out_i, :)); -end - -% Gershgorin Radii for the decoupled plant using the Jacobian: -Gr_jacobian = zeros(length(freqs), size(Gx,2)); -H = abs(squeeze(freqresp(Gx, freqs, 'Hz'))); -for out_i = 1:size(Gx,2) - Gr_jacobian(:, out_i) = squeeze((sum(H(out_i,:,:)) - H(out_i,out_i,:))./H(out_i, out_i, :)); -end - -figure; -hold on; -plot(freqs, Gr_coupled(:,1), 'DisplayName', 'Coupled'); -plot(freqs, Gr_decoupled(:,1), 'DisplayName', 'SVD'); -plot(freqs, Gr_jacobian(:,1), 'DisplayName', 'Jacobian'); -for in_i = 2:6 - set(gca,'ColorOrderIndex',1) - plot(freqs, Gr_coupled(:,in_i), 'HandleVisibility', 'off'); - set(gca,'ColorOrderIndex',2) - plot(freqs, Gr_decoupled(:,in_i), 'HandleVisibility', 'off'); - set(gca,'ColorOrderIndex',3) - plot(freqs, Gr_jacobian(:,in_i), 'HandleVisibility', 'off'); -end -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -hold off; -xlabel('Frequency (Hz)'); ylabel('Gershgorin Radii') -legend('location', 'northwest'); -ylim([1e-3, 1e3]); - -L_cen = K_cen*Gx; -G_cen = feedback(G, pinv(J')*K_cen, [7:12], [1:6]); - -L_svd = K_svd*Gsvd; -G_svd = feedback(G, inv(V')*K_svd*inv(U), [7:12], [1:6]); - -isstable(G_cen) - -isstable(G_svd) - figure; tiledlayout(2, 2, 'TileSpacing', 'None', 'Padding', 'None');