Evropský sociální fond Praha & EU : Investujeme do vaší budoucnosti Programování v Mathematice - Cvičení 10 Ing. Ladislav Musil, Ph.D., doc. Ing. Jan Kyncl ČVUT v Praze BI - PMA Zimní semestr 2011 Ladislav Musil and Jan Kyncl 2011
2 Cv10.nb Příklad naprogramování fyzikální úlohy a zpracování dat H ciste kvuli opakovanemu spousteni notebooku L $HistoryLength = 3; H zakladni konstanty L g = 9.81; km = 1000.; mm = 0.001; kw = 1000.; Ah = 3600.; H konstanty ve vypoctu L mred = 3500; ShydrOdpor = 4; Dchar = 2; cx = 0.65; ramenovalivehoodporu = 2.5 mm; rkola = 300 mm; teplota = 20; aplus = 0.15; aminus = 0.0525; H hustota vzduchu v zavislosti na teplote L ro@t_d := 341. T ; H zadavani rychlosti, cil je mit funkci pozadovanarychlost=vz=fhx=polohal L vmax = 50 3.6 ; datrychlost = 880, 0.2<, 8600, 0.3<, 81500, 0.5<, 83700, 0.8<, 83800, 0.2<, 88500, 0.9<, 811 000, 1<, 813 000, 0.2<, 814 500, 0.3<, 825 000, 0.3<< ê. 8a_, b_< 8a, b vmax<; vz = Interpolation@datRychlost, InterpolationOrder 0D;H vz je tady funkce polohy, tedy vz=vzhxl, zobrazeni o kousek niz, je po usecich konstantni, to dela InterpolationOrder 0 L H zadavani nadmorske vysky, vysku znacime h, zde ve tvaru 8x=poloha,h=vyska<, polohu znacime x L datvyska = 880, 200<, 8500, 250<, 81000, 220<, 83000, 280<, 83200, 270<, 85000, 400<, 88000, 420<, 89000, 270<, 811 000, 400<, 812 500, 380<, 815 000, 400<, 825 000, 400<<; h = Interpolation@datVyska, InterpolationOrder 1D; H h je tady funkce polohy, tedy h=hhxl, zobrazeni o kousek niz, je po usecich primkova, to dela InterpolationOrder 1 L xmax = Union@Flatten@Take@, 8 2<D & ê@ 8datRychlost, datvyska<d êê Last; H Pozadovanou rychlost mame jako interpolaci nulteho radu, tedy jako konstantni po usecich, kdezto nadmorskou vysku jako interpolaci prvniho radu, takze to dela kopce L plzad = PlotAvz@xD, 8x, 0, xmax<, AxesOrigin 80, 0<, AxesLabel 9"x @md", "v @m.s 1 D"=, PlotStyle 8Blue, Thickness@0.006D<E; plh = Plot@h@xD, 8x, 0, xmax<, AxesOrigin 80, 0<, AxesLabel 8"x @md", "h @md"<, PlotStyle 8Blue, Thickness@0.006D<D;
Cv10.nb 3 H pomocna funkce pro vypocet kinematiky, jde jen o udelani "hladkeho If: L", v podstate jde o to, aby je li rychlost HvL mensi, nez rychlost pozadovana HvzadanaL, je zrychleni az =aplus, v opacnem az =aminus, tedy vlastne regulator L vyr@x_d := c + b x; resbc = Solve@8vyr@1D aplus, vyr@ 1D aminus<d@@1dd; ka = 10; az@v_, vzadana_d := c + b Tanh@ka Hvzadana vld ê. resbc; H protoze skokova zmena rychlosti je nefyzikalni a tedy se musi nutne pridat nejake fyzikalne mozne pravidlo, jak menit rychlost podle nefyzikalni hopzadavku. Zde je to reseno zavedenim max kladneho a max zaporneho zrychleni, ukazano pro vzadana=50ms 1 L PlotAaz@v, 50D, 8v, 40, 60<, AxesLabel 9"v @m.s 1 D", "a @m.s 2 D"=, PlotStyle 8Blue, Thickness@0.006D<E; H podstata úpravy: prijali jsme ze zrychleni je funkci aktualni a pozadovane rychlosti a napsali jsme kinematicke rovnice L rcerychlost = 8v'@tD az@v@td, vz@x@tddd, v@0d 0, x'@td v@td, x@0d 0<; H potrebujeme konec casoveho intervalu, vypocitame ho "jako kdybychom jeli skutecne pozadovanou rychlosti", je to vlastne po usecich vypocitane "t=xêv" a secteno L tmax = Plus @@ DropBPartition@datRychlost, 2, 1D ê. 88x1_, v1_<, 8x2_, v2_<< H jen vyreseni kinematickych diferenciálních rovnic, MaxStepSize 0.0001tmax je jen aby num. metoda nelezla z oboru iksu, kde je definovana pozadovana rychlost vz L res = NDSolveArceRychlost, 8x@tD, x'@td, v@td, v'@td<, 8t, 0, tmax<, SolveDelayed True, MaxStepSize 0.0001 tmax, MaxSteps 10 6 E@@1DD; x2 x1, 1F; v1 H vypocteme, jak dlouho jsme jeli, kdyz jsme jeli, jak jsme jeli, abychom dojeli do xmax,tedy s danou zavislosti zrychleni na rychlosti pozadovane a rychlosti skutecne z kinematickych diferenciálních rovnic L tm = t ê. FindRoot@xmax == x@td ê. res, 8t, tmax 100<D; H ukazka jaka byla pozadovana a skutecna rychlost L plvys = ParametricPlotA8x@tD, v@td< ê. res, 8t, 0, tm<, AspectRatio 0.8, AxesLabel 9"x @md", "v @m.s 1 D"=, PlotStyle 8Black, Thickness@0.005D<E; Show@plzad, plvys, PlotRange 880, xmax<, Automatic<D; H vypocet vykonu Hpo radel vykonu odporu vzduchu, potrebneho na jizdu do kopce, vykonu pro zrychleni, vykonu treni kolecek a z toho vyjadreneho celkoveho mechanickeho vykonu potrebneho na to aby to jelo, jak vypocitala kinematika L PDrug@t_D := 0.5 ro@teplotad v@td 2 ShydrOdpor cx v@td ê. res; Pstoupani@t_D := mred g h'@x@tdd v@td ê. res; Psetrvacny@t_D := mred v'@td v@td ê. res; Ptreci@t_D := mred g ramenovalivehoodporu 1 v@td ê. res; rkola 1 + h'@x@tdd 2 Plot@Evaluate@0.001 8PDrug@tD, Pstoupani@tD, Psetrvacny@tD, Ptreci@tD<D, 8t, 0, tm<, PlotRange All, AxesLabel 8"t @sd", "P @kwd"<d; Psum@t_D = Plus @@ 8PDrug@tD, Pstoupani@tD, Psetrvacny@tD, Ptreci@tD<; Plot@Psum@tD, 8t, 0, tm<, PlotRange All, AxesLabel 8"t @sd", "P @W"<D;
4 Cv10.nb plvys = ParametricPlot@8x@tD, Psum@tD< ê. res, 8t, 0, tm<, AspectRatio 0.8, AxesLabel 8"x @md", "P @WD"<, PlotStyle 8Black, Thickness@0.005D<, PlotRange AllD; plvys = ParametricPlot@8x@tD, h@x@tdd< ê. res, 8t, 0, tm<, AspectRatio 0.8, AxesLabel 8"x @md", "h @md"<, PlotStyle 8Black, Thickness@0.005D<, PlotRange AllD; c1aku = 42 Ah; unom1aku = 12.4; csupcap = 17.8; RiSupCap = 0.065; UmaxSupCap = 680.; naku = 24;H mineno seriovne v jedne z nparalenichaku vetvi L PFCmax = 40. kw; nparalenichaku = 2; PdobMax = 15 kw; Post = 500.; H celkovy maximalni naboj ve vsech akumulátorech L Qmax = nparalenichaku c1aku; H definice rizeni FuelCell L UFCStart = 0.9 UmaxSupCap; PFCmin = 0.2 PFCmax; UFCmax = 0.6 UmaxSupCap; datucpfc = 88 500, PFCmax<, 8UFCmax, PFCmax<, 8UFCStart, PFCmin<, 8UFCStart + 1, 0<, 81000, 0<<; pfc = Interpolation@datUcPfc, InterpolationOrder 1D; Plot@8pFC@ucD, PFCmax, PFCmin<, 8uc, 0, UmaxSupCap<, PlotRange All, PlotStyle 88Thick, Black<, 8Blue, Opacity@0.3D<, Red<, AxesLabel 8"uc HVL", "PFC HWL"<, PlotLabel "Strategie FC", Ticks 888UFCmax, "UFCmax"<, 8UFCStart, "UFCStart"<<, 88PFCmax, "PFCmax"<, 8PFCmin, "PFCmin"<<<, GridLines 88UFCmax<, None<D; H pro vypocty el. obvodu potrebujeme znat zavislost vnitrniho odporu akumulátoru, což jsou funkce Ri1Aku@q_D a U1Aku@q_D L Ri1Aku@q_D := 0.015 ExpB 2.5 q Qmax Qmax F; naku RiAku@q_D := nparalenichaku Ri1Aku@qD; Plot@RiAku@qD, 8q, 0, Qmax<, PlotRange AllD; q U1Aku@q_D := 12.4 TanhB4.5 Qmax F ; UAku@q_D := naku U1Aku@qD; Plot@UAku@qD, 8q, 0, Qmax<, PlotRange AllD; H napeti prechodu diody, zada se jednou, dioda se v dalsim reprezentuje bud zdrojem napeti, nebo vypnuty vypinac L udd = 1;
Cv10.nb 5 H funkce dqduc si bere list 8naboj aku, napeti na kondenzátoru, dobijeci vykon akumulátoru,vykon ze sbernice<. funkce vraci 8dq,duc<, coz nejsou diferencilay, ale derivace naboje a kondenzátoru podle casu L H jelikoz diodu uvazujeme jako zdroj napeti a vypinac, mame dve nahradni schemata, pro stav "rozpojeno" obr. 2 a pro stav "spojeno" obr. 3 L ClearAll@dqducD; dqduc@8q_, uc_, pdob_, psbernice_<d := ModuleB8id, deruc, derq, isbernice, ic, riq, uaq, uq, idob, idrozpojeno, derqrozp, derucrozp, idspojeno, iaspojeno, derqspoj, derucspoj, spojeno, dq, duc, risc = RiSupCap, icspoj<, H ze zadaneho vykonu ze sbernice vypocteme proud isbernice L isbernice = uc 4 psbernice risc + uc 2 2 risc ; H napocteme si parametry nahradniho schematu akumulatoru L uq = UAku@qD; riq = RiAku@qD; H vypocteme dobijeci proud idrozpojeno z podminky:pdob==idrozpojeno Huq+riq idrozpojenol L uq + 4 pdob riq + uq 2 idrozpojeno = ; 2 riq H vypocteme derivaci naboje v akumulatoru a derivaci napeti na kondenzatoru L 1 derqrozp = idrozpojeno; derucrozp = csupcap isbernice; H pro stav spojeno spočteme dobijeci proud z podminky pdob Hudd+ucL idspojeno L pdob idspojeno = uc + udd ; H iaspojeno napeti na riq L 1 iaspojeno = H idspojeno risc + isbernice risc uc udd + uql; riq + risc H derivace naboje, minus protoze proud tece "ven" L derqspoj = iaspojeno; H do kondenzátoru tece proud iaspojeno+idspojeno isbernice a odtud derivace napeti kondenzátoru ve stavu "spojeno" L icspoj = HiAspojeno + idspojeno isbernicel; 1 derucspoj = csupcap icspoj; H tady je uz jen reseno vetveni, podminka spojeni je na diode vetsi nez udd L spojeno = uq > uc + udd; dq = If@spojeno, derqspoj, derqrozpd; duc = If@spojeno, derucspoj, derucrozpd; 8dq, duc<f; H zkouska jak to funguje L dqduc@80.6 Qmax, 290, 15 000., 20 000<D 8 9.25071, 0.520717<
6 Cv10.nb H definice ucinnosti palivoveho clanku L ηfc@pfc_d := 0.5 1 0.3 pfc 0.8 PFCmax PFCmax ; Plot@ηFC@pfcD, 8pfc, 0, PFCmax<, AxesLabel 8"PFC HWL", "ηpfc H L"<, PlotStyle Thick, AxesOrigin > 80, 0<D; H definice icinnosti menice pro dobijeni baterii L pdob 0.8 PdobMax ηdob@pdob_d := 0.95 1 0.3 ; PdobMax Plot@ηdob@pfcD, 8pfc, 0, PdobMax<, AxesLabel 8"Pdob HWL", "ηdob H L"<, PlotStyle Thick, AxesOrigin > 80, 0<D; H definice ucinnosti soustavy motor+menic, Pmech max zavedeno jen aby se mi to lip psalo, If rika, ze muze byt jina pro rekuperaci a jina pro smer vykonu ven L PmechMax = 150 kw; ηm@pmech_d := IfBpmech 0, 2 2 pmech 0.8 PmechMax pmech + 0.8 PmechMax 0.95 1 0.3, 0.85 1 0.3 F; PmechMax PmechMax Plot@ηM@pfcD, 8pfc, PmechMax, PmechMax<, AxesLabel 8"Pmech HWL", "ηm H L"<, PlotStyle Thick, AxesOrigin > 80, 0<D; H strategie dobijeni akumulatoru, tady se dobiji stale, pokud neni aku plna, mozna bude trochu jina, ale nemela by byt fci vice promennych L Pdob@q_, uc_d := Module@8udobMax<, udobmax = UAku@QmaxD; If@And@q < Qmax, uc > udobmaxd, PdobMax, 0DD; 2 2
Cv10.nb 7 H funkce derstav si bere dvojici 8t=cas,stavovy vektor< a vraci derivaci stavoveho vektoru podle casu, q naboj v akumulatoru, uc napeti kondenzatoru, dalsi promenne jsou energie: Wsb energie do sbernice Hspojena s kondem, vykon psbernicell, Wdob energie na dobijeni aku Hvystup z menice do akul, Wfc energie z palivoveho clanku, Wzmar energie marena v odporu, kdyz bychom mohli rekuperovat, ale baterka a kondenzátor vice nepojmou, Wpoh je energie do soustavy motor+menic, Wdobat je energie do nabijeciho menice, Wost energie spotrebovana na ostatni spotrebu Hvse krome pohonul, Wmech je energie mechanicka pohonu, WdoFC je primarni energie vstoupivsi do palivoveho clanku L ClearAll@derstavD; derstav@ 8t_, 8q_, uc_, Wsb_, Wdob_, Wfc_, Wzmar_, Wpoh_, Wdobat_, Wost_, Wmech_, WdoFC_<<D := ModuleB8Pmech, pdob, ppoh, pdobaterii, pdofc, podminakamareni, pdany, pfc, psbernice, pmarim, podminkasamasbernice<, H vypocteme si mechanicky vykon, dobijeci vykon, vykon do pohonu a vykon do baterii L Pmech Pmech = Psum@tD; pdob = Pdob@q, ucd; ppoh = ηm@pmechd ; pdobaterii = pdob ηdob@pdobd ; H pdany je vysledny vykon sbernice, kdyby psbernice byla 0 a pfc 0, tedy kdyby se nemenilo napeti na kondenzatoru a palivovy clanek nejel L pdany = Post + ppoh + pdobaterii; H kdyby toto vychazelo zaporne, znamena to, ze mame prebytek vykonu, ktery nemame kam udat, podminkamareni nám rika, jestli takovy stav mam L podminakamareni = And@pDany 0, uc UmaxSupCapD; H plati li podminakamareni, nastavime pfc=0;psbernice=0;pmarim=pdany, pokud neplati, nastavim pmarim=0;pfc=pfc@ucd;psbernice=pdany pfc L If@podminakaMareni, pfc = 0; psbernice = 0; pmarim = pdany;, pmarim = 0; pfc = pfc@ucd; psbernice = pdany pfcd; H z vysledneho nastaveneho pfc vypoctu pdofc L pfc pdofc := ηfc@pfcd ; H vektor, ktery funkce vraci, tedy vypoctene derivace naboje, derivace uc a po rade vypoctene prislusne vykony L 8Sequence @@ dqduc@8q, uc, pdob, psbernice<d, psbernice, pdob, pfc, pmarim, ppoh, pdobaterii, Post, Pmech, pdofc<f; H zadani bezrozmerneho stavu napeti na kondu a stavu nabiti akumulátoru L socuc0 = 1; soc0 = 1; H vypocteni startovaciho stavu, energie na zacatku brany nulove L uc0 = socuc0 UmaxSupCap; q0 = Qmax soc0; stavstart = 8q0,uc0,0,0,0,0,0,0,0,0,0<; H nalezeni nejmensiho potrebneho casoveho kroku numericke metody L dv = 8 1, 1<.H8Min@ D, Max@ D< &@HLast ê@ datrychlostll; t = 0.002 dv Max@Abs@8aminus, aplus<dd ;
8 Cv10.nb n = RoundB tm t F; EuSt@stavTime : 8t_, _List<D := stavtime + t 81, derstav@stavtimed<; reseu = Timing@NestList@EuSt, 80, stavstart<, ndd; Print@"trvalo to ", reseu@@1dd, " s"d trvalo to 4.141 s rv = reseu@@2dd; ucecka = rv ê. 8t_, 8q_, uc_, Wsb_, Wdob_, Wfc_, Wzmar_, Wpoh_, Wdobat_, Wost_, Wmech_, WdoFC_<< uc :t, UmaxSupCap >; pluc = ListPlot@ucecka, PlotRange All, AxesLabel 8"t HsL", "souc H L"<, PlotStyle 8Hue@0.63D, PointSize@0.005D<, GridLines Automatic, AxesOrigin 80, 0<D; socka = rv ê. 8t_, 8q_, uc_, Wsb_, Wdob_, Wfc_, Wzmar_, Wpoh_, q Wdobat_, Wost_, Wmech_, WdoFC_<< :t, Qmax >; plsoc = ListPlot@socka, PlotRange All, AxesLabel 8"t", "soc H L"<, PlotStyle 8Hue@0.63D, PointSize@0.005D<, GridLines Automatic, PlotRange All, AxesOrigin 80, 0<D; WdoFCcka = rv ê. 8t_, 8q_, uc_, Wsb_, Wdob_, Wfc_, Wzmar_, Wpoh_, Wdobat_, Wost_, Wmech_, WdoFC_<< 8t, WdoFC<; plsdofc = ListPlot@WdoFCcka, PlotRange All, AxesLabel 8"t", "WdoFC HJL"<, PlotStyle 8Hue@0.63D, PointSize@0.005D<, GridLines Automatic, PlotRange All, AxesOrigin 80, 0<D;
Cv10.nb 9 pluc plsoc souc H-L 1.0 0.8 0.6 0.4 0.2 500 1000 1500 t HsL soc H-L 1.0 0.8 0.6 0.4 0.2 500 1000 1500 t H energie potrebna do pohonu L Psum@ D pmech := ηm@psum@ DD &; Wmech = wmech@tmd ê. NDSolve@8wmech'@tD pmech@td, wmech@0d 0<, wmech, 8t, 0, tm<d@@1dd; WFCmax = PFCmax tm; WmaxSC = 1 2 csupcap UmaxSupCap2 ; WmaxAku = UAku@0.5 QmaxD nparalenichaku c1aku; jistenedojedu = Wmech > WFCmax + WmaxAku + WmaxSC;H ze jiste nedojedem kvuli energii L H vypocet maximalniho pozadovaneho vykonu L datp = pmech ê@ Range@0, tm, td; pmax = Max@datPD;
10 Cv10.nb H jen vypocty podminek, kdy nedojedeme L PmaxSupCap = UmaxSupCap2 2 RiSupCap ; UAku@QmaxD 2 PmaxAku = 2 RiAku@QmaxD ; nedojedusnabitymsc = pmax > PmaxSupCap + PFCmax; nedojedusnabitoubaterkou = pmax > PmaxAku + PFCmax; nedojedujennafc = pmax > PFCmax; UAku@k QmaxD 2 NedojeduSHodneVybitouBaterkou = pmax > PFCmax + ModuleB8k = 0.1<, 2 RiAku@k QmaxD F; H kontrola, jestli nám Euler pocita dobre energii L PrintB"Wmech Euler= ", wme = rv@@ 1, 2, 5DD; wme, Wmech wme ", Wmech NDSolve= ", Wmech, " δ= ", 100," %"F Wmech Wmech Euler= 5.59941 10 7, Wmech NDSolve= 5.59943 10 7 δ= 0.000316543 %