From 43357061de4c2974509412f24594dac9bdad5567 Mon Sep 17 00:00:00 2001 From: "FilippovDY (FilippovDY)" Date: Mon, 3 Nov 2025 12:53:54 +0300 Subject: [PATCH] Tema7/report.md --- TEMA7/Figure_1.png | Bin 0 -> 15309 bytes TEMA7/report.md | 620 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 620 insertions(+) create mode 100644 TEMA7/Figure_1.png create mode 100644 TEMA7/report.md diff --git a/TEMA7/Figure_1.png b/TEMA7/Figure_1.png new file mode 100644 index 0000000000000000000000000000000000000000..65d1db5d34cad1c0fbc2ccfc2604172b48dc839e GIT binary patch literal 15309 zcmeIZcT|&2_cnS{6c7=36hx4sSV2IfmjI%GbfpLa0Tt<8dXEiM1Z+qzN+%TQNDG31 z(n62apeQYb9s-0U-z3lbJLfy=eC^+})^ROY7L&}}GkbQq_OHY0Tz&-SnGPOxVNN zA1d>czDCcnt3-CNmkjPDKL+sWY{#qtKH^V7j1Uxbn1Ks|TI^X7U`Xg1#0)`ee2gLx zgy`ggz^_%KAXW&Pk^cXu{2xo~+~gwT<7D*wP$|6O{p;6RuU~WJcLPyM%n(WDR#rt| zSWI>})#Dy>i~ZeJJ4eU7AqODu?APz!WqVH5|A=8lbhcFO%SAAqJ$FtSegxduqqlGW znLrHfgig}F%qpM2JXNP%($}-!+Ty)}D`y439k%`N?y!^%Asn&uu}_^Erh=?JF-q~<)65x+0dsht()`boTt{?9i4ZJgp_#N&IZq}L zF|E(o35lqEt)u4*oZIw(MAH7I@V1CnI}e~F_Sm;&2x(DE=0n=#wnI#rncJ+5 zz{5;tSrHyBatxn~iw#ocJzV8`W0I%Oo;|BI)eu-)5~vcmGHhxLb5M^Uj9B2lvIq}* zMUt%H5xajwR-1@h``gB~?BTgtMpNRKpanFYe|Z z1Gm2XOHBTXLHV0sFUv`n+pj+zo9zf6k_#0oO^Ukgq~@rZJf;&JJ-RB|<8!S=rjz4W z-=!`@3(s!_Y_6i%+zAaCzMQ(cpK24qL;MRM7$RfmobM-)4m9~#G#ZG%A`Y&{#il` zJb~A>YO*<=-KPW?vjaPmxR+r)VQpLTcu)*4QD$=WPW5&I#_NECx%{88&6lotabyj; zOHkry%|F>~3CE7!tNqp?F}~b}S39NL7!l*DN&(j&{Og{<&qt#=z{N7dHp5cce0R^9 zkDFTM?hooU)LP#mPcy?RrI1CiA`#3fdCec?Z}eWonmu%Xsw}(wu7{9xgXANy#ZQ#x zmTwv0d8u)owvOzks*R^l?n8aC>V`U#V2;k?B zv#ujN$E2rxN~h?W4Oy;Ip(Kb|sg4c!{+WeM|8tZ0OXFp5t%Pw0BB>f#XVMU}JrSS$ zrc~mdkOz)WIJb|DV4dF~p{7^JvTV2}+W!>?d<{ZAz3V~Xt=xx)#NStzwXOsnTdAGs zYXx4V#7sZxbV|$U*^AmPx&wN~uS`PjSHX<*pWjYVGLkI`x^>tavU&~zi{d%QBlR8! zc*dJ+Z6=7x;m<0F2@_3=737-IJ2Dcw+7Dk{QT|roX7Z~3j1JQ6A=xLyq^kam*2J4) z$cmGy!vI+go4Z-9)hu7cj6UAjBTql{5Wip%;WAQtu+dZS{`=&AkUdArx9hBw^C)(qOjOg8X9AAEMT=`PQKgboq zSwEY$^5AXB_oa74vOq*^$)2ha*zBrOt2M)I>UqpeBw4sNxC1wEZZg|6EhMJ{=~Oh< zd9iz0rDLqn7-HrGZn`cBJzvWtHM$}>Fg}$V;Ki8fGN3X%!!DEcDR4fBuyU--Hhp#k zOlhCM`He8HXn?CtEGQ+oT(d14T^1Wyg11{Wbw6!>d#&`r8-C%!=0!GTwGtnhk5Z3D zRa=#UFHLgzOqj*W!!d~T@UmxWs3C6}|D9IN~UYd3xkJC9h5ene= zA}zb*hzSRhmeHH3=AMfcC86fk%}@Fg6+XMYJs4m(-16!=$HLnj+w|X-#=IIbAo#Oh zCLwWKf8$O|bW09b;I*tW-~~;8N3cO~O~1N>f%=14ug-Av-56y%q1$Ef;+GN(!oCC- zd_?>La`3GOsp^6CM>VW%!H7zXIjQ=hMbCIOQ~fy?OUH_+2j^UF)IM1k zbx0zV@MEsYsw%h)t~-m{%RB3Q{WeQ%k6!s#bn)w}7Lte>O^6vGpY&j?YDHqwGAmwz z#~JSFQW>9WYb|rr-Y@=Gtn1IW_M(Ew;|LOVj02)lo;Wm0HX6V#_l zzTlrgW_N5Y7uiwObIp6zGTxlb_6axf*UL1E z#U~WKSG3xJn2!K$sOqnI{IJ(9v5YwScd=4}loC4}`+{{S$yU&Rd_CQLO$PU8G~W{tg*NdW3bqnv#;(b}~xW;D@h_Qvi6&GgJ z=$|=lm4FN!{UcWP2U$9`*3T8YlKg3PTYo5!Y|D+M!MxW1-p%SHZ>_5 zla5&Wi%MQGz%F9$IC0#llnB?AK0FO^?bCi**f(D*5nfjEGq?8k%I$kvhC`jo-?SHs z85Wg8Z`OBguM`w`*9S1vu`_TX^7Gv8R99Y?lEM~ZES6p6AJ*F2*E|{1Z#eGx{db3Xz)XGcw=`3J7IrbWvioWN(@<4jp_9Z zb373DqV0-bUzXq5&xcr`cu|OvHKd(KF2rT`2&`7oT41Aj={Ky@zF1PZJXP}KbZ==7 z15^OqGuLoQICW2UqGsECWVEbFK#;p=(`ccHdSbvZJ0#~bKMQn{nSo2==9nEk-vafs zFrU{0lQMPI5JSp6zwmZo%Kz)N!YB zrA0-K#ShorgrO=fu$D&PW<+zz&3LIv*F=ZSU0hk9@r#k%^ZuClC@0{sbA}ukHTnTw zXZ=nH>h%qe536c7nw)gD$uxsUJmgFd2s{5QYH*wd(usjsMY85rQc1yaLS$!T059Ha zX|8GQn`cVM!w+%B`rh@|A@2h~3p+uS#Jw=CSuE6=FdP1SuIx^VN7v6w@Q^_ty^pEK zAuAqmpY|L2;)I_%)`YG63G-WUjBFql-9Z@EYHPR%%y01@hL!|ynd5K}f*d11kAW>I zMq&|?FY33qrfJ&I8q~}QjUNLCZ1^EnIIPa=K3W-5X+FiZALV!scid@fbTM2-CYBwl zI?5=5khi#bJ9ms-exh``gBNw{&c*tBVZyQakvB6e5dIa!n$`Q>Y;@rbXYE4yGwalh zb(QkaiU|MPc8`T2MG#D~M$AWt7n6-^-9|~NWSB~w%L@}RB7ArQXF3mJls|)8(H?=U4HNzM%uk1ErAbN3G+1^>Jo&%{p3HpGwc8B z#fd|l?EdwtPzwV%aomqNm_y3$oH9AkBLimq{1B!Zi!bT!aFmW0hL|savt*lC-N{Dv zVhhfzP3KuKOsK?ne3u)>iat3+IH!k4`^H)MjH6?Te5J_RQt&%9>C+J7PKO9*rQ<4Wb9C(Q z#OXFo|K7lmu~-*4)FKETl0u86Tajh`Z}HEz!yepbnIgA+T^hMKy*LO#CE#*2{MArG z6z>?y#>zo+%H0`kdV8u z;2bLivx+$`rM8R{4w_*g;3q7krKP)idWHdLF6ip&3P2wB?kfF6uHPz0Z;>#gKi2~F zR?V8iXAAcRo*T3ZLqP~PD`>ti9qBTZ=d!&#CcmHTt#GfExx@}-o30Y+oAB5vGyL{Y zzA;M%)dnF<;%omDOHd#g#U!D3`z+Zg0+`z3R7-c4WQG@a<$? zNt>Ua(05EsKIP<`;W>U>Tw1!E2gRR7NU#_gXG_ntt7yyMT>Oy35}|4Ua*H%c4rtt* z4TYK-IA8;Zm*navy6*3+8)7uCUBmBw(uz55{@>G*f>gR zHZ@Xemkczwwnie$nyqRlA9kNoH#RpW%M4sviy#_Gk(~MY)3RyjcT9?+&;237Mbo^3 zf`S`m&3j7<(=wiuis^oXy7k2A(9}}cW{*t$QW4VZ_HD<8*VcoK&YD??nWr>n0(Nal z%U2v$kvFefKKE3rMM(;zwzJwnGbc2NRgku}w(HK?uik@xNmoVY!g`XVS;CFAwAvLk zZ7nUy%K6b<-#{+CE%3L6gH;wS(KpH|y!R~%1pw*R?-6@B!XKfh>JXwKgF&|E*yX%- zuW!$}`Q=>SrytB~Y_u`WH>wuSR1L1Ua^;GQQHRTGyh^urDj>CK znveO>U6VVe`4e{Vk}vuXmv=#6+?tPxx^Pjxm1c7c9dZobgE_k6l}_=FJxL!YCv7+c zmCZKidfoW>-h#xfxP5ih+N)aPv?I!Q-pGGx_(v2?(ooMY+X)upO7fbKsGy_{!r~vlI}q1r zy&W<>gIA*^Cd0O>H*TY3b64(y=q*n86`SOX zn~Ck)7bLIrl>T+oCNVh#Fiw z=){IC+&s$6Ki&A6%sY=A{n+@2^_L)x*TBy)^z;mF^|PcB@`G{sFL%(yN4jmtj{dmI z3AGFW1i{c{fPXlFL~boR5k$kw6mz5DLkc}TTZe&{1P+~{zIZ}vKI~&K(ieXNJAqQr zNKBt>TdaT}N#L#-4O|>zOG8`>c|FFE-#_0Z6FRT?_p!m#B-x>v)8JHy<%=bQ4#t;8 zm*8h##vj78y^D5pFEh*UW`ybhPshroL=xK?>Qt-r-OugNS^80!Eqg)q2Yq>v4l=fk zK7I(__?|y*Zd2Ivo(~qj>+F!*p#g&0GfKQ8lX)nB4eL^rk|N^;`UQ zY|QC>1}F_6vGMOKzsUj5;`ax|2!{Hf-AGqP*dY-vF6fc`-4FgUzr1vQMSv`1WXK}U zB)aYfP3SE^Axes?Dmsh^6%NK<>d$H6lErn9zKm`_*BDtCxSX}jtNrWul5?$^kkF2ot|rd9uBqRZ@H)LgacDvR~*fsN(b zWo180095a7rl(Q?Ko_ASAbYBMJSOZua8%fsDTg~(U_DN_QfdCsSq5mW1kAcMZgsO1 znPK~BNjbAmD5=!C55MZC3qe(^3|xwbp8Xw3+52{%NAA-4Ht^0o{QSRZTcv;b@(abF z8(Y)F10wQ(sHygab60xk=LDML{dB0wfJ)R02N0I+)~|q4_1n7;#4G^5VWtIr8sfV5 z@zh>t?)jyiDrWi_o^wNwcxmaPGig%>0M$)kI05 zgu);8alZ9uASjNXfoq2sK={2eQ++clbL5*lf?Lt6oF+F|MI#uXuK@g>)J{j2;pQ*Z z`cjg)QJipPn>WAqy_g_Y&;4^uM`qEh#h7S;?F;8l8*my6l>%~vzL_MjnQK9z{-r`z zpT~r-z5{nTmQ()F1#<`-f-A3^h(SlX#7n7viKfAKnmqemfjlv0W|*a={6u+m&L!S<4Yw^+K6~9|)Y!=EIv+I^f+n9~-CGzktg7H;5#`;bTlZS+ z=C6MUW`bymtn=slI&UaD9sHqTn@VKaBAu7?2b}}9oAb7dA5L6;2z;jhC_)zQqsK|x zc~&nM^eZ?PO$MRr^E((ebb#yj9t70^L1hppf1hkBzhB#W?b;SG^RTIj`&0UId8~-F zs_F*)t!T{ciCL_{0`h1>pf^pv<0rwijMde8r^Ldd(R`3#=48g=7U^aY zMJ%qcyvZb8k_|!xXhBc&cfumbd+j`8#RUT(Wk?AaU8jq$!Pgv0lXLq}QBiSBP_Sem zTgPqvcYAbr_^n%SN}IN={1*qcKy+26?93A8QoU-do17!5HdThgo!M_@lFCk$N*O97(1`Y~i9hal=nI)tu4c zYMEDLWcPC6pIJDVv#8XMiR)K)rB@Td(xDKDDC}q$-LUk z%^)7g;mC&DJ8>_b3@e=)r+FCf_u`B*1DE07=5|rh!V#8j(VUnZ-FI6JSaM$ghj15- z8&8c9s7*^t3n)3EQ(9DGG?YQr1n|F4U{VV!FgZeBB~AR`qnx}vu}hZ>f`fy5OH((u zwzi%$cfQ(}LsOE8a!Xhg%0pTf-u33q8*EVgiHq*?%<(8nU^a037vB|8SFmc!$TU-TZsyFa`fT4#T&4JWy-)!m3Sqw{ght zG_7|C1aLh+aqRJo1pr{cy*~?!aQWR|svO$?)%r1Tw5Kin7zE}{G{Zu-ojYEgs1XQU z=>M3a;AK11@_KpMUFAyMn-eYT+Y?^64gs&>nXgaqs)%!kr~QTuk3{e|OGKukZlx06 zBTY5mM^MR+j1rk34Go`ORfN%9p^q(9jutQaBE3Hf?yN_u3zo7mxsaKlu-vCu?8+kJ z!B^wTnR%$H)+m&(@s0B!@Og7FYt(hU1IYWOV7uO{Bl)=F5aOB$)GAj&yuAS2p_dgd zku8$}QdDFVvH7an71G@;ZhmKWC@Djbpe|~edjS0W6x7N?X>!l!^%T2l7F4iOzs5Ye zcL2m&Rs?GZsS8QyR2cm^YZs?(OHVw2fg`k`>;0smMt`xQf?KF9W)Os;hd@1)YYj|s z)vrD7+BdJXy%T?w<>KjAUZ5u0%z={N9`>b7?RANT?yHN|yIj9b_kLW*zzi#3;BdFV z#0vmv4xtxU{ggm>;b0VbYyy~v6|bbt)x1j5#j}!wG~Ht5XVzdoE3;JFSZ~x;f8OmM zUkZ@Jb+C*wy8`b5fv16o-$Z>)boe9$A$Uch(*?uByZ<`FANCcpfB~hsNiIJyK@1&M z4;R?%9tM28LY(?EUE}n?^07@0=6l@@0?X@V=eNxN<5{`hgDLz(RKrz3^ziqey`?TR zHbtLe1*SZcYtY-8{OumPPg>(b^S^tD>-FSX7Ob8fvTQD_pjSMI69v?@M5* zAg|)dl6Gq%;9AUT)4E>@L(oZaMiE9U2g7v7<}ZChcD`0#{)Qky2EO~T5Cazj{)cgm zi_<`azwXOXs!B;dP2@9&z(b0|L1-sTp9|ejWeevK+k-6x%*kIcD}z66)8hTSv}2ALoPjtk=Uey4`r?XU_}b$Jj-&;{fZ*r-i3^c=A<*JTs_ z#x&>W_sdg3j>7b(0xF4>ui9U2ir5ztx?kx78~HDna~3?hBSt^aS^w%6li#Nam8QvC zCmHl^$BIheV8#*;AyIq%(kpHw5j^mJ}5cTy8jC*#r-!0q}8~ zbqYVMsUV^ki!)m7r7!RbdM-~KK0g7flE`KkHsx$PC%S+)!9GoSMyhK_n4R6lrepki zw2c~xLZ1v_q&qd>KKyJtEz<)vkJEk*F>6%i7L6;zHo$d+^|~}26Y8i1b?-+A?007w zDT#@~#IVYTkqw3f}!eV(9g$YqEe9 z`a3@_yd6GK<1thgNp_1BP$->p^;ZF=O(lJ%jG=y<7tH_p-J1s4AkV`HA~q5gv0a(z zvNT-CfB7zgRw)OZ1q@)C=rChAJYDk3pMS`|I3sVOGhh?dwhE*$>yMyLWAY%V;9Pv~ z!+PMlW;!6t{~@ol+e{^6spf#X@^9y{s4~r+UR#SMpeba)0_)K-T`+k~u5=+){KAFL zCBZH(F0}CLj~f--g0UZ$9JY^#UKv5^8-m|t83pou)!n~I-_-$bjU7E{pkm87*bZyMFs6hheR zAbB?LI;!;lY2nq-oUs6;G=4I&gQ}9?B*p--nw7F507~Fj3#*$$XJTa&V%YrV_Umz_ zqz)X3fXh!1w~%iLz?IaFfB1@`5Xzzt`vd$K(Ds$Q`Oc%LbaV0B$`AfG3BPGUrKOjl z|FVRyX`aErb8b;t*WnAWwH78ZDXH4*$FV=&ofj7sZ3~!931(#B;2&Nl|M>AEfJ(qQ zCvOy4!8Tn2hQ6U8NW}ZgImjqQRyTBedEnIvnfIxw$dA{eU8fs^4VkW0R951@->r&0 zp15)oSPCuSOlE2x!vm9I)B(KUcue+vKny*(`Z6XaAt~uX*~ad^@+^h3syfSt8v0ek zP^fJ(5<;|?x2}45#W8B*tUjN@MxmZAc&iYB@vyoxYn-eEq_ZROo%RDU$u2o#(8)0a z0?^5KvB9}}&i0QqujO34L^=p*+!TR+C#kOgsL6YgDPww{?!u}d1}>eFf=^b!p6-Es z=a~Z*EXoU}S1V=C7gTiQQ{ex|)w3K`XM(sukWv%_9ve2&PgWuPx%BMmQ$-r^cRs}^ z64#~TwowI2$sj8x0LGcV`bh@b7a*anCS|@_DP4GenQquR2 z5Oht61GN#IWkBgqke@zU)YE?zKvQ1tr{KA#a}(r3f_IHV4QM{&>kF{L{Z>0I|MZZ+ zIE*eV8Q>Gd-Rscx7*Oa0?x>kW92}UUkBVr4QHkk#V-VPn9p%nrj}G*uFAKuAb9uhN z!AOIXA3lCtVEuP*U}fGPQYFKU=3lmV2H(}I(7d1GLEwzOPqr%+5qACW6CcpiMW8=3 zd|c4LC;!Myc$!Ciq;gcD9grSiv%-*|*yk4LlMBL^e_xj5zo+A7;KD9_i5f)-bF6mM zqkusH=|@)scdYjFbEl9ofAS(tDYJOEARkMqOJk=p?f9oewO}gk^i4P)0M}vy^4Xw;_(UDZk(*KE zh^w(n0;NG7Ekq4EMjr%~m?KNr?tq^O>Yzx2vGHEqi@7go;H9UYyINI9Ox2;I=PaB>(b&9^kIFOH_{NF^E z;D9%+n%DfkUOosmGIN_*LpGI!-sxLUr>7|(FQ63+T8lP!34;}7^^pt^B9t4tCoyT3 z1!Bb6PVI#TvdX_QyvD3yN%iF0_xbv|l%6*N1?!JuMSS+9HZ|2pte|3|Dz`wC@zjBy zPFt2+n{)V5LCp7~X-t0yE22L}-*-9V3l;d(gN#|7v}OW_9x@9(Si?$vmJ)}ONSqLa z7J))Q7XSunw_MSw&iCOL{Z7)kAeg&Lz{h}ND;8m9b-+o|HL>4_6(O|UwUHj6e(!Gm z{nN>`70SR0X8t9{02F$}pT7c9JIMGH6f(>ruw78_Njv?YPqH-@bXb81xDIUrI+0*G_|jHg5lw+$9gL%_ov=z(+wrJPiHUKx@VjU^4^86E_bY1$`H5VipHl?o>Kn6c^VY7#QG(g;eoM z*@k_`sBL@~-fRN8>-v;&m++H!uv$xiXe$sVlK{?6lRN;d_`tDGhNmNlpf{? zg{@r;UD@1qFKD3b;pD>iw!Fe4K`{1UlU)Ub{KFVECtckaZ{NN(v#}}u_N^tu*b6jh z^zC&=zhq?}c#BOh%=yVm3-K-7XRmIN8cOOu9r#>dZ>66oSv^%3ODnv5ahY;^@$%)N zk>TMBpwr89YcCPNv3x=7i#4D!ozJ=t96EH!o!$2TuCGY!1x|v@a0z6lm0Y|2wC*>R zHL2%!@A3x=WKu~&G@D&hwWxxGkPWNN*1mH+1Km<6cb3;DyLyskJl^@tI@TvW`3maO z<0dyt0YMTg+^>2DD9@^o7Gz*(X#W3*!_ncZnbdtJ0SFsBFUTRJy7Re=RvE%?GR9gP z8O1%mYLBBa7UF7MJh9CnT;domU%6sJ;{f(|H&aWK|5FZ$4#Q?rw$4xabP9sJH$(ds z-+D>rc`>mrwM!v0yeFqn9NCf4m-mhXC-UcnMwiQs2C}*WeQyy7EOw#<8cr60PPof260kw;D4$JBy#=6%RNj?u3m1onwm)WM#TZ zvqGS4@!dJY!33nEK>!l->O<5=m2%_YK$kaP&y#@fP# zA+*w?0Ti%Iab}IgE7_5Oz+byRNP<&96Jr)PLw_!4n;fCPOfL*M?m)r!P(8y`SiH7Q!HI9e4IfN5e3&WMmx1}Ix2RJ46Ubi61>PedE zwp`_c;EvrHS0)ae6ypE1PR1pE1-hUJtUNb6vU6*xfTqGULt}UjEsU?&or?td3yTiq z_a-fz$LdR^<;PQlcbFC_zZ&S7>??#tzOAR`*fEyjsm6?^}VF)nj^Cg22`u1*X&$Lm&}&d6<2qurrX3pSeJtNpgWAIMI;(JG+&RZJ5~@?{bCa z`|KU33z}O5I#{^>Rxdo+^g(=QUGqh`2q`-0mi&~Ru+ET^%j~0TIbqb=ZfE7E#Wdx7Kuyb(0N7y;g zGLIP5gbv>o_L6*!mZHhv)gL~(#efPQ7%q0AscZipD}td5G+tcG16BtCG{cuAKbPnN z5a6fQYjX8~+5Zc!=D5%QnCm99OEqQzc6D|f}ve^rI)uvF{p#f%o*OUG;^M4Zu zGs8AsNH*`>hx@eiST%=zIcJpSTx*WJeUVExfV!~{#N+I7Dq{0W!$*66i3l znpev-PEJm)|F7`Z7y(MiAp61K%23mO_?&k}gZ&?`$$`X%H@pwDq=Rnd!n!)k7cX9v zY*&L)i0gvzv^l7%Qqu#90AcQ29SILqhicYvqE13k}uPYA$R6 zz*?Qz0pI-U)vMvPUu|-cl>Iz6N3Q2e!XP&N=NPk~Egbd-2QGcGl}7>*mCWea_5LEi z^!=y*iEb@%8|k#*w)5x5y95y3GG}Ex>wXvjBLNCipoUXVNcnBWlI=oxw4)xYVF@GQCnb~ zsTT4#!9v!#UxWpe)WH(-DZx;Bi>f9dQZoOEh-{cW0bDXv1-L07TYJ#N^MCyQ$1ArF zk9{>~Pm4Kf`v6Y&q#l2SS7@-bEaQyy1qq32QcsUTzCMtE&U&co#f!SO->h0XTjn=i zFr{$48#iv=xN!qX^}qkv0U!z|%td$3$@%TC;hw_uk0TV)GLZ!8sN>a0&1+4&vL_`F zoh@NQez?&RL-pw0ym=ObiCMK;&J|zM4E@6!JAWp=W?yc@aTyrz8sMP7X~D}YOlD?g z?>)hb2@N_EzyA9Pw0RN-AA$1*9hUf?ADa&WUV6waF21CtqvN)Ras*VW3rKyv`>( zTaG2QzFv7MV8UZ*AUnD#8qgtwf`O9*?s&_U&4JyuHco$9gNV6e5Bj-@=hqX=2*+F90mphxyH>&a~G*bTc-e6``czrQ~Pylb=P z)R(phT7BPUW_nSc5+m2XvTQdN6nq!v=KdA=>)G)X+sXjE6)8n4hF8hb#am25fZGnTtnL}B;AN>C3X^xse8IgLDop)R|NGwb$gWQ&dfwRBn1~HsZ8F64G{wJsxuFjB zk2iBz16?$m`-yfD!If^uZG%2i-|9=2cTUca-lI?>cmF1)_JJD$jcWE-B9NRy(_BgI z^hWg4r#pcwlVg2$SJyrrxQqZk&TVlpx8@6}g%H(CYu7qi(rXAPA-vkzv+XOrFolxG zEYm~~A__x^E0e_RyH?g{@L)&c5K!(o>i)bs&E-UFWebn#@Pp=|JRPCnoW)u2dWN~D zr)MR}eNh7mS zMe&^P%dml)(p8gbO1{h4?0M`vxH@!+J)ll&+y+&}9s*zWGn5=-x8FKF0Xns0r@Ehz zPXcqD+*%wmH!-S+b_603r3y8w3+H=h}4O9gMN zY%N!!U1wSz?fs6CS{9CXoM9xM@YFc&4e1&hR!6!-gq!6kftwC2maMGT z;J~APQCL%@1(7Lgzs|J zST%)A5(oZTNMTw(BJN}=c7INxhG(r)ol-97Kpx7Z3?I3FrScHp1gTAZQ0KsY)9Pa~R2k(2Hg;MR+*ZJzith2}09#tpzRxHT*ib2sCZG`g{@kRGO z?_yeQNIuuGulcvRcJhQ%+DE{Gj(>RD(OYGfELquMzp_~_6E77O&M&%|HV)D>r}$oC z?e5v2nQ(b{^4!>k72j@iGqaygT}K{JG!)d|ajf`GIR6Nj3*C&)+0CwevpeQVnMiUv zFraA^uX)uMq@Cs2>EO*VU6sK_V2&H-&z~px`ue6zN;t!Pd*vvgXORlp`}P|GS3SqY z#Kcl;eZgx@B=F}-BzT=^A9%p^_!BZ6o{I7;ag6eH=uS^i^``(5n3^6qy@&{sqB~^5N5m!?UArl&q!U+132z-PmR1~ny-Jzb&jRyYt8wLpihf( zb1dEHNQ!S{^bx^jsUhM085a37pZu9bh+q60x5wQmSDzdlQ|AT5^nB#bujth9NrPOU z36I*{p~1mrw?4($!_++jP7tZUm+=1m&sF$lrJ}O(IJVNsn7SH4REY!x0No$XlZjaM z1@wcX_0}PF#FZ&GCcCh(Ms;cF0d@Z+Gl5G34^PbrOL#~C+^eznZ>azO_zRzZB&fnq Y|7NCti)+XRu^ZCWGP+)>dH3;u17G;UmjD0& literal 0 HcmV?d00001 diff --git a/TEMA7/report.md b/TEMA7/report.md new file mode 100644 index 0000000..536f799 --- /dev/null +++ b/TEMA7/report.md @@ -0,0 +1,620 @@ +# Отчёт по теме 7: Создание пользовательских функций +Филиппов Даниил Юрьевич, А-01-23 + + # 1. Запуск интерактивной оболочки IDLE +```py +>>> import os +>>> os.chdir('C:\\Users\\danii\\Desktop\\FilippovDY\\python-labs\\TEMA7') +``` +Пользовательская функция – это совокупность инструкций, которая выполняется при обращении к функции из любого места программы. Аргументы функции – это ссылки на объекты-источники данных, которые используются при её выполнении. Возвращаемые данные – это результаты вычисления функции, передаваемые в ту часть программы, из которой была вызвана функция. + + # 2. Создание пользовательской функции +Создание функции предполагает выполнение трех операций: формирование функции, ее сохранение и использование. +В общем виде функция в языке Python представляется так: +def <Имя функции>([<Список аргументов >]): +[<отступы>"""<Комментарий по назначению функции>"""] +<отступы><Блок инструкций – тело функции> +[<отступы>return <Значение или вычисляемое выражение>] + +Функция считается оконченной, если в очередной строке нет отступов или их число меньше, чем в отступах в функции. Если при выполнении функции будет выполнена инструкция return, то выполнение функции прекращается с возвратом значения, следующего за этой инструкцией. Если функция не содержит оператора return, она автоматически возвращает значение +None. + + + ## 2.1 Функция без аргументов +```py +>>> def uspeh(): +... """Подтверждение успеха операции""" +... print('Выполнено успешно!') +... +... +>>> uspeh() +Выполнено успешно! +>>> type(uspeh) + # Функция является объектом класса function. +>>> dir() # Имя функции появилось в пространстве имён +['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'os', 'uspeh'] +>>> help(uspeh) +Help on function uspeh in module __main__: + +uspeh() + Подтверждение успеха операции + +``` + +help вывело справку по функции uspeh в модуле main. Далее выведена документационная строка функции (то описание, которое было указано в тройных кавычках при её определении). Документационная строка позволяет кратко и понятно описывать назначение функции. + + + ## 2.2 Функция с аргументами +```py +>>> def sravnenie(a,b): +... """Сравнение a и b""" +... if a>b: +... print(a,' больше ',b) +... elif a>> n,m=16,5;sravnenie(n,m) +16 больше 5 +``` + +Так как мы не указали какой тип данных должна принимать функция, то функция сможет работать с любыми данными, котороые можно сравнить. Если нельзя сравнить, вернется TypeError. +```py +>>> n,m='aaa', 'bbbb';sravnenie(n,m) +aaa меньше bbbb +``` + + + ## 2.3 Функция, содержащая return +```py +>>> def logistfun(b,a): +... """Вычисление логистической функции""" +... import math +... return a/(1+math.exp(-b)) +... +>>> v,w=1,0.7;z=logistfun(w,v) +>>> z +0.6681877721681662 +``` + +Модуль импортированный внутри функции будет доступен только внутри этой же функции. + + + ## 2.4 Сложение для разных типов аргументов +```py +>>> def slozh(a1,a2,a3,a4): +... """ Сложение значений четырех аргументов""" +... return a1+a2+a3+a4 +... +... +>>> slozh(1,2,3,4) # Сложение чисел +10 + +>>> slozh('1','2','3','4') # Сложение строк +'1234' + +>>> b1=[1,2];b2=[-1,-2];b3=[0,2];b4=[-1,-1] +>>> q=slozh(b1,b2,b3,b4) #Сложение списков +>>> q +[1, 2, -1, -2, 0, 2, -1, -1] +>>> c1=(1,2); c2=(-1,-2); c3= (0,2); c4=(-1,-1) + +>>> q=slozh(c1,c2,c3,c4) #Сложение кортежей +>>> q +(1, 2, -1, -2, 0, 2, -1, -1) +q = slozh({1,1}, {2,2}, {"abc"}, {3,3}) # Сложение множеств +Traceback (most recent call last): + File "", line 1, in + q = slozh({1,1}, {2,2}, {"abc"}, {3,3}) + File "", line 3, in slozh + return a1+a2+a3+a4 +TypeError: unsupported operand type(s) for +: 'set' and 'set' + +>>> dict1 = {'a': 1}; dict2 = {'b': 2}; dict3 = {'c': 3}; dict4 = {'d': 4} +>>> slozh(dict1, dict2, dict3, dict4) # Сложение словарей +Traceback (most recent call last): + File "", line 1, in + slozh(dict1, dict2, dict3, dict4) + File "", line 3, in slozh + return a1+a2+a3+a4 +TypeError: unsupported operand type(s) for +: 'dict' and 'dict' + +slozh(1, "а", 2, "b") # Сложение числа и строки +Traceback (most recent call last): + File "", line 1, in + slozh(1, "а", 2, "b") + File "", line 3, in slozh + return a1+a2+a3+a4 +TypeError: unsupported operand type(s) for +: 'int' and 'str' +``` + +Как видно сложение для множеств и словарей не применимо. Также нельзя складывать числа и строки, но можно складывать числа и логический тип. + + + ## 2.5 Функция, реализующая модель некоторого устройства, на вход которого в текущий момент поступает сигнал х, на выходе получается сигнал y: +```py +>>> def inerz(x,T,ypred): +... """ Модель устройства с памятью: +... x- текущее значение вх.сигнала, +... T -постоянная времени, +... ypred - предыдущее значение выхода устройства""" +... y=(x+T*ypred)/(T+1) +... return y +... +>>> sps=[0]+[1]*100 # Список с измерениями значений входного сигнала – в виде «ступеньки» +>>> spsy=[] #Заготовили список для значений выхода +>>> TT=20 #Постоянная времени +>>> yy=0 #Нулевое начальное условие +>>> for xx in sps: +... yy=inerz(xx,TT,yy) +... spsy.append(yy) +>>> import pylab as plt +>>> plt.plot(spsy, label = "Выходной сигнал") +[] +>>> plt.show() +``` + +График сохранён в файле Figure_1.png +![График](Figure_1.png) + + + # 3. Функции как объекты + ## 3.1 Получение списка атрибутов объекта-функции +```py +>>> dir(inerz) +['__annotations__', '__builtins__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__getstate__', '__globals__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__type_params__'] +>>> inerz.__doc__ +'Модель устройства с памятью:\n x- текущее значение вх.сигнала,\nT -постоянная времени,\nypred - предыдущее значение выхода устройства' +>>> help(inerz) +Help on function inerz in module __main__: + +inerz(x, T, ypred) + Модель устройства с памятью: + x- текущее значение вх.сигнала, + T -постоянная времени, + ypred - предыдущее значение выхода устройства +``` + +Этот атрибут __doc__ содержит значение docstring, если при инициализации функции он был задан. Если не был, то inerz.__doc__ будет иметь значение None. + + + ## 3.2 Сохранение ссылки на объект-функции в другой переменной +```py +>>> fnkt=sravnenie +>>> v=16 +>>> fnkt(v,23) +16 меньше 23 +``` + +Функции можно передавать в переменные, как и любые другие объекты. После этого переменная fnkt ссылается на ту же самую функцию, что и sravnenie. + + + ## 3.3 Возможность альтернативного определения функции в программе +```py +>>> typ_fun=8 +>>> if typ_fun==1: +... def func(): +... print('Функция 1') +... else: +... def func(): +... print('Функция 2') +... +>>> func() +Функция 2 +``` + +Программа выводит сообщение "Функция 2", потому что переменная typ_fun не равна 1, и +выполняется блок else, в котором функция func определена как выводящая "Функция 2". + + + # 4. Аргументы функции + ## 4.1 Возможность использования функции в качестве аргумента другой функции +```py +>>> def fun_arg(fff,a,b,c): +... """fff-имя функции, используемой +... в качестве аргумента функции fun_arg""" +... return a+fff(c,b) +... +>>> zz=fun_arg(logistfun,-3,1,0.7) +>>> zz +-2.3318122278318336 +``` + +Python передаёт ссылку на объект функции logistfun в переменную fff. Внутри функции выполняется заданная операция. + + + ## 4.2 Обязательные и необязательные аргументы +```py +>>> def logistfun(a,b=1): #Аргумент b – необязательный; значение по умолчанию=1 +... """Вычисление логистической функции""" +... import math +... return b/(1+math.exp(-a)) +... +... +>>> logistfun(0.7) #Вычисление со значением b по умолчанию +0.6681877721681662 +>>> logistfun(0.7,2) #Вычисление с заданным значением b +1.3363755443363323 +``` + + + ## 4.3 Возможность обращения к функции с произвольным (непозиционным) расположением аргументов +При этом надо в обращении к функции указывать имена аргументов. +```py +>>> logistfun(b=0.5,a=0.8) # Ссылки на аргументы поменялись местами +0.34498724056380625 +``` + + + ## 4.4 Пример со значениями аргументов функции, содержащимися в списке или кортеже +```py +>>> b1234=[b1,b2,b3,b4] # Список списков из п.2.4 +>>> b1234 +[[1, 2], [-1, -2], [0, 2], [-1, -1]] +>>> qq=slozh(*b1234) #Перед ссылкой на список или кортеж надо ставить звездочку +>>> qq +[1, 2, -1, -2, 0, 2, -1, -1] +``` + +Со звёздочкой коллекции передаются как набор аргументов функции. Это - "оператор распаковки". Это было бы эквивалентно записи slozh(b1,b2,b3,b4). + + + ## 4.5 Пример со значениями аргументов функции, содержащимися в словаре +```py +>>> dic4={"a1":1,"a2":2,"a3":3,"a4":4} +>>> qqq=slozh(**dic4) #Перед ссылкой на словарь надо ставить две звездочки +>>> qqq +10 +>>> slozh(*dic4) +'a1a2a3a4' +``` +Ключи на входе функции воспринимаются как значения позиционных переменных, а значения, как значения. Если поставить только одну звездочку, python попытается интерпретировать +ключи, а не значения словаря как позиционные аргументы. + + + ## 4.6 Смешанные ссылки +```py +>>> e1=(-1,6);dd2={'a3':3,'a4':9} +>>> qqqq=slozh(*e1,**dd2) +>>> qqqq +17 +``` + + + ## 4.7 Переменное число аргументов у функции +```py +>>> def func4(*kort7): +... """Произвольное число аргументов в составе кортежа""" +... smm=0 +... for elt in kort7: +... smm+=elt +... return smm +... +>>> func4(-1,2) #Обращение к функции с 2 аргументами +1 +>>> func4(-1,2,0,3,6) #Обращение к функции с 5 аргументами +10 +``` + + + ## 4.8 Комбинация аргументов +```py +>>> def func4(a,b=7,*kort7): #Аргументы: a-позиционный, b- по умолчанию + кортеж +... """Кортеж - сборка аргументов - должен быть последним!""" +... smm=0 +... for elt in kort7: +... smm+=elt +... return a*smm+b +... +>>> func4(-1,2,0,3,6) +-7 +``` + +Если мы не хотим передавать b, придется переопределить функцию так, чтобы именованный параметр b был в конце, а позиционный кортеж - перед ним. + +Подобным же образом в списке аргументов функции также можно использовать словарь, предварив его имя двумя звездочками. +```py +>>> def func4(a,b=7,**dct1): #Аргументы: a-позиционный, b- по умолчанию + кортеж +... """Словарь - сборка аргументов - должен быть последним!""" +... smm=0 +... smm = sum (dct1.values()) +... return a*smm + b +... +>>> func4(-1,2, x=3, y=4, z=5) +-10 +``` +*args и **kwargs - способы передать не уточненное заранее число элементов: +*args — переменное количество позиционных аргументов. Переданные с одной звездочкой аргументы собираются в кортеж. +**kwargs — переменное количество именованных аргументов. Все переданные аргументы, которые указываются по имени, собираются в словарь. + +*args всегда должно идти перед **kwargs. + + + ## 4.9 Изменение значений объектов, используемых в качестве аргументов функции +Такое изменение возможно только у объектов изменяемого типа +```py +>>> a=90 # Числовой объект – не изменяемый тип +>>> def func3(b): +... b=5*b+67 +... +>>> func3(a) +>>> a +90 +``` + +Поскольку функция ничего не возвращает то вычисленное значение b = 5*b+67 существует только локально внутри нее и не выносится в глобальную область видимости. + +Пример со списком: +```py +>>> sps1=[1,2,3,4] #Список – изменяемый тип объекта +>>> def func2(sps): +... sps[1]=99 +... +>>> func2(sps1) +>>> print(sps1) +[1, 99, 3, 4] +``` + +Список передается по ссылке, а не по значению, поэтому изменяется именно тот объект, который был передан. + +Пример с кортежем: +```py +kort = (1,2,3,4) +func2(kort) +Traceback (most recent call last): + File "", line 1, in + func2(kort) + File "", line 2, in func2 + sps[1]=99 +TypeError: 'tuple' object does not support item assignment +``` + +Кортеж - неизменяемая коллекция, так что переназначение в таком виде не работает. + + + # 5. Специальные типы пользовательских функций + ## 5.1 Анонимные функции +Анонимные функции или по-другому их называют лямбда-функциями – это функции без имени, определяемые по следующей схеме: +lambda [<Аргумент1>[,<Аргумент2>,…]]:<Возвращаемое значение или выражение> +Анонимная функция возвращает ссылку на объект-функцию, которую можно присвоить другому объекту. +```py +>>> import math +>>> anfun1=lambda: 1.5+math.log10(17.23) #Анонимная функция без аргументов +>>> anfun1() # Обращение к объекту-функции +2.7362852774480286 +>>> anfun2=lambda a,b : a+math.log10(b) #Анонимная функция с 2 аргументами +>>> anfun2(17,234) +19.369215857410143 +>>> anfun3=lambda a,b=234: a+math.log10(b) #Функция с необязательным вторым аргументом +>>> anfun3(100) +102.36921585741014 +``` + +Вызов лямбда-функции создает объект класса "функция", который потом можно положить в другую переменную и далее вызывать. Это необязательно, если она используется один раз, можно вызвать ее сразу. Внутри лямбда-функции не могут использоваться многострочные выражения, нельзя использовать if-else. + + + ## 5.2 Функции-генераторы +Это – такие функции, которые используются в итерационных процессах, позволяя на каждой итерации получать одно из значений. Для этого в функцию включают инструкцию yield приостанавливающую её выполнение и возвращающую очередное значение. +Данный оператор в отличие от return не останавливает полностью выполнение программы. Когда выполнение функции возобновляется после yield, оно продолжается с того места, где было +приостановлено, до следующего оператора yield (или до конца функции). +```py +>>> def func5(diap,shag): +... """ Итератор, возвращающий значения +... из диапазона от 1 до diap с шагом shag""" +... for j in range(1,diap+1,shag): +... yield j +... +>>> for mm in func5(7,3): + print(mm) +... +... +1 +4 +7 +``` + +Здесь при каждом обращении к функции будет генерироваться только одно очередное значение. +При программировании задач у таких функций часто используют метод __next__, активирующий очередную итерацию выполнения функции. +```py +>>> alp=func5(7,3) +... +>>> print(alp.__next__()) +1 +>>> print(alp.__next__()) +4 +>>> print(alp.__next__()) +7 +>>> print(alp.__next__()) +Traceback (most recent call last): + File "", line 1, in + print(alp.__next__()) +StopIteration +``` + +__next__ помогает вывести значение, которое yield передает на каждой итерации цикла. Если функция отработала последнюю итерацию, но мы попытаемся сделать вызов, вернется ошибка. + + + # 6. Локализация объектов в функциях +По отношению к функции все объекты подразделяются на локальные и глобальные. Локальными являются объекты, которые создаются в функциях присваиванием им некоторых значений. Глобальные – это те объекты, значения которых заданы вне функции. +Локализация может быть переопределена путем прямого объявления объектов как глобальных с помощью дескриптора global. + + ## 6.1 Примеры на локализацию объектов +Пример 1. Одноименные локальный и глобальный объекты: +```py +>>> glb=10 +>>> def func7(arg): +... loc1=15 +... glb=8 +... return loc1*arg +... +>>> res=func7(glb) +>>> res +150 +>>> glb +10 +``` + +Внутри функции glb принял значение 8, но глобальная переменная при этом после выполнения +функции значения не поменяла. Это происходит потому, что технически, локальный glb и глобальный glb - это два разных объекта. + +Пример 2. Ошибка в использовании локального объекта. +```py +>>> def func8(arg): +... loc1=15 +... print(glb) +... glb=8 +... return loc1*arg +... +... +>>> res=func8(glb) +Traceback (most recent call last): + File "", line 1, in + res=func8(glb) + File "", line 3, in func8 + print(glb) +UnboundLocalError: cannot access local variable 'glb' where it is not associated with a value +``` + +Переменной glb присваивается значение внутри функции. Поэтому python решает, что glb - это локальная переменная для всей функции. Но когда выполнение доходит до строки 3 print(glb), локальная переменная glb еще не была инициализирована (это происходит только в строке 4). + +Пример 3. Переопределение локализации объекта. +```py +>>> glb=11 +>>> def func7(arg): +... loc1=15 +... global glb +... print(glb) +... glb=8 +... return loc1*arg +... +... +>>> res=func7(glb) +11 +>>> glb +8 +``` + +Здесь мы явно указали, что в функции используем глобальную переменную, поэтому она изменилась. + + + ## 6.2 Выявление локализации объекта с помощью функций locals() и globals() из builtins +Эти функции возвращают словари, ключами в которых будут имена объектов, являющихся, соответственно, локальными или глобальными на уровне вызова этих функций. +```py +>>> globals().keys() #Перечень глобальных объектов +dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'os', 'glb', 'func7', 'res', 'func8']) +>>> locals().keys() #Перечень локальных объектов +dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'os', 'glb', 'func7', 'res', 'func8']) +``` + +Сейчас различий нет, потому что эти методы возвращают объекты на уровне вызова этих функций. Сейчас мы работаем в самом рабочем пространстве, где локальная и глобальная области видимости совпадают. + +```py +>>> def func8(arg): +... loc1=15 +... glb=8 +... print(globals().keys()) #Перечень глобальных объектов «изнутри» функции +... print(locals().keys()) #Перечень локальных объектов «изнутри» функции +... return loc1*arg +... +>>> hh=func8(glb) +dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'os', 'glb', 'func7', 'res', 'func8']) # Глобальное glb +dict_keys(['arg', 'loc1', 'glb']) # Локальное glb +>>> 'glb' in globals().keys() +True +``` + + + ## 6.3 Локализация объектов при использовании вложенных функций +```py +>>> def func9(arg2,arg3): +... def func9_1(arg1): +... loc1=15 +... glb1=8 +... print('glob_func9_1:',globals().keys()) +... print('locl_func9_1:',locals().keys()) +... return loc1*arg1 +... loc1=5 +... glb=func9_1(loc1) +... print('loc_func9:',locals().keys()) +... print('glob_func9:',globals().keys()) +... return arg2+arg3*glb +... +... +>>> kk=func9(10,1) +glob_func9_1: dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'os', 'glb', 'func7', 'res', 'func8', 'hh', 'func9']) +locl_func9_1: dict_keys(['arg1', 'loc1', 'glb1']) # # Содержит только объекты, определенные внутри func9_1, а также объект, переданный как аргумент функции +loc_func9: dict_keys(['arg2', 'arg3', 'func9_1', 'loc1', 'glb']) # # Содержит все то же, что и locl_func9_1, но еще и arg3, переданный func9, и саму func9_1 +glob_func9: dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'os', 'glb', 'func7', 'res', 'func8', 'hh', 'func9']) +``` + + + ## 6.4 Моделирование системы +Моделирование системы, состоящей из последовательного соединения реального двигателя, охваченного отрицательной обратной связью с тахогенератором в ней, и нелинейного звена типа «зона нечувствительности», при подаче на неё синусоидального входного сигнала. +Реальный двигатель: последовательное соединение усилителя с коэффициентом усиления k1,интегратора: y(t)=x(t)+y(t-1), и инерционного звена: y(t)=(x(t)+T*y(t-1)) / (T+1) с постоянной времени Т. +Тахогенератор: последовательное соединение усилителя с коэффициентом усиления k2 и интегратора: y(t)=x(t)+y(t-1). +Нелинейное звено типа «зона нечувствительности»: y=0 при -xm≤ x ≤xm, y=x-xm при x>xm, y=x+xm при x<-xm. +Таким образом, система характеризуется параметрами: k1, T, k2, xm. Входной сигнал характеризуется параметрами: A (амплитуда синусоиды) и F (период синусоиды). +Еще один параметр задачи : N – время (число тактов) подачи сигнала. + +Решение задачи: +```py +>>> znach=input('k1,T,k2,Xm,A,F,N=').split(',') # Запрос и введение параметров задачи +k1,T,k2,Xm,A,F,N=8,5,3,10,2,0.5,1000 +>>> k1=float(znach[0]) # Распаковка значений из списка в отдельные объекты +>>> T=float(znach[1]) +>>> k2=float(znach[2]) +>>> Xm=float(znach[3]) +>>> A=float(znach[4]) +>>> F=float(znach[5]) +>>> N=int(znach[6]) +>>> import math +>>> vhod=[] +>>> for i in range(N): +... vhod.append(A*math.sin((2*i*math.pi)/F)) # Создание реализации входного сигнала +... +>>> vhod +[0.0, -9.797174393178826e-16, -1.959434878635765e-15, -2.9391523179536475e-15, -3.91886975727153e-15, -4.898587196589413e-15, -5.878304635907295e-15, -6.858022075225178e-15, -7.83773951454306e-15, -8.817456953860943e-15, -9.797174393178826e-15, -3.919860126290071e-14, -1.175660927181459e-14, 1.5685382719271533e-14, -1.3716044150450356e-14, -4.3117471020172244e-14, -1.567547902908612e-14, 1.1766512962000004e-14, -1.7634913907721887e-14, ...] + +# Создание функций реализующие компоненты системы +>>> def realdvig(xtt,kk1,TT,yti1,ytin1): +... #Модель реального двигателя +... yp=kk1*xtt #усилитель +... yti1=yp+yti1 #Интегратор +... ytin1=(yti1+TT*ytin1)/(TT+1) +... return [yti1,ytin1] +... +>>> def tahogen(xtt,kk2,yti2): +... #Модель тахогенератора +... yp=kk2*xtt #усилитель +... yti2=yp+yti2 #интегратор +... return yti2 +... +>>> def nechus(xtt,gran): +... #зона нечувствит +... if xtt(-gran): +... ytt=0 +... elif xtt>=gran: +... ytt=xtt-gran +... elif xtt<=(-gran): +... ytt=xtt+gran +... return ytt +... + +# Реализуем соединение компонент в соответствии с заданием +>>> yi1=0;yin1=0;yi2=0 +>>> vyhod=[] +>>> for xt in vhod: +... xt1=xt-yi2 #отрицательная обратная связь +... [yi1,yin1]=realdvig(xt1,k1,T,yi1,yin1) +... yi2=tahogen(yin1,k2,yi2) +... yt=nechus(yin1,Xm) +... vyhod.append(yt) +... +>>> print('y=',vyhod) +y= [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1.0183086292055208, 0, 26.39885775889784, -36.65029553691161, -34.19982663883278, 196.29963397615063, -151.6919482160481, -388.32493988337274, 1057.8073200868555, -308.3186572590445, -2798.051869998873, 5004.749701095182, 1362.331454336744, ...] +``` + + + # 7. Завершение сеанса работы с IDLE +