From a5d8cf70cb101308c1975ac5fbc5fb35eca6e316 Mon Sep 17 00:00:00 2001 From: byvs Date: Mon, 24 Nov 2025 10:28:44 +0300 Subject: [PATCH] lab7 is done --- TEMA7/figure1.png | Bin 0 -> 22401 bytes TEMA7/report.md | 643 ++++++++++++++++++++++++++++++++++++++++++++++ TEMA7/task.md | 101 ++++++++ 3 files changed, 744 insertions(+) create mode 100644 TEMA7/figure1.png create mode 100644 TEMA7/report.md create mode 100644 TEMA7/task.md diff --git a/TEMA7/figure1.png b/TEMA7/figure1.png new file mode 100644 index 0000000000000000000000000000000000000000..60d81f7e018f0919bb6778c6593ea7f7a844246e GIT binary patch literal 22401 zcmc({bzBs||3AJ52OLP;5lVA(2+}EWG)RXMD%~Pd1{fSE-5pA&B4Gd`-CZhJfC7Rb zqM!m2-@OAAQQzqu!9NMehDZ7 zP+VNhKPWB~4+_P@CnCTH4-!Hm7!er>98N|;Mv9=IrbLh*AtxoHqNh4SLqkVL2d89U zVxVQBrlq6BD1kun@bK~Qi3tdZX%S=y+W+&h-2@7Aloef9oW>J z1K2yD_;?TkTpW-{eSiXT;Nn1_+b;lOTnK;z$Atp`&AlYE0sHT?r$zwrwC}K92GZR)F1FJhwL$1?GjlHOF$H37r@X zvDHKkpqtp;Pr;WQ`ONWUw<;T)+L_8u6djFAEg6>qS$^4S!?pmdvRg^1R3khZTZR>- zLIVIt&(K-f%b)U}U19j*NxXm&GOF_iS=mYzKrTT2OhWjZI59^6AS~*jtrkwMTo|kC zJ2RF`w04pzcQUb&0hNu^2!CwH@V zkw#sG_r%BE(pmsGPD=GrsDpi!l&Gw+dx%H&MZw`pT!s((VAz% zo|oQw%e8K->kKLJn<_rQR_>>EB+vc$>6KEYcDhM7O=Y|wcd6vqK?sC zB&AYiMfJ>sTQZE8bVIIAA#U^d*X~vwt8r z1nUI-3S}$p!#V86U(er_>bTq2$$tuUM{PH`7oXb8s*CF@_B*Y_81JN5vpc@K*%;$# z!#i;y`Ivdx@TpGw{EGCkSzPQq1t$#J!|we#J|Lpumvg{A{&QyGQazyGLIb^X!gkSM zlv=NCRi192F5Zy4j7tf|A!e5T3hBT53q;U8Rz9L?f0%$o z5TO1Zf?$wh@j!6>PSCRf*sJ|P3d;R+901bGs`QT48)rJd){fgBa~|^HxNP3=LH}f~ z_Re&r+QT^v?EQv+;M`@(bHv+8?(9-UyIDt^x|7OYb^Y*R&@k94+XxM@^2o!nw}8k>&^N{i3p}kXB#EG$}ZTuk)+WSS(}q3;$mC)s-FbRa*X(o(9CzUBI%UGP|xV!y*y~>$XT(@r?s)L*6hL4+HM~of!(`} zsJ^XHrCe+yd6L=eq0rl1b3ZO}KQLr@R7kaO|5sbSGCz8aDoimrH!{(kAQ30|v~9X= zx{3B~rTe=-lh&!iS5Rnf}dgw?LC zgzH6F-OzckU-lZK`ecTfR52?!bl51Uc1=?<7SkJg_M0a^^UbYXC(b$<0mchx>-l?y zDpf7JGh;>-!#_vWz9sukvzE8z9CQmjeD5Ug=ni&efpO|#vidZVxq{r zo9R=>#u1L8CyD7l=d>)tgE3ap*DB>hPBFQ;!hS~-*pY8c8jXb9*gbM0N+L=EL{8g1 zZNsLP;`v8TgV_;u=g;gU$LyzcMt>%v*@v5;g-5>!Djy<72<;7aDP~58AYBdLgbr#b99lZD(}=m$@D2 zUynBNkO^@w3DCTJo{e5oIopl@G|yYijFWFNCC@_$O^SBr1c(gn%)x^*Q%jXx?1S~c@Ezp&%27mnLZM1Ct2prZ5kdx=x2FqL=~Zd7uX{$> zYd;Tu_h(Xy&}(t~Be@o&T*5W$J>Tna${+HB5NT=^c|7UWDDVB(oh-6vWkovV% z*atth#YZ}&CKKs}n&eE3V6NSyG?vZ061F#q%P^JALB^OWi(3`>vHQyVSsLF|6yEz& z1j`bT^xzyrw$OOw-;{zJtX~scf4B5YGvPds<1vgJ>)4&=r^9&DJX2(yz6@8Z^hDPB ztF*XGimQzc>4m0>+<5&pm(5gGNNC}eL`7~hTawwyFe>MVvCbboZH-IkUse`B*+2(L zpB5*SORp3aieud}Rgpvwn`)5Tc;?6$xTc01X{|gBVH+`(Vm9Bp^OWT-Z>?T-x?44hKd%=%gldgT z4~BaVCmqWyNJ!lVfLuaKBE<|7YlW<=>-wtC)#44ri&-sFNU}+?VWW3hxq99(;ODwT z;rPtegPZrG2mlAb#e;!+_uXwh_+S!O7eP+JEXX1xujd;xxWuZDvMP7Q?%u&2z8vIU zl3r1`qq#$y&iT*OIWZrp>x;q_zsi0M`?Rv95UXPSg?QvlNVvjf!)<_dS~}p2M~Mpj zt1MN6vn)_@2&FY{O-gYB!U%49b_ow7UXl`i&uT&`oy8)TZoT)w&uA)O_o=>_f=n9 zG`nxuJ65A-TVzzDxR%y2rL zaEtmR6~xT(Hl_tu;%hfESd`a%%1{LSuDq|SRH$k1dn=}d3^wu2X z1n=%}!2m%(AvoX@W-v$~IJf{*7(p)J9*YMD-BI2+Nr_|;5)qZxvvl)}&#D|88fI0{ z_l;q*qB5}XU{|#ETT)W?kE__d|HGF9@Bh@!5+3t!u0|Nc6gUj0;_&sRxt1T%)tRV{ zzH(W!WwM4vJi9gyyFmWFaHs6{csl-iMBArCy>H_C*#1*>xRp2%{#P&jsg(Nm+x}Px>T-zZHn6`v!s|MRGTz}VLAfLGAaVHe zQ^5O|cb2Ao6DWJK$}(Alam-YhZ*qs?^!3}b9LJlyhB!gq&jsr+(1_#b)SAEd!oO2{ z^|_e0D9;fsTB;Qi+6Va2=h9?o6AtBXKL02`Rq*KS>y9GAB+bs?VmDqiGg}qfw9S;h5}Zc;*B zMyD6!eYW$hZQ_fl^Sy1FQcsUsRrdwX3%g!TH!C~bUUq0C`JrfrViA7ZYVbv=g!1~E zbE9`7R>wD$Z6PP|-nr6!xv8`~z{J#4~>d0l#o(Yt?5<9a5J?de;`OT&mzl z+sm7tVI!#X9l%9_-I4r(9oNYDZ<${V>O^~QMVts6Rtdb0EC2O5GePQ^^P3bU&HZZR z3fll*wfgH3x!U2tc;TmmhA(4YX+OqolaSDXxwrF}PlKoI+9 z;|b1*P&RX~vQY%q=U+Tp?!(^Bv^4&_p6A{-3fEKX+EbAC@c0WQx{mnOm4ijPH5Xpr z7-2l&c^Rwh^N#9Nk)yM8!?#ZISPqRZJ=aUya(WrPMSD7bC3_oK>8@r~TZ}OvMZY}y zUzBK8PrbI8?%-P?EYscSBTx6y3XmY0_en17qor~pLH-BVDDWI}WyXy+)wp#w{L_}V zZ@9N_jI8J>ip6+|F4ka&r-dT^XU1kn3eSo!);p20%hVyJ^;vFDd1&F|=37XTghTOl z46S%@S-FMT+-;k?9p+_E;?IH`n^jgho*aC|v3F#M<}NP*(oh5CY` ztbz*$irR1TgEF3IksS9i3MC9X#J+?iv>_luY|M>F(jObq7u1KOf7ARI!(Ckp>LNEb|5JMoNLfY)jMIIZ z`=i+h*!FrARmE1R@%`)1_B=Pe0+4nQ`)>p4GIb==EWEehy7%F0J1G&v)o#7NI?}Xc zWFzm^mB~R-pZ0uzkYiJ3U$6Yr!t2~b^>x78=l|paaC7Qxo5f})6F=#gi&K`TQl6Z z^r0u|b8-9PzCZXahRYL-ZJ1Bn*F%H0f!NyW21J}jXyx}~!>y5*%#ErAl`u$n zs1+;kD|votbO((vue+MC^7)O}FCSenljrz5a4J2eAVx!vB{ml_4YJ6o)u+_+u>GZL zI!;;2lhdzfyA$-2OWP!LaMZ&N%XG8BGL(r}EYq`~ek>da`ZLMj9{n6AI}g+l3qXf# z+y4DF3i^%qscrcZ+8CzP?CfX`$r^ zNfZJnzQX-RV|;Ub-dQTm*f{qS^qDQm6@-}{A!_oP!x7uSjc;Z_O)@-61{;x%kkafB zX*PG7S&n2<9Nd-QL3PLM*kR)0XmOPvHKyErBKoEdx%YQ!mD%${HMA%bQ@QyBs79xc zH~EYB9@9<~6lfI)L1}xvd}o~i%I@PjAgrRS9z33ey8m~TJIq~Z9(kIa?*}CJ%>Jwn zI;lpNbNw|RwlP0zf445!PNdF}v^c-h{?f8|l%g%Z&bPQ1b$*vEISshn)8}YjT#2`% z6zc9FPEAAJ)9?OzLLDu!mNNFSn;=NR&90CIuu9c79}v(H;%w%+Xr{`j*MVn$nY+XJ z$mMWBZSsB^5{W|`nzfHge@2LAw!cUqp_1`)pKXqwz0% z4Ca@R=9+FK&U=AfA1}96R}RojxIL~}B%c%K8vkeC<+&S(4WNFwUEMKHd*`MMqN!5X zZPe&8W}&r1LhP=Zb4Us_%q{+eaFFhn?JwOQyTa;WS7-u;cvHEjkUrwz(k9~Y*D394 zTNBJxR-P7aq)Hp@og;<*8Bf#tG?eOHv-|~ z>7<6?$*_34&i>6_iIPJjgYagHe9F~!j%Rz@mD|ono~*UuO)CUk6%GYYkm~=|X%zUn z)V~JriUb{gh0r@3U-v#zJ1LzGi+DUkkqH4pEr}ViV`gTjxNqr*xpwH{gakAXKq5jb z%Nvz?qvhi~gl>-%nzXW|C;be(Z{2l~BC+dga}34c7IXN{q&vW_rmHYR?ux z)_i(bWRJD{yG^3wjlQ}>P|aT5p7-{2QG}>C~G&+q(*Hd#oK;JdH)x-J+k#;C-2Z^#`V4SJa~2s$y(u$^cm7|TDlr<=>g%g z)U?cMbJzTnrqR#+V{P%3$;%kUUx@A=0HuH%#v zO#Y;{n6S$}kVt<~$u>HF<|qeXQc3I%)1i2W8%!$L9xwKD+4-S-is`=K#d4x6L9dI9 z|AW?;Za4bK%1MDDo+@-#vU>PvUJ{L)XNB<*cPTVsC^rSOCO({r=F%_4s`hf_a(7B2 zYW^9EdH&aK9D~JC#9W_qvs%LEAtdb4r64Y#QBqRT>;JWg*Kvp;iSIoA{Jo#^)l=fM zi~qXYQ~il-*BFLEzgTFBlv8l5_#)5$3nBL15Ghrwix&0jlVr0%=_b7{z+Qkdk1hqX1@gQ)V&S3V|??NqJ0t`kMdqN^1Y;!_nOT07D zbz!5WmQ8Hj@f@*QOX_j-DPAvOD@6#MFOs?VHKA-vF&*}qsTLA2vLRONqN*uWjCxJC zI0r6h9a0E|&5JlUqyvfXB6-piz$N*QRZ!EdDONr2N6m}B&~{dFP{hW@Fgaq)^U%Ln z?NANPLY!Pgs+`Av;sF&V+Zy`Th`%2CW3#ZoW%RDOv5q$uAMUK^^Mp!JFxyaKdJ<7zc#js_ zZ`xn;KNyD<)x1}u1aE-RntHf zxqvCelbvaG!+RSLwB+{o+q)nCbCa;>F+9+7iJJv9jP#U*NG2x5tfI>Y0X?5VwFOr6dZF3P1^kguX2jBwvd(3PJRSHbC$Q_CP>&>>TS zgL~}u94fYF5|r5%9rPbDb&&-(b5sqQ2Xl%hX9q`?RvbQD@fNu#Eki4Hi!ox4foYz} z+sx%w(Er4Y(H67bKJMv3rubhq?=f_3T1QTKJ^9V*9_^paB6}v`64Bc~@=u0?8U(k> zzvs=&&Hn77 zb0Mbc+-(o>j{Wlc1;Uqtx;)~8^SxeDj!si-13rrXi_|~O^syZ&5VlMtCs@gEtrFO} zPV#?k&u^M#?(l2dLk9)(7Yv{kc$fb7Uj3$Je}~#6WF!-n6FBh%rX+5@ANZG7{wcp- zK)8vHyHB4b<-N0kb-d2z=5KwKVVJh!&HgY6RZDLm={UlcvpSSKf zWG$%VCr{{QL(3gSAVBN~1YNr8ehuD~F&J@1m=o@RWd_G!wBr zf$(($*af_(@<=sdnT_eZyO+G%^K8lwB;h5(Y%ht>E=czh~7G>CjgIg=V+Z* z$U1gyz<4x|LaVhqDx=g_b2e4&_?-_IVX=N*L?%^_sy>~vcGeknPaskzP9@1ZOd~nf~tPw0p8@N5KSV0ezm~_=V(2TE$+omg(amogSYJU z+0KrSORv_vn5<%NW=J?jBPm!Qk|UuCcGUQo{nm74UJAztk-1F+x9+X7nlR2S<^c7n z0PPTx#B)T(S zNf)6!`35$SE(NWChK;p%R9#k>QLL>s6`_sJ#0WM2Jug5_lXtRfV=BdGbe z^mdF2o>tvkXs=^E-aKTS6g(kHnR-e5FZsiGiYQG68A4N)q&R^Nj(B0=Dya-3#p7}K zin$Uq%fuC3eQ#?*OS$5w*Zpv%E}57p9#39ej^=^*$GPezs!O?*6?tr>wqBythrC%1 zsDH?PM2vFSMlwLW*AMTx-V29lxFlK)(i>}jnC)P8KLSo-YHlL>WEMe za~`3lnWbZuGSzEXS7w()oB3C{oi_y`IQS6oUBSH<1t9=}SwK*4>9f40TNctcrW}rH z9JH9+ds9%3c^im^##i~hFTS>A*NcmQpJ9`&nCVRua~`X->t&%O0Doho@vz&ixIeXA zBWLon7{7|Xfe_kZ1tkUq5qM3C^T)8FV0nl+^P zs`h^PA1KaBu;yE*FJ#k)vX?-uvfBxpq~AC;xu$ax?w-PM6ZVzTS=T~;EA~v{Q2*q` zNc~M*EmfatN{y#h1B?GMRyB(6eJ4BY@|BKikc#Z!Q}C`fs~(=DU>^8 zw00Y4HDV-Uy+c;s@kvFRKs@k$GQ^|r#*t*78FNkRm8#9jGXz(z2YwAdy2xeTY3lQV z5Fa&5jC*?tYy`9Ud9NRgKhAE2P0+A|rFnUPAF`-ApFwGnvH`;)+MzE#@m%#cVGm1=rRm$H-Pn)kCP{9hX_A7ALll zDY=LUB85WJ+2#$+Cp}iDPOV)D+lsR5x%=hwk)&nD;6zf3BiizU8M z`OgZrI<`C>D)^cG&dn6s3>lOOJdsH~x162r`})gj;K?-+maDg}o4jO}=RbO_R(Tsx zt+c~Pbq5gQ@`W^^7mW^!M$a`$wTA@D#r~l)u7nI$%{EK?ZpHWc_tmbXj0#HfFJOnv zj4T1&av0+@siAz+L~-pHr4gypd%$PXh@830 z^1;&2%X2Bx8ZpXI152$yG0H4==U?9WKJdcXB6cb99>8$PB26=?{Q zNx;|iTa_!oI&$NS9kK1suPlJ(BKl{zOYn&h9)6<}KC%Qwzuho9Mq(`Ij;2>}4jI)lyh@dzPW6SgV zEPOeR=loRqJw1-ApMszQdMP|2<@EI1V|Q+sdap3((ygfGZ7s~P?o-&YfK13sNk(*A z9){gi_JiY=DSVFs+gQd-6e0o{;q7`EmZVvGPw-gZ7!jctsEePq3_nEYZ5!ivGH)Sa zfHR$~L6DeM1swFA#j+)6;zj-#MI1N}O*qF&8#jaMXx=z8U87HD_K?FENEOQVOI@4b$ z$e$fxo;Zp!bo)8ecM(F#52Efzv=2Y9kP*@W0}y`Tdx}B_DS<(Z!Df3{vj;CcBhW*~ zQolTpx%aSBVx^rx@dX}Hz>gfpMHa;ryMhX-d{$KnVyNFtmL5Pr-TN&I9T5kIaCPJh z#t3?!Zl0zmnIlOIr5}~byo6-$*1>1Pu^0kDEv7ekbnC*}T8o+azJXu=L3-Wy z6{L`v&{8hkALn_v1@s){QXpJ7hOI@^1Z?E`1`Wd&x=JJJGUxkc3@#?wI|o8*F{l?a zs?KIXG}(tk09=EAqmXp*K!orc34yl0MtFXAzFrr8pihljRvUdRR<5eANsjx@(&eIi z4}qPkA36Vd((>EQFd}fK34&O<4~&j8)1A({OVd7meDD@xDp4NA6?AMv1r|>Lk;r_^ z(&EYAL?(cOsuP6pHU&Mfo&%LVbtNz#e#_54!#=hLrBj#0gm4is4hk06b)*e9S9vKt z3}JR|on^A&_U4(Tt3fHVXu%Lx+yNy>AP4k>@R#sc0&V4E-GjF6g+h#rt`YP;3kZED}FyK z7SYtKBdw%||4<|KUirBS2(GZ_q{fWNhO-Nq=?tn0eE|thoHvh9hb3o!VzoQ94d^_J zkn3Rn@cRIFEZC0{cQ)u)X6q_bU$GyhjAmo*B?duflZy1_6X04&+hkF&`TWbL2gg=T zgiIMmA{bngnFV}$80H#Gy|KBDS@QM|6HiRFA2LujGe_{WfuKwm2sYr) zYRJxxC3qmxZ;_ec9>U9KA409mqzOIRLP;)+ie9^(#nJTb=3g0HZkN?Dv;Iw#XF6)k z=xOBrD~`WU1Fy3;V>KO~qK~n$$Y;NcS3_9)p*GJ7e@;-cop2>qI(w+S1;76?*CM?y zF77MD0%p%(c{BUST`z<&6y;^!LKM~ z^g?CLlH^MSxC?q@##xky1vKF^%bM_NC6_JEjbDf)@7q=OtE36vXx$G;@EKP$@lW)^ z@R42+*^gjYan7ExgePA18bmxla=(YI47vR_xI0UtH*+3j@yHN>ZlETV_#Jr$7eH|{ z-;EGCc*5^Nw8_|e^JCaqoV4bvTb2`Ee^PJT8Iw&8a9LbMiQM@OD=@3<2b@K`t=I#R z_84aMsl_4$z(I0`zx?yU)R!W3i(;4flgF~r+!_?gB1{nMqKm8g9Ina5fg>=-osN1(zpG<#vT5{^H=>w+`02T|w zw|jIi#ruKNP8~d07rOdm^|Q&(8k$I6Rzmx$EDE5&t{laK=r+0Ut)KX@TENOoKq(p} zEc)cy)a!lzDdrSh3Y)WN>8{bp#ov<1Ux`u=r+(&@69CmzG7-w>4=LJS17F_ z?PWHCt0&~87V~1gOI%lAhlo$Kaj4wV$mS8lC+id^`xdJ}jeaNUwcgGue_9WR2m^!)m zHC9}$L1mKBUeXh{)9zgZ>GP}F$dY#(+M|9J{0fMT!yK+3w*gB?8$ynUkr_#eKpe50 zL_!a-wi~HLqN~f?!Vxg|hoE;^M}6sF#EyCjonFAlfsADR*~P>JQr7E0!8U-VvS7eJ zr(Xa~)-t9TThW*mXpHT7o9~D07i9@2rjY04442vl8l>o%!~3D|NF5wjmFO#ikE{(F zW9uVE0SSDT!YU*OvB(XY7~lR(NueuzhXp5bg76cF&!Cg0tjEN}5%6yzmas9p>g6PS zLlRhQ<^xg_v^Qxs@>vU7FsOx^kp<^cr2DMk0>e#|+}t(*-tuC0lzSAsLID7B;%5oWz);}(b^sIr8UQqS$MI+c*8fmcmio^o#Y@id6V7`$WfKoSU zVqBuS>kKyQJ+BM^^k{7FZ1x(k-yDE7C$UG`Zw|nPflb9h?$Pity~7@q02B_OkPr(1 z1(q>;MQA42QSb^N!JcEx5u-6B?D3m90PNjv*FfTL<}jWi-<1I``^^D>P!v5lrj_8Z zwqwTEpkMk6nD3`A!*BxR0>9)An1e+BA{{gbMg5}vW{xroU=)tXey#ZPfHI zg%c7X>h9>}JJBh^3lfNJ?i0EO-_dCq`Y=e6=Qt2+*O&PA(m z*kHKYCZ$X!@f*30S_jJE%U!fphZH2cXyk{(Mi~qyc#Q5g(XfJvgo}BZBT++vdqKWP zzIq>8N>hc&9+{U*)Y7bDTY1F56b6ka0iS^2y}{2F%sXnq%dS9;6Wc;{%9-Y>v+qoR z03Lg2WNyp5=?kysUO8xifP+rINgb6-Rnm98b zB_QQW5>9Q8oPBu3;Bw6gB&otBGHHCllvGaQbBqKcr?WJSNC`v?D4=-$H_dx@o^66( zHiHj0p+CQZ#yVHeGNy4!UI68mrRxhvmRk(&xEJJ=1G^c0El%ywNviH_zKuJ^UK7z4 zQSoG2R;^)&d5z1h+Nb8v>I%n>*Z-_(4O6V}wM|vcFW=>{zzgszj9b^8czY`yl)ws> zEjJ1y>|ekKx-TwlZbqwbO4eVWdIGEV$R3t|+qJa4u# z;)&lPkwwE9S_l`-U2b$#VuqskhXX0g#kR>C+no5;&9AquUs47~caVHiL6Dbe_#GC&CmOap zeig4LMG;+ff64n^IQ5X`Eaxe=GZ0`@x}f*c*3n0w6|HC#fgoyt>g8(bcq_K*Y<=j* z4WkQhAN%Z7%9J=EE3>G}ocGloV5AfiLP4WnO!=?>OUb1zu66CEKv*lv_WOf_(hb&B z@b#iJe6i~v6kaE7XxXYvF+JvP`h1wh&$tPCrK#3!Ddk7v!!)^XC*P8uTfwgyd3;n- zvi#A~>BxkSCq9ustDPTgtF6=z>j@T$J|sQ==rh=dfQn%9ZzMj9V#f2=XS^A;&!qLD zm|CRP4e(2*m=fSON?^BP&wK0_b9$m8y2`n#TDIs!BYHT@vvW|gCM!I$jcHpS6-{ee zMRIUt>&1Cp2P@i7hgmB!*{&3Q$LGB*Ay-j{>d3!!AvRFu!xV>RR(evQWmwj=Sia&9 zxOhJTz)h0|y@+%9v&LwglNLm=CoQ426Q25IS9rhCBYW0I=oslDdG%J{6Vl#|FX8@;iIayo+FvPF z?K3QgB?hkls52?9F-qv}rjoj!fXyj9jh6Zb*SGD5?}}@lN~zBfSZTgVN-yC$*?cn{ zHp6KD}rf0x?ly_;S6U{)40x|76p#;Ln}0OQ{Zn^M*SbirX((^z;eRSs|fKr zg8uv+aZ>u@zUj-*JebB09$eO8P<}^m7`^HJ*Mg>YTb|9syOu~9U0IXE`Eo+q1}ECi zZxE2a3Ptfs=%zVtb~r~HHfpi079=1CgULrA%t-x;rwXrZI^|?XoXekw>#i}S*Bh7V z^}|PmW~EzO*n(jYG>!MSA3a}JLO+FqYKY4R%BMnn@{?p7lte#!dIO7Msg`p0lw&vD8>Qj^0pf`Uup^BM@4hrG2E!7 ziShbe{_*ghkZNV;m*e#EaAITw7;c zH=exb=2r;Ut@gEZ5h76V?a^fqKF-1VNuJ)a`lKAj4FI5nUo?nwbF4A z#K1}efrq|fJwWeA!M9FIW5%CY#wm$i%F~arwSUUK z4ZI-W1kl95w|95Hr_9e@owE*l6@0$*18+3C`Kr}c2yt~~Kp8<99WP6TAYTfj^$~?z z28SyzKJKu%rjzuF^wAspds&}sBWa(ATKEN`j6>wFW}*CPgq#5dn->&LX)9s+DUB)7 zH7(IUAQgRd!(mI6yaZDgKVo*K&_a2$<|aZEW`a<1OSOC1hod_MaZKUS>l4vkLM0up zM9fDdu4p=29!Cf+$&ZkvnGdB54z59h1YwN4*&bM*OxhD2&QU+J=Rt6S#|~ z7oe_(1B2?aun@{WG;4`IDxlV&DVscIEf5nRAbSd9zx=0tWkWG{XKM3yhSn1ctRbI@ z3CAGx#aisVe0BNPYbW5RyNmiCY|< ziAlw8b0B=wum}&byJ-_<`3J8d#2#|C{{(Ky==5c_TpGo7r~SZPLT`NkwX3P!8`1V( zz%2ktj^Ok4ZCjpd;s=5I3=zs%f-3CXrpiM^173-MIs%U4{wU=$t?>cXfz0D%87(UT-tJs?R52xKOZ0*6l#iY5I6*4@Na(N z8a5U3K9=SPFmNP&IMx&0qHf1?q%0V{`1pAtbrotx1b)eC1HB z?7-AZx#-Do7ITS;6P%ipdEA(GVbOMEX4zrY_Dv&jgcs6dmu5SDQ5GMcv)MB;zS*Y4}X3B|a^x zD0Ztrg_-bb%n_2asl~7;g^(x6kU}J!?{ryP@&BsSMIIw(nICb#4F)DCg1UP0#lXM4(hwt9;YF!= zg?Nou#`r~H;E7aYE<+7n!_zx<54g$dSIf~fg>@H*rmtw=5M15t5VReAoo21~TJ1KABZgcZR%^S8{yokS;;M7VyzCSuM0v z=pu9i9Rh{n48nDJ=45#a-rHIC~FD_gKtC1}C2Ei5B->> import os +>>> os.chdir(r"C:\Users\alexv\Desktop\4\python-labs\TEMA7") +>>> os.getcwd() +'C:\\Users\\byvs\\Desktop\\4\\python-labs\\TEMA7' + +``` + +## 2. Создание пользовательских функций. + +### 2.1. Функция без аргументов. + +```py + +>>> def uspeh(): # Аргументы отсутствуют +... """Подтверждение успеха операции""" +... print("Выполнено успешно!") +... +>>> uspeh() + Выполнено успешно! + +>>> type(uspeh) # Определение класса пользовательской функции + +>>> dir() # Проверка появления имени функции в пространстве имен + ['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'os', 'uspeh'] +>>> help(uspeh) # Получение справки о пользовательской функции + Help on function uspeh in module __main__: + + uspeh() + Подтверждение успеха операции + +``` + +### 2.2. Функция с аргументами. + +```py + +>>> def sravnenie(a, b): +... """Сравнение a и b""" +... if a > b: +... print(a, "больше", b) +... elif a < b: +... print(a, "меньше", b) +... else: +... print(a, "равно", b) +... +>>> n, m = 16, 5 +>>> sravnenie(n, m) + 16 больше 5 + +``` + +```py + +>>> sravnenie("Text", "Text but bigger") + Text меньше Text but bigger +>>> sravnenie("abc", "ABC") + abc больше ABC + +``` + +### 2.3. Функция, возвращающая значение. + +```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] + +``` + +Данная функция может работать и с кортежами, но вот при работе со словарями и множествами уже получается ошибка: + +```py + +>>> slozh((1, 2), (3, 4), (5, 6), (7, 8)) # Сложение кортежей + (1, 2, 3, 4, 5, 6, 7, 8) + +>>> slozh({"A" : 1, "B" : 2}, {"C" : 3, "D" : 4}, {"E" : 5, "F" : 6}, {"G" : 7, "H" : 8}) # Сложение словарей + Traceback (most recent call last): + File "", line 1, in + slozh({"A" : 1, "B" : 2}, {"C" : 3, "D" : 4}, {"E" : 5, "F" : 6}, {"G" : 7, "H" : 8}) + File "", line 3, in slozh + return a1 + a2 + a3 + a4 + TypeError: unsupported operand type(s) for +: 'dict' and 'dict' + +>>> slozh({1, 2}, {3, 4}, {5, 6}, {7, 8}) # Сложение множеств + Traceback (most recent call last): + File "", line 1, in + slozh({1, 2}, {3, 4}, {5, 6}, {7, 8}) + File "", line 3, in slozh + return a1 + a2 + a3 + a4 + TypeError: unsupported operand type(s) for +: 'set' and 'set' + +``` + +### 2.5. Функция, реализующая некоторую модель. + +```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 +>>> pylab.plot(spsy) + [] +>>> pylab.xlabel("Время, сек.") + Text(0.5, 0, 'Время, сек.') +>>> pylab.ylabel("Выходной сигнал") +... Text(0, 0.5, 'Выходной сигнал') +>>> pylab.grid(True) +>>> pylab.show() + +``` + +Полученный график выходного сигнала: + + + +## 3. Функции как объекты. + +### 3.1. Атрибуты объекта-функции. + +Так как функции являются объектами, то у них есть некоторые атрибуты. Получить их список можно с помощью инструкции dir(). + +```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__'] +>>> inerz.__doc__ # Использование атрибута объекта-функции + 'Модель устройства с памятью:\n x - текущее значение вх. сигнала,\n T - постоянная времени,\n ypred - предыдущее значение выхода устройства' +>>> help(inerz) # Получение помощи по объекту-функции + Help on function inerz in module __main__: + + inerz(x, T, ypred) + Модель устройства с памятью: + x - текущее значение вх. сигнала, + T - постоянная времени, + ypred - предыдущее значение выхода устройства + +``` + +#### 3.2. Ссылка на объект-функцию. + +Ссылку на объект-функцию можно присваивать переменным, а затем обращаться к ним как к самой функции: + +```py + +>>> fnkt = sravnenie +>>> v = 16 +>>> fnkt(v, 23) +>>> 16 меньше 23 + +``` + +#### 3.3. Альтернативное определение функций. + +Функции могут быть определены разным образом в зависимости от особенностей реализации кода: + +```py + +>>> typ_fun = 8 +>>> if typ_fun == 1: +... def func(): +... print("Функция 1") +... else: +... def func(): +... print("Функция 2") +... +>>> func() + Функция 2 + +``` + +## 4. Аргументы функции. + +### 4.1. Использование фунции в качестве аргумента. + +В качестве аргумента функции может выступать и другая функция: + +```py + +>>> def fun_arg(fff, a, b, c): +... """fff - имя функции, используемой в качестве аргумента""" +... return(a + fff(c, b)) +... +>>> zz = fun_arg(logistfun, -3, 1, 0.7) +>>> zz + -2.3318122278318336 + +``` + +### 4.2. Обязательные и необязательные аргументы. + +Аргументы функции могут быть необязательными, т.е. иметь некоторое значение, заданное по умолчанию: + +```py + +>>> def logistfun(a, b = 1): +... """Вычисление логистической функции""" +... import math +... return b / (1 + math.exp(-a)) +... +>>> logistfun(0.7) + 0.6681877721681662 +>>> logistfun(0.7, 2) + 1.3363755443363323 + +``` + +### 4.3. Расположение аргументов функции. + +К функции можно обращаться с произвольным (непозиционным) расположением аргументов, при этом необходимо указывать их имена: + +```py + +>>> logistfun(b = 0.5, a = 0.8) + 0.34498724056380625 +>>> logistfun(0.8, 0.5) + 0.34498724056380625 + +``` + +### 4.4. Аргументы функции, содержащиеся в списке или кортеже. + +Аргументы функции могут содержаться в списке или кортеже, в таком случае при их передаче в функцию необходима распаковка с помощью оператора " __*__ ". + +```py + +>>> b1234 = [b1, b2, b3, b4] +>>> slozh(*b1234) + [1, 2, -1, -2, 0, 2, -1, -1] +>>> slozh(b1, b2, b3, b4) + [1, 2, -1, -2, 0, 2, -1, -1] + +``` + +### 4.5. Аргументы функции, содержащиеся в словаре. + +Аналогичная ситуация происходит и с аргументами, представленными в виде словаря. Однако распаковка в таком случае проводится с помощью оператора " __**__ ". Важно также заметить, что имена ключей словаря с аргументами не должны совпадать с именами остальных переданных аргументов, иначе произойдет ошибка. + +```py + +>>> dic4 = {"a1" : 1, "a2" : 2, "a3" : 3, "a4" : 4} +>>> slozh(**dic4) + 10 + +``` + +### 4.6. Смешанные ссылки. + +Данные способы передачи аргументов в функцию можно комбинировать: + +```py + +>>> e1 = (-1, 6) +>>> dd2 = {"a3" : 3, "a4" : 4} +>>> slozh(*e1, **dd2) + 12 + +``` + +### 4.7. Переменное число аргументов у функции. + +Число аргументов у функции может быть произвольным, что осуществляется с помощью того же оператора " __*__ ". + +```py + +>>> def func4(*kort7): +... """Произвольное число элементов в составе кортежа""" +... smm = 0 +... for el in kort7: +... smm += el +... return smm +... +>>> func4(-1, 2) + 1 +>>> func4(-1, 2, 0, 3, 6) + 10 + +``` + +### 4.8. Комбинация аргументов. + +Данные способы передачи аргументов также можно комбинировать: + +```py + +>>> def func4(a, b = 7, *kort7): +... """Кортеж - сборка аргументов - должен быть последним!""" +... smm = 0 +... for el in kort7: +... smm += el +... return a * smm + b +... +>>> func4(-1, 2, 0, 3, 6) + -7 + +``` + + +Пример реализации аналогичной функции для произвольного количества аргументов, переданного в виде словаря: + +```py + +>>> def func4(a, b = 7, **dict7): +... """Словарь - сборка аргументов - должен быть последним!""" +... smm = 0 +... for el in dict7.values(): +... smm += el +... return a * smm + b +... +>>> func4(-1, 2, **{"a1" : 0, "a2" : 3, "a3" : 6}) + -7 + +``` + +### 4.9. Изменение значений объектов с помощью функций. + +С помощью функций можно изменять значения переменных - объектов изменяемого типа: + +```py + +>>> a = 90 +>>> def func3(b): +... b = 5 * b + 67 +... +>>> func3(a) +>>> a # Числовой объект является неизменяемым + 90 + +>>> sps1 = [1, 2, 3, 4] +>>> def func2(sps): +... sps[1] = 99 +... +>>> func2(sps1) +>>> sps1 # Список - изменяемый объект + [1, 99, 3, 4] + +>>> 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 [[<Список аргументов >]]: <Возвращаемое значение или выражение>__
+__lambda [<Список аргументов >]: <Возвращаемое значение или выражение>__
+Анонимная функция возвращает ссылку на объект-функцию, которую можно присвоить другому объекту. + +```py + +>>> anfun1 = lambda: 1.5 + math.log10(12.23) +>>> anfun1() + 2.5874264570362855 +>>> anfun2 = lambda a, b: a + math.log10(b) +>>> anfun2(17, 234) + 19.369215857410143 +>>> anfun3 = lambda a, b = 234: a + math.log10(b) +>>> anfun3(100) + 102.36921585741014 + +``` + +### 5.2. Функции-генераторы. + +Функции-генераторы - функции, использующиеся в итерационных процессах, позволяющие на каждой из итераций получать значение с помощью инструкции __yield__, приостанавливающей выполнение функции. + +```py + +>>> def func5(diap, shag): +... """Итератор, возвращающий значения из диапазона от 1 до diap с шагом shag""" +... for i in range(1, diap + 1, shag): +... yield i +... +>>> 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 +``` + +## 6. Локализация объектов. + +По отношению к функции все объекты подразделяются на локальные и глобальные. Локальными являются объекты, которые создаются в функциях присваиванием им некоторых значений. Они записываются в пространство имен, создаваемое в функции. Глобальные – это те объекты, значения которых заданы вне функции. Они определены в пространствах имен вне функции. + +### 6.1. Примеры на локализацию объектов в функциях. + +Локальный и глобальный объекты могут иметь одинаоковое имя: + +```py +>>> glb = 10 +>>> def func7(arg): +... loc1 = 15 +... glb = 8 +... return loc1 * arg +... +>>> func7(glb) + 150 +>>> glb # Значение не измени лось, т.к. операции проводились над локальной переменной + 10 +``` + +При использовании локального объекта до его определения будет ошибка: + +```py +>>> def func8(arg): +... loc1 = 15 +... print(glb) +... glb = 8 +... return loc1 * arg +... +>>> func8(glb) + Traceback (most recent call last): + File "", line 1, in + func8(glb) + File "", line 3, in func8 + print(glb) + UnboundLocalError: cannot access local variable 'glb' where it is not associated with a value +``` + +Локализацию объекта можно переопределить с помощью дескриптора __global__: + +```py +>>> glb = 11 +>>> def func7(arg): +... loc1 = 15 +... global glb +... print(glb) +... glb = 8 +... return loc1 * arg +... +>>> func7(glb) + 11 + 165 +>>> glb # Значение изменилось, т.к. была переопределена локализация объекта + 8 +``` + +### 6.2. Функции для выявления локализации объектов. + +Чтобы узнать текущую локализацию объекта можно использовать функции __globals()__ и __locals()__, которые возвращают словари с ключами - именами объектов, являющихся, соответственно, глобальными или локальными на уровне вызова этих функций. + +```py +>>> globals().keys() + dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'func4', 'a', 'func3', 'sps1', 'func2', 'kort', 'anfun1', 'math', 'anfun2', 'anfun3', 'func5', 'mm', 'alp', 'glb', 'func7', 'func8']) +>>> locals().keys() + dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'func4', 'a', 'func3', 'sps1', 'func2', 'kort', 'anfun1', 'math', 'anfun2', 'anfun3', 'func5', 'mm', 'alp', 'glb', 'func7', 'func8']) +``` + +Пример просмотра локальных и глобальных объектов изнутри функциии: + +```py +>>> def func8(arg): +... loc1 = 15 +... glb = 8 +... print(globals().keys()) +... print(locals().keys()) +... return loc1 * arg +... +>>> func8(glb) + dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'func4', 'a', 'func3', 'sps1', 'func2', 'kort', 'anfun1', 'math', 'anfun2', 'anfun3', 'func5', 'mm', 'alp', 'glb', 'func7', 'func8']) + dict_keys(['arg', 'loc1', 'glb']) + 150 +>>> "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("glob_func9:", globals().keys()) +... print("locl_func9:", locals().keys()) +... return arg2 + arg3 * glb +... +>>> func9(10, 1) + glob_func9_1: dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'func4', 'a', 'func3', 'sps1', 'func2', 'kort', 'anfun1', 'math', 'anfun2', 'anfun3', 'func5', 'mm', 'alp', 'glb', 'func7', 'func8', 'func9']) + locl_func9_1: dict_keys(['arg1', 'loc1', 'glb1']) + glob_func9: dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'func4', 'a', 'func3', 'sps1', 'func2', 'kort', 'anfun1', 'math', 'anfun2', 'anfun3', 'func5', 'mm', 'alp', 'glb', 'func7', 'func8', 'func9']) + locl_func9: dict_keys(['arg2', 'arg3', 'func9_1', 'loc1', 'glb']) + 85 +``` + +### 6.4. Моделирование некоторой системы с помощью нескольких функций. + +Моделирование системы, состоящей из последовательного соединения реального двигателя, охваченного отрицательной обратной связью с тахогенератором в ней, и нелинейного звена типа "зона нечувствительности", при подаче на нее синусоидального входного сигнала. + +Этап 1 - запрос и обработка введенных параметров системы: + +```py +>>> znach = input("k1, T, k2, Xm, A, F, N = ").split(",") +>>> k1, T, k2, Xm, A, F, N = 7, 4, 2, 5, 2, 0.01, 100 +>>> 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]) +``` + +Этап 2 - реализация входного сигнала: + +```py +>>> import math +>>> vhod = [] +>>> for i in range(N): +... vhod.append(A * math.sin((2 * i * math.pi) / F)) +... +>>> vhod + [0.0, 7.857546894913888e-15, 1.5715093789827776e-14, -2.038010347584904e-13, 3.143018757965555e-14, -6.428332918551267e-13, -4.076020695169808e-13, -1.081865548951763e-12, ..., -7.666359036382766e-12, -6.521633112271693e-12, -5.376907188160619e-12, -1.8784096492416397e-11, -3.0874553399384703e-12] +``` + +Этап 3 - создание функций, реализующих компоненты системы: + +```py +>>> 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 and xtt > (-gran): +... return 0 +... elif xtt >= gran: +... return xtt - gran +... elif xtt <= (-gran): +... return xtt + gran +``` + +Этап 4 - соединение компонент в соответствии с заданием и получение выходного сигнала: + +```py +>>> 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, 2.0750309723388316, 0, -12.800524758874488, 11.328734010636943, 37.9986846091337, -51.695128234754044, -93.73359277523646, 176.80628109766909, 206.3512386278131, -546.6832050741272, -399.06819555417735, 1598.4573240949626, 604.2307443815814, -4487.243599090263, -296.234076116122, 12162.217953139934, -2805.586281370296, -31870.75393905672, 17036.29869407474, 80623.4912164512, -69802.97975583967, -195996.03820751337, 245998.54033834403, 453751.31553486304, -796405.0354457049, -982958.5881199688, 2433666.144586724, 1918572.300755354, -7113910.846421458, -3041359.0662945407, 20031038.041300073, 2216408.8952286365, -54513798.16041583, 10262153.3054456, 143509014.33326405] +``` + + +## 7. Завершение работы со средой. + +Сохранил файлы отчета в своем рабочем каталоге и закончил сеанс работы с IDLE. \ No newline at end of file diff --git a/TEMA7/task.md b/TEMA7/task.md new file mode 100644 index 0000000..f191878 --- /dev/null +++ b/TEMA7/task.md @@ -0,0 +1,101 @@ +# Общее контрольное задание по теме 7 + +Степанищев Виктор, А-03-23 + +## Задание + +1.Разработайте и проверьте функцию, реализующую для момента времени t расчет выхода y(t) для устройства задержки: на вход поступает сигнал, а на выходе повторяется этот сигнал с задержкой на заданное время Т. + +2.Разработайте и проверьте функцию, реализующую расчет гистограммы по выборке случайной величины с каким-то распределением. Гистограмма при выводе на экран представляется в виде таблицы: границы интервала, число элементов выборки в интервале. Аргументы функции: выборка, число интервалов разбиения диапазона изменения случайной величины. Возвращаемый результат функции: список с числами элементов выборки в интервалах разбиения. + +3.Разработайте и проверьте анонимную функцию, вычисляющую значение оценки отклика Y линейной регрессии при значении переменной Х Y=b1+b2*X и имеющую аргументы b1, b2 и X. + +### 1 задание +```py + +def signal_delay(current_input, delay_time, output_history, input_history): + """ + Расчет выходного сигнала устройства задержки + current_input - текущее значение входного сигнала + delay_time - время задержки + output_history - история выходных значений + input_history - история входных значений + """ + if len(input_history) < delay_time: + return 0 + else: + return input_history[-delay_time] + + +delay = 3 +output_signal = [] +input_signal = [1, 2, 3, 4, 5, 6, 7] + +input_history = [] + +for x in input_signal: + input_history.append(x) + y = signal_delay(x, delay, output_signal, input_history) + output_signal.append(y) + + +print("Входной сигнал:", input_signal) +Входной сигнал: [1, 2, 3, 4, 5, 6, 7] +print("Выходной сигнал (задержка 3):", output_signal) +Выходной сигнал (задержка 3): [0, 0, 1, 2, 3, 4, 5] + +``` + +### 2 задание + +```py + +def raschet_giostogrammy(viborka, kol_int): + minn = min(viborka) + maxx = max(viborka) + shirina_intervala = (minn - maxx) / kol_int + + w = [0] * kol_int + + for znachenie in viborka: + num_int = int((znachenie - maxx) / shirina_intervala) + if num_int == kol_int: + num_int = kol_int - 1 + w[num_int] += 1 + + print("Гистограмма:") + for i in range(kol_int): + start = maxx + i * shirina_intervala + end = maxx + (i + 1) * shirina_intervala + print(f"[{start:.2f}, {end:.2f}]: {w[i]}") + + return w + +import random + +rand = [random.gauss(0, 1) for _ in range(100)] +kol_int = 5 + +res = raschet_giostogrammy(rand, kol_int) + +Гистограмма: +[2.17, 1.24]: 12 +[1.24, 0.32]: 26 +[0.32, -0.61]: 33 +[-0.61, -1.54]: 22 +[-1.54, -2.47]: 7 + +``` + +### 3 задание + +```py + +anonim_func = lambda b1, b2, X: b1 + b2 * X + +print(anonim_func (2, 3, 5)) + +17 + + +```