diff --git a/examples-gallery/beginner/particle_through_box_501_nodes_solution.csv b/examples-gallery/beginner/particle_through_box_501_nodes_solution.csv new file mode 100644 index 00000000..2dba981a --- /dev/null +++ b/examples-gallery/beginner/particle_through_box_501_nodes_solution.csv @@ -0,0 +1,3007 @@ +-0.000000000000 +0.000427313648 +0.001281893582 +0.002563685400 +0.004272632594 +0.006408678956 +0.008971770136 +0.011961854344 +0.015378882046 +0.019222804888 +0.023493574368 +0.028191140768 +0.033315452529 +0.038866456061 +0.044844095840 +0.051248314660 +0.058079053944 +0.065336254061 +0.073019854611 +0.081129794664 +0.089666012935 +0.098628447894 +0.108017037798 +0.117831720663 +0.128072434164 +0.138739115495 +0.149831701186 +0.161350126923 +0.173294327354 +0.185664235934 +0.198459784788 +0.211680904621 +0.225327524667 +0.239399572669 +0.253896974902 +0.268819656206 +0.284167540046 +0.299940548577 +0.316138602700 +0.332761622125 +0.349809525411 +0.367282229997 +0.385179652213 +0.403501707272 +0.422248309249 +0.441419371032 +0.461014804270 +0.481034519299 +0.501478425064 +0.522346429032 +0.543638437105 +0.565354353527 +0.587494080807 +0.610057519633 +0.633044568811 +0.656455125204 +0.680289083685 +0.704546337109 +0.729226776283 +0.754330289960 +0.779856764827 +0.805806085504 +0.832178134545 +0.858972792432 +0.886189937563 +0.913829446233 +0.941891192607 +0.970375048667 +0.999280884160 +1.028608566519 +1.058357960774 +1.088528929446 +1.119121332427 +1.150135026855 +1.181569866968 +1.213425703957 +1.245702385812 +1.278399757167 +1.311517659135 +1.345055929155 +1.379014400837 +1.413392903808 +1.448191263577 +1.483409301393 +1.519046834127 +1.555103674150 +1.591579629235 +1.628474502456 +1.665788092103 +1.703520191597 +1.741670589413 +1.780239069001 +1.819225408701 +1.858629381653 +1.898450755698 +1.938689293255 +1.979344751193 +2.020416880666 +2.061905426934 +2.103810129157 +2.146130720161 +2.188866926180 +2.232018466564 +2.275585053475 +2.319566391548 +2.363962177537 +2.408772099932 +2.453995838571 +2.499633064220 +2.545683438150 +2.592146611689 +2.639022225768 +2.686309910451 +2.734009284451 +2.782119954631 +2.830641515493 +2.879573548648 +2.928915622267 +2.978667290512 +3.028828092942 +3.079397553889 +3.130375181805 +3.181760468569 +3.233552888762 +3.285751898881 +3.338356936518 +3.391367419479 +3.444782744834 +3.498602287920 +3.552825401255 +3.607451413392 +3.662479627686 +3.717909320977 +3.773739742184 +3.829970110803 +3.886599615299 +3.943627411392 +4.001052620224 +4.058874326395 +4.117091575867 +4.175703373709 +4.234708681693 +4.294106415693 +4.353895442906 +4.414074578846 +4.474642584110 +4.535598160887 +4.596939949179 +4.658666522723 +4.720776384566 +4.783267962283 +4.846139602782 +4.909389566674 +4.973016022168 +5.037017038437 +5.101390578410 +5.166134490941 +5.231246502286 +5.296724206827 +5.362565056953 +5.428766352029 +5.495325226339 +5.562238635904 +5.629503344048 +5.697115905568 +5.765072649378 +5.833369659432 +5.902002753776 +5.970967461504 +6.040258997441 +6.109872234308 +6.179801672160 +6.250041404848 +6.320585083289 +6.391425875299 +6.462556421792 +6.533968789152 +6.605654417651 +6.677604065842 +6.749807750973 +6.822254685604 +6.894933210813 +6.967830726655 +7.040933620855 +7.114227197177 +7.187695605430 +7.261321775672 +7.335087359854 +7.408972684843 +7.482956721405 +7.557017074186 +7.631129997958 +7.705270445140 +7.779412148830 +7.853527744126 +7.927588928407 +8.001566658624 +8.075431380668 +8.149153283018 +8.222702564466 +8.296049704209 +8.369165722234 +8.442022418788 +8.514592583715 +8.586850169113 +8.658770421862 +8.730329975480 +8.801506903340 +8.872280737139 +8.942632455698 +9.012544449746 +9.082000468278 +9.150985551747 +9.219485956663 +9.287489075472 +9.354983354785 +9.421958214322 +9.488403968294 +9.554311750412 +9.619673443259 +9.684481612438 +9.748729445653 +9.812410696688 +9.875519634118 +9.938050994541 +9.999999940012 +10.061362019409 +10.122137209668 +10.182325486336 +10.241926823872 +10.300941195784 +10.359368574697 +10.417208932416 +10.474462239958 +10.531128467590 +10.587207584859 +10.642699560621 +10.697604363066 +10.751921959750 +10.805652317622 +10.858795403049 +10.911351181849 +10.963319619320 +11.014700680264 +11.065494329025 +11.115700529513 +11.165319245237 +11.214350439336 +11.262794074602 +11.310650113518 +11.357918518278 +11.404599250818 +11.450692272839 +11.496197545830 +11.541115031092 +11.585444689753 +11.629186482788 +11.672340371027 +11.714906315171 +11.756884275794 +11.798274213346 +11.839076088155 +11.879289860415 +11.918915490180 +11.957952937348 +11.996402161639 +12.034263122569 +12.071535779421 +12.108220091209 +12.144316016629 +12.179823514021 +12.214742541305 +12.249073055927 +12.282815014787 +12.315968374170 +12.348533089653 +12.380509116011 +12.411896406862 +12.442694914627 +12.472904590480 +12.502525384300 +12.531557244630 +12.560000118628 +12.587853952027 +12.615118689088 +12.641794272560 +12.667880643642 +12.693377741938 +12.718285505423 +12.742603870403 +12.766332771479 +12.789472141517 +12.812021911608 +12.833982011041 +12.855352367269 +12.876132905881 +12.896323550573 +12.915924223119 +12.934934843348 +12.953355329112 +12.971185596265 +12.988425558637 +13.005075128007 +13.021134214078 +13.036602724453 +13.051480564605 +13.065767637852 +13.079463845325 +13.092569085941 +13.105083256361 +13.117006250962 +13.128337961790 +13.139078278520 +13.149227088402 +13.158784276213 +13.167749724188 +13.176123311963 +13.183904916492 +13.191094411967 +13.197691669727 +13.203696558157 +13.209108942571 +13.213928685092 +13.218155644514 +13.221789676151 +13.224830631672 +13.227278358919 +13.229132701711 +13.230393499629 +13.231060587780 +13.231133796541 +13.230612951287 +13.229497872089 +13.227788373391 +13.225484263662 +13.222585345023 +13.219091412838 +13.215002255282 +13.210317652876 +13.205037377981 +13.199161194266 +13.192688856127 +13.185620108071 +13.177954684052 +13.169692306764 +13.160832686873 +13.151375522200 +13.141320496846 +13.130667280238 +13.119415526117 +13.107564871436 +13.095114935173 +13.082065317045 +13.068415596114 +13.054165329270 +13.039314049580 +13.023861264476 +13.007806453775 +12.991149067504 +12.973888523487 +12.956024204688 +12.937555456252 +12.918481582212 +12.898801841793 +12.878515445282 +12.857621549352 +12.836119251794 +12.814007585526 +12.791285511778 +12.767951912306 +12.744005580482 +12.719445211064 +12.694269388438 +12.668476573117 +12.642065086238 +12.615033091865 +12.587378576970 +12.559099329183 +12.530192912924 +12.500656645566 +12.470487577569 +12.439682485221 +12.408237894741 +12.376150178634 +12.343415815297 +12.310032029709 +12.275998341171 +12.241320331468 +12.206018950533 +12.170150840433 +12.133841748604 +12.097269713997 +12.060607760543 +12.023980351091 +11.987468671132 +11.951126667216 +11.914991348421 +11.879089200740 +11.843439874004 +11.808058409795 +11.772956626624 +11.738144019114 +11.703628359283 +11.669416111852 +11.635512728698 +11.601922862693 +11.568650526349 +11.535699211736 +11.503071982678 +11.470771546708 +11.438800311984 +11.407160432887 +11.375853846938 +11.344882305000 +11.314247396222 +11.283950568800 +11.253993147413 +11.224376347945 +11.195101290026 +11.166169007757 +11.137580458948 +11.109336533110 +11.081438058408 +11.053885807732 +11.026680504020 +10.999822824952 +10.973313407090 +10.947152849552 +10.921341717284 +10.895880543968 +10.870769834631 +10.846010067977 +10.821601698489 +10.797545158314 +10.773840858967 +10.750489192866 +10.727490534729 +10.704845242829 +10.682553660142 +10.660616115382 +10.639032923952 +10.617804388797 +10.596930801194 +10.576412441463 +10.556249579625 +10.536442475994 +10.516991381729 +10.497896539330 +10.479158183102 +10.460776539573 +10.442751827884 +10.425084260149 +10.407774041779 +10.390821371791 +10.374226443090 +10.357989442729 +10.342110552153 +10.326589947428 +10.311427799450 +10.296624274145 +10.282179532657 +10.268093731521 +10.254367022831 +10.240999554398 +10.227991469896 +10.215342909013 +10.203054007576 +10.191124897692 +10.179555707869 +10.168346563138 +10.157497585171 +10.147008892393 +10.136880600096 +10.127112820542 +10.117705663071 +10.108659234201 +10.099973637727 +10.091648974821 +10.083685344126 +10.076082841848 +10.068841561851 +10.061961595741 +10.055443032961 +10.049285960870 +10.043490464833 +10.038056628299 +10.032984532886 +10.028274258457 +10.023925883197 +10.019939483691 +10.016315134997 +10.013052910713 +10.010152883055 +10.007615122916 +10.005439699938 +10.003626682573 +10.002176138143 +10.001088132903 +10.000362732094 +10.000000000000 +10.000000000000 +0.000000000000 +-0.000004949639 +-0.000014600452 +-0.000028667980 +-0.000046857651 +-0.000068877292 +-0.000094445173 +-0.000123293552 +-0.000155167036 +-0.000189816944 +-0.000226994476 +-0.000266445205 +-0.000307905965 +-0.000351103949 +-0.000395757281 +-0.000441576364 +-0.000488265520 +-0.000535524628 +-0.000583050599 +-0.000630538587 +-0.000677682883 +-0.000724177459 +-0.000769716153 +-0.000813992501 +-0.000856699273 +-0.000897527775 +-0.000936166991 +-0.000972302690 +-0.001005616552 +-0.001035785417 +-0.001062480698 +-0.001085367981 +-0.001104106836 +-0.001118350795 +-0.001127747491 +-0.001131938909 +-0.001130561703 +-0.001123247553 +-0.001109623507 +-0.001089312294 +-0.001061932580 +-0.001027099143 +-0.000984422971 +-0.000933511271 +-0.000873967391 +-0.000805390674 +-0.000727376230 +-0.000639514668 +-0.000541391779 +-0.000432588205 +-0.000312679092 +-0.000181233758 +-0.000037815385 +0.000118019256 +0.000286720032 +0.000468743618 +0.000664553623 +0.000874620643 +0.001099422280 +0.001339443112 +0.001595174626 +0.001867115148 +0.002155769754 +0.002461650206 +0.002785274903 +0.003127168880 +0.003487863846 +0.003867898284 +0.004267817604 +0.004688174363 +0.005129528534 +0.005592447839 +0.006077508122 +0.006585293763 +0.007116398131 +0.007671424043 +0.008250984254 +0.008855701930 +0.009486211129 +0.010143157252 +0.010827197478 +0.011539001163 +0.012279250196 +0.013048639317 +0.013847876384 +0.014677682590 +0.015538792640 +0.016431954881 +0.017357931388 +0.018317498037 +0.019311444543 +0.020340574506 +0.021405705455 +0.022507668918 +0.023647310529 +0.024825490174 +0.026043082204 +0.027300975711 +0.028600074870 +0.029941299365 +0.031325584886 +0.032753883693 +0.034227165258 +0.035746416958 +0.037312644828 +0.038926874355 +0.040590151314 +0.042303542619 +0.044068137212 +0.045885046951 +0.047755407508 +0.049680379278 +0.051661148277 +0.053698927042 +0.055794955536 +0.057950502042 +0.060166864065 +0.062445369243 +0.064787376269 +0.067194275825 +0.069667491555 +0.072208481061 +0.074818736943 +0.077499787898 +0.080253199863 +0.083080577233 +0.085983564154 +0.088963845882 +0.092023150237 +0.095163249138 +0.098385960235 +0.101693148625 +0.105086728671 +0.108568665916 +0.112140979098 +0.115805742258 +0.119565086971 +0.123421204661 +0.127376349055 +0.131432838734 +0.135593059828 +0.139859468838 +0.144234595610 +0.148721046457 +0.153321507461 +0.158038747948 +0.162875624159 +0.167835083123 +0.172920166748 +0.178134016139 +0.183479876146 +0.188961100160 +0.194581155158 +0.200343626999 +0.206252225985 +0.212310792682 +0.218523304004 +0.224893879579 +0.231426788369 +0.238126455576 +0.244997469819 +0.252044590585 +0.259272755949 +0.266687090554 +0.274292913842 +0.282095748494 +0.290101329060 +0.298315610686 +0.306744777888 +0.315395253229 +0.324273705757 +0.333387059001 +0.342742498276 +0.352347476985 +0.362209721518 +0.372337234314 +0.382738294493 +0.393421455417 +0.404395538400 +0.415669621646 +0.427253023375 +0.439155277958 +0.451386103712 +0.463955360928 +0.476872998599 +0.490148988340 +0.503793244061 +0.517815526270 +0.532225330337 +0.547031758780 +0.562243378675 +0.577868066580 +0.593912844877 +0.610383715070 +0.627285495101 +0.644621668930 +0.662394257227 +0.680603717738 +0.699248882677 +0.718326938310 +0.737833448975 +0.757762424560 +0.778106427223 +0.798856710586 +0.820003382805 +0.841535584201 +0.863441670342 +0.885709392474 +0.908326068713 +0.931278741169 +0.954554315928 +0.978139684352 +1.002021825475 +1.026187890212 +1.050625268742 +1.075321642835 +1.100265025038 +1.125443786675 +1.150846676473 +1.176462831517 +1.202281781988 +1.228293450980 +1.254488150444 +1.280856574162 +1.307389788482 +1.334079221392 +1.360916650424 +1.387902032059 +1.415035320149 +1.442316466481 +1.469745421031 +1.497322132103 +1.525046546431 +1.552918609250 +1.580938264362 +1.609105454190 +1.637420119833 +1.665882201117 +1.694491636648 +1.723248363859 +1.752152319070 +1.781203437534 +1.810401653497 +1.839746900250 +1.869239110186 +1.898878214854 +1.928664145022 +1.958596830721 +1.988676201313 +2.018902185535 +2.049274711556 +2.079793707026 +2.110459099121 +2.141270814589 +2.172228779791 +2.203332920731 +2.234583163093 +2.265979432261 +2.297521653338 +2.329209751159 +2.361043650298 +2.393023275056 +2.425148549461 +2.457419397237 +2.489835741781 +2.522397506119 +2.555104612861 +2.587956984136 +2.620954541526 +2.654097205980 +2.687384897724 +2.720817536154 +2.754395039721 +2.788117325798 +2.821984310538 +2.855995908706 +2.890152033486 +2.924452595807 +2.958897504251 +2.993486664965 +3.028219981562 +3.063097355034 +3.098118683658 +3.133283862912 +3.168592785387 +3.204045340696 +3.239641415397 +3.275380892908 +3.311263653429 +3.347289573859 +3.383458527729 +3.419770385121 +3.456225012599 +3.492822273142 +3.529562026074 +3.566444126997 +3.603468427733 +3.640634776254 +3.677943016627 +3.715392988952 +3.752984529301 +3.790717469659 +3.828591637867 +3.866606857558 +3.904762948094 +3.943059724508 +3.981496997429 +4.020074573020 +4.058792252895 +4.097649834043 +4.136647108741 +4.175783864456 +4.215059883747 +4.254474944148 +4.294028818043 +4.333721272532 +4.373552069274 +4.413520964323 +4.453627707943 +4.493872044400 +4.534253711738 +4.574772441529 +4.615427958598 +4.656219980720 +4.697148218291 +4.738212373960 +4.779412142232 +4.820747209033 +4.862217251234 +4.903821936130 +4.945560920881 +4.987433851894 +5.029440364160 +5.071580080533 +5.113852610949 +5.156257551580 +5.198794483921 +5.241462973808 +5.284262570344 +5.327192804759 +5.370253189161 +5.413443215203 +5.456762352632 +5.500210047733 +5.543785721635 +5.587488768488 +5.631318553489 +5.675274410728 +5.719355640872 +5.763561508619 +5.807891239941 +5.852344019068 +5.896918985172 +5.941615228742 +5.986431787578 +6.031367642371 +6.076421711794 +6.121592847044 +6.166879825744 +6.212281345096 +6.257796014176 +6.303422345200 +6.349158743609 +6.395003496716 +6.440954760681 +6.487010545453 +6.533168697270 +6.579426878202 +6.625782542069 +6.672232905904 +6.718774915876 +6.765405206282 +6.812120049759 +6.858915296286 +6.905786297678 +6.952727813059 +6.999733889033 +7.046797705652 +7.093911375296 +7.141065675492 +7.188249687092 +7.235450293641 +7.282651471887 +7.329833258215 +7.376970189562 +7.424028900862 +7.470964263380 +7.517713586339 +7.564187796378 +7.610266057653 +7.655809207559 +7.700725197386 +7.744991315175 +7.788625951108 +7.831658009996 +7.874115391451 +7.916022012348 +7.957397789412 +7.998259235279 +8.038620118306 +8.078492018675 +8.117884771468 +8.156806809182 +8.195265426589 +8.233266986207 +8.270817079057 +8.307920651649 +8.344582107301 +8.380805387772 +8.416594039667 +8.451951268943 +8.486879986021 +8.521382843436 +8.555462267469 +8.589120484935 +8.622359545988 +8.655181343678 +8.687587630789 +8.719580034440 +8.751160068785 +8.782329146121 +8.813088586639 +8.843439627030 +8.873383428082 +8.902921081441 +8.932053615621 +8.960782001373 +8.989107156499 +9.017029950165 +9.044551206785 +9.071671709525 +9.098392203468 +9.124713398469 +9.150635971756 +9.176160570281 +9.201287812862 +9.226018292124 +9.250352576277 +9.274291210731 +9.297834719570 +9.320983606898 +9.343738358074 +9.366099440834 +9.388067306321 +9.409642390035 +9.430825112693 +9.451615881026 +9.472015088506 +9.492023116019 +9.511640332482 +9.530867095408 +9.549703751435 +9.568150636806 +9.586208077821 +9.603876391251 +9.621155884723 +9.638046857085 +9.654549598733 +9.670664391934 +9.686391511114 +9.701731223141 +9.716683787581 +9.731249456953 +9.745428476957 +9.759221086706 +9.772627518935 +9.785648000209 +9.798282751121 +9.810531986485 +9.822395915518 +9.833874742019 +9.844968664547 +9.855677876587 +9.866002566718 +9.875942918776 +9.885499112010 +9.894671321240 +9.903459717009 +9.911864465732 +9.919885729848 +9.927523667959 +9.934778434977 +9.941650182263 +9.948139057764 +9.954245206149 +9.959968768942 +9.965309884655 +9.970268688913 +9.974845314577 +9.979039891876 +9.982852548517 +9.986283409809 +9.989332598773 +9.992000236257 +9.994286441040 +9.996191329940 +9.997715017916 +9.998857618163 +9.999619242208 +10.000000000000 +10.000000000000 +0.000000000000 +0.091641834924 +0.183273512502 +0.274893523047 +0.366501414779 +0.458097252107 +0.549681433739 +0.641254508355 +0.732816959961 +0.824369041239 +0.915910721283 +1.007441738320 +1.098961698081 +1.190470165026 +1.281966724322 +1.373451015107 +1.464922743499 +1.556381683328 +1.647827669833 +1.739260589195 +1.830680365439 +1.922086945713 +2.013480284918 +2.104860330778 +2.196227010560 +2.287580220582 +2.378919819355 +2.470245624766 +2.561557415212 +2.652854934064 +2.744137896583 +2.835405998181 +2.926658923004 +3.017896351924 +3.109117969310 +3.200323468155 +3.291512553412 +3.382684943547 +3.473840370484 +3.564978578173 +3.656099320079 +3.747202355908 +3.838287447836 +3.929354356552 +4.020402837325 +4.111432636324 +4.202443487349 +4.293435109121 +4.384407203219 +4.475359452742 +4.566291521710 +4.657203055215 +4.748093680262 +4.838963007242 +4.929810631901 +5.020636137681 +5.111439098254 +5.202219080064 +5.292975644697 +5.383708350887 +5.474416756012 +5.565100416956 +5.655758890254 +5.746391731500 +5.836998494042 +5.927578727023 +6.018131972880 +6.108657764433 +6.199155621704 +6.289625048613 +6.380065529695 +6.470476526960 +6.560857476998 +6.651207788421 +6.741526839705 +6.831813977479 +6.922068515282 +7.012289732818 +7.102476875701 +7.192629155687 +7.282745751356 +7.372825809230 +7.462868445258 +7.552872746606 +7.642837773670 +7.732762562191 +7.822646125376 +7.912487455863 +8.002285527401 +8.092039296089 +8.181747701057 +8.271409664445 +8.361024090611 +8.450589864508 +8.540105849217 +8.629570882671 +8.718983773644 +8.808343297113 +8.897648189126 +8.986897141334 +9.076088795337 +9.165221736990 +9.254294490817 +9.343305514625 +9.432253194413 +9.521135839633 +9.609951678814 +9.698698855567 +9.787375424939 +9.875979350060 +9.964508499044 +10.052960642043 +10.141333448379 +10.229624483662 +10.317831206776 +10.405950966635 +10.493980998594 +10.581918420413 +10.669760227653 +10.757503288414 +10.845144337312 +10.932679968618 +11.020106628487 +11.107420606214 +11.194618024495 +11.281694828644 +11.368646774770 +11.455469416906 +11.542158093088 +11.628707910383 +11.715113728871 +11.801370144549 +11.887471471126 +11.973411720644 +12.059184582834 +12.144783403075 +12.230201158803 +12.315430434155 +12.400463392640 +12.485291747528 +12.569906729699 +12.654299052578 +12.738458873843 +12.822375753505 +12.906038607980 +12.989435659756 +13.072554382238 +13.155381439332 +13.237902619341 +13.320102762669 +13.401965682843 +13.483474080260 +13.564609448034 +13.645351969169 +13.725680404232 +13.805571968470 +13.885002197223 +13.963944798219 +14.042371489161 +14.120251818764 +14.197552969136 +14.274239537189 +14.350273292486 +14.425612908745 +14.500213666030 +14.574027120533 +14.647000738805 +14.719077493285 +14.790195416121 +14.860287108486 +14.929279202942 +14.997091776964 +15.063637716463 +15.128822029205 +15.192541109494 +15.254681957519 +15.315121359584 +15.373725039311 +15.430346795134 +15.484827646377 +15.536995019321 +15.586662016180 +15.633626824174 +15.677672338705 +15.718566093587 +15.756060611022 +15.789894302419 +15.819793064666 +15.845472720372 +15.866642438989 +15.883009242118 +15.894283635118 +15.900186315307 +15.900455786640 +15.894856571082 +15.883187565778 +15.865289978018 +15.841054205600 +15.810425043792 +15.773404704614 +15.730053323805 +15.680486878830 +15.624872705293 +15.563423031903 +15.496387116684 +15.424042638226 +15.346686976064 +15.264628921990 +15.178181227949 +15.087654245659 +14.993350772576 +14.895562103597 +14.794565204590 +14.690620872148 +14.583972719261 +14.474846822353 +14.363451874802 +14.249979709856 +14.134606077323 +14.017491580505 +13.898782700502 +13.778612853237 +13.657103439860 +13.534364863599 +13.410497495769 +13.285592580976 +13.159733076851 +13.033868626371 +12.907998931692 +12.782123759682 +12.656242905683 +12.530356181477 +12.404463410088 +12.278564423199 +12.152659059773 +12.026747165327 +11.900828591541 +11.774903196099 +11.648970842646 +11.523031400827 +11.397084746363 +11.271130761152 +11.145169333361 +11.019200357517 +10.893223734566 +10.767239371909 +10.641247183394 +10.515247089268 +10.389239016084 +10.263222896551 +10.137198669331 +10.011166278779 +9.885125674622 +9.759076811577 +9.633019648900 +9.506954149883 +9.380880281275 +9.254798012646 +9.128707315687 +9.002608163444 +8.876500529499 +8.750384387089 +8.624259708167 +8.498126462416 +8.371984616211 +8.245834131538 +8.119674964868 +7.993507065995 +7.867330376844 +7.741144830242 +7.614950348661 +7.488746842924 +7.362534210861 +7.236312335870 +7.110081085273 +6.983840308156 +6.857589831625 +6.731329408437 +6.605058781235 +6.478777682639 +6.352485835372 +6.226182952396 +6.099868737081 +5.973542883385 +5.847205076059 +5.720854990869 +5.594492294827 +5.468116646447 +5.341727695996 +5.215325085770 +5.088908450361 +4.962477416937 +4.836031605514 +4.709570629223 +4.583094094577 +4.456601601711 +4.330092744619 +4.203567111357 +4.077024284225 +3.950463839914 +3.823885349618 +3.697288379096 +3.570672488690 +3.444037233280 +3.317382162182 +3.190706818971 +3.064010741230 +2.937293460212 +2.810554500413 +2.683793379040 +2.557009605383 +2.430202680059 +2.303372094146 +2.176517328176 +2.049637851001 +1.922733118502 +1.795802572157 +1.668845637441 +1.541861722057 +1.414850213998 +1.287810479425 +1.160741860349 +1.033643672126 +0.906515200747 +0.779355699912 +0.652164387896 +0.524940444185 +0.397683005886 +0.270391163894 +0.143063958815 +0.015700376632 +-0.111700655895 +-0.239140276106 +-0.366619690612 +-0.494140180768 +-0.621703108472 +-0.749309922312 +-0.876962164081 +-1.004661475693 +-1.132409606528 +-1.260208421262 +-1.388059908209 +-1.515966188252 +-1.643929524409 +-1.771952332130 +-1.900037190402 +-2.028186853777 +-2.156404265441 +-2.284692571475 +-2.413055136472 +-2.541495560712 +-2.670017699127 +-2.798625682324 +-2.927323939997 +-3.056117227079 +-3.185010653093 +-3.314009715223 +-3.443120335678 +-3.572348904114 +-3.701702325939 +-3.831188077493 +-3.960814269334 +-4.090589718991 +-4.220524034899 +-4.350627713509 +-4.480912251857 +-4.611390278482 +-4.742075705875 +-4.872983908321 +-5.004131929485 +-5.135538724627 +-5.267225442692 +-5.399215753376 +-5.531536223335 +-5.664216742814 +-5.797290997577 +-5.930796967219 +-6.064777402246 +-6.199280172975 +-6.334358260741 +-6.470068907579 +-6.606470913265 +-6.743617906810 +-6.881542854412 +-7.020223046475 +-7.159498370157 +-7.298876784747 +-7.437058128054 +-7.570746540966 +-7.692287476748 +-7.786860572942 +-7.843251373274 +-7.862535400804 +-7.855127082253 +-7.830307694402 +-7.793918910480 +-7.749593147286 +-7.699587188211 +-7.645367119637 +-7.587921227931 +-7.527940734553 +-7.465924020878 +-7.402240517535 +-7.337170587603 +-7.270931446568 +-7.203694448627 +-7.135596926227 +-7.066750493094 +-6.997246991119 +-6.927162831155 +-6.856562216200 +-6.785499572122 +-6.714021406814 +-6.642167750555 +-6.569973285149 +-6.497468238665 +-6.424679101559 +-6.351629205107 +-6.278339192642 +-6.204827406503 +-6.131110208142 +-6.057202244772 +-5.983116672910 +-5.908865346962 +-5.834458979192 +-5.759907276182 +-5.685219055820 +-5.610402348074 +-5.535464482211 +-5.460412162593 +-5.385251534828 +-5.309988243717 +-5.234627484199 +-5.159174046297 +-5.083632354896 +-5.008006505043 +-4.932300293373 +-4.856517246146 +-4.780660644322 +-4.704733546036 +-4.628738806771 +-4.552679097509 +-4.476556921072 +-4.400374626858 +-4.324134424148 +-4.247838394117 +-4.171488500696 +-4.095086600399 +-4.018634451200 +-3.942133720571 +-3.865585992748 +-3.788992775302 +-3.712355505079 +-3.635675553563 +-3.558954231717 +-3.482192794358 +-3.405392444089 +-3.328554334852 +-3.251679575115 +-3.174769230743 +-3.097824327580 +-3.020845853756 +-2.943834761767 +-2.866791970334 +-2.789718366071 +-2.712614804973 +-2.635482113764 +-2.558321091084 +-2.481132508577 +-2.403917111849 +-2.326675621345 +-2.249408733133 +-2.172117119617 +-2.094801430184 +-2.017462291804 +-1.940100309568 +-1.862716067203 +-1.785310127541 +-1.707883032967 +-1.630435305844 +-1.552967448922 +-1.475479945728 +-1.397973260955 +-1.320447840839 +-1.242904113537 +-1.165342489502 +-1.087763361857 +-1.010167106782 +-0.932554083892 +-0.854924636639 +-0.777279092705 +-0.699617764412 +-0.621940949144 +-0.544248929771 +-0.466541975089 +-0.388820340268 +-0.311084267314 +-0.233333985533 +-0.155569712016 +-0.077791652127 +0.000000000000 +0.000000000000 +-0.001061501392 +-0.002069716637 +-0.003016927071 +-0.003900963125 +-0.004722339905 +-0.005483296747 +-0.006186833614 +-0.006835598440 +-0.007431031381 +-0.007973106677 +-0.008460617096 +-0.008891689105 +-0.009264254916 +-0.009576369324 +-0.009826376585 +-0.010012972653 +-0.010135204875 +-0.010192436437 +-0.010184290535 +-0.010110582231 +-0.009971243194 +-0.009766244227 +-0.009495521085 +-0.009158909484 +-0.008756094733 +-0.008286579970 +-0.007749674662 +-0.007144502487 +-0.006470025405 +-0.005725079175 +-0.004908414895 +-0.004018741432 +-0.003054764418 +-0.002015218764 +-0.000898892885 +0.000295356002 +0.001568595226 +0.002921817763 +0.004355949772 +0.005871863084 +0.007470391128 +0.009152346826 +0.010918541153 +0.012769801210 +0.014706986842 +0.016731005038 +0.018842821516 +0.021043469104 +0.023334052659 +0.025715750499 +0.028189812422 +0.030757554611 +0.033420351826 +0.036179627484 +0.039036842295 +0.041993482253 +0.045051046814 +0.048211038069 +0.051474951697 +0.054844270314 +0.058320459695 +0.061904968134 +0.065599228970 +0.069404666120 +0.073322702236 +0.077354768988 +0.081502318852 +0.085766837757 +0.090149857944 +0.094652970436 +0.099277836603 +0.104026198390 +0.108899886880 +0.113900828964 +0.119031051959 +0.124292686123 +0.129687965035 +0.135219223915 +0.140888895975 +0.146699506950 +0.152653668025 +0.158754067408 +0.165003460870 +0.171404661640 +0.177960530073 +0.184673963600 +0.191547887450 +0.198585246707 +0.205789000164 +0.213162116470 +0.220707572890 +0.228428356939 +0.236327470969 +0.244407939642 +0.252672820049 +0.261125214114 +0.269768282785 +0.278605261433 +0.287639475877 +0.296874358411 +0.306313463303 +0.315960481276 +0.325819252597 +0.335893778520 +0.346188230915 +0.356706960041 +0.367454500512 +0.378435575588 +0.389655099976 +0.401118181402 +0.412830121216 +0.424796414366 +0.437022749025 +0.449515006230 +0.462279259831 +0.475321777066 +0.488649020045 +0.502267648406 +0.516184523347 +0.530406713227 +0.544941500833 +0.559796392407 +0.574979128404 +0.590497695966 +0.606360342980 +0.622575593590 +0.639152264984 +0.656099485258 +0.673426712162 +0.691143752557 +0.709260782425 +0.727788367336 +0.746737483324 +0.766119538187 +0.785946393284 +0.806230385977 +0.826984352902 +0.848221654316 +0.869956199779 +0.892202475459 +0.914975573318 +0.938291222445 +0.962165822733 +0.986616481050 +1.011661049998 +1.037318169257 +1.063607309452 +1.090548818415 +1.118163969636 +1.146475012665 +1.175505225219 +1.205278966701 +1.235821732904 +1.267160211674 +1.299322339370 +1.332337357995 +1.366235872918 +1.401049911112 +1.436812979815 +1.473560125402 +1.511327992112 +1.550154879956 +1.590080800769 +1.631147530766 +1.673398657330 +1.716879616864 +1.761637719536 +1.807722155611 +1.855183976742 +1.904076044162 +1.954452934158 +2.006370789518 +2.059887103754 +2.115060422916 +2.171949947579 +2.230615015154 +2.291114440099 +2.353505686922 +2.417843848354 +2.484180399005 +2.552561693926 +2.623027182503 +2.695607312408 +2.770321107325 +2.847173417832 +2.926151868984 +3.007223562423 +3.090331636000 +3.175391838720 +3.262289339772 +3.350876050151 +3.440968783042 +3.532348600633 +3.624761675495 +3.717921921869 +3.811515521751 +3.905207290099 +3.998648614799 +4.091486504598 +4.183373121353 +4.273975096018 +4.362981948928 +4.450113050493 +4.535122743626 +4.617803466115 +4.697986919716 +4.775543501188 +4.850380321315 +4.922438188191 +4.991687929235 +5.058126387188 +5.121772364545 +5.182662722394 +5.240848773595 +5.296393052684 +5.349366498936 +5.399846054828 +5.447912658953 +5.493649598187 +5.537141176833 +5.578471658454 +5.617724437598 +5.654981402230 +5.690322452426 +5.723825145952 +5.755564446332 +5.787294413561 +5.819014483608 +5.850724214169 +5.882423216360 +5.914111132051 +5.945787624064 +5.977452371298 +6.009105066156 +6.040745413158 +6.072373128227 +6.103987938386 +6.135589581689 +6.167177807300 +6.198752375654 +6.230313058648 +6.261859639839 +6.293391914616 +6.324909690335 +6.356412786392 +6.387901034229 +6.419374277256 +6.450832370684 +6.482275181262 +6.513702586903 +6.545114476206 +6.576510747856 +6.607891309915 +6.639256078981 +6.670604979231 +6.701937941340 +6.733254901273 +6.764555798960 +6.795840576845 +6.827109178324 +6.858361546062 +6.889597620211 +6.920817336516 +6.952020624326 +6.983207404523 +7.014377587354 +7.045531070196 +7.076667735252 +7.107787447178 +7.138890050648 +7.169975367841 +7.201043195832 +7.232093303786 +7.263125429762 +7.294139276504 +7.325134504196 +7.356110629832 +7.387067150315 +7.418003542594 +7.448919263832 +7.479813751620 +7.510686424231 +7.541536680916 +7.572363902221 +7.603167450354 +7.633946669563 +7.664700886550 +7.695429410897 +7.726131535511 +7.756806537076 +7.787453676510 +7.818072199414 +7.848661336518 +7.879220304102 +7.909748304395 +7.940244525936 +7.970708143895 +8.001138320334 +8.031534204408 +8.061894932487 +8.092219628189 +8.122507402318 +8.152757352678 +8.182968563774 +8.213140106356 +8.243271036818 +8.273360396426 +8.303407210344 +8.333410486478 +8.363369214084 +8.393282362141 +8.423148877479 +8.452967682624 +8.482737673357 +8.512457715966 +8.542126644171 +8.571743255701 +8.601306308514 +8.630814516623 +8.660266545533 +8.689661007248 +8.718996454838 +8.748271376543 +8.777484189401 +8.806633232359 +8.835716758865 +8.864732928899 +8.893679800424 +8.922555320230 +8.951357314125 +8.980083476452 +9.008731358876 +9.037298358402 +9.065781704564 +9.094178445724 +9.122485434403 +9.150699311565 +9.178816489748 +9.206833134920 +9.234745146943 +9.262548138455 +9.290237412012 +9.317807935252 +9.345254313821 +9.372570761780 +9.399751069106 +9.426788565900 +9.453676082781 +9.480405906908 +9.506969732925 +9.533358608014 +9.559562870099 +9.585572078025 +9.611374932333 +9.636959184974 +9.662311535925 +9.687417514339 +9.712261341178 +9.736825769787 +9.761091899960 +9.785038959932 +9.808644049593 +9.831881836273 +9.854724192356 +9.877139761185 +9.899093433588 +9.920545712623 +9.941451937139 +9.961761325523 +9.981415788360 +10.000348441013 +10.018481722189 +10.035724988653 +10.051971403672 +10.067093858334 +10.080939545770 +10.093322624786 +10.104014122113 +10.112727764361 +10.119099682715 +10.122658641066 +10.122781247601 +10.118622450032 +10.109002834834 +10.092227736390 +10.065774313177 +10.025876204087 +9.966875390781 +9.881960080108 +9.767199907989 +9.632698937281 +9.493327152090 +9.357899331849 +9.228670447087 +9.105424923369 +8.987308620799 +8.873463666273 +8.763160017063 +8.655809134975 +8.550941742407 +8.448183585215 +8.347233864363 +8.247848582598 +8.149827808760 +8.053006087265 +7.957245196205 +7.862428642076 +7.768457438969 +7.675246842141 +7.582723795772 +7.490824919706 +7.399494906697 +7.308685235190 +7.218353126867 +7.128460695714 +7.038974248233 +6.949863703880 +6.861102111856 +6.772665245713 +6.684531261191 +6.596680405798 +6.509094770999 +6.421758079667 +6.334655502920 +6.247773501534 +6.161099688059 +6.074622706425 +5.988332126399 +5.902218350740 +5.816272533208 +5.730486505935 +5.644852714878 +5.559364162290 +5.474014355307 +5.388797259870 +5.303707259361 +5.218739117359 +5.133887944065 +5.049149165976 +4.964518498451 +4.879991920864 +4.795565654081 +4.711236140021 +4.627000023095 +4.542854133356 +4.458795471183 +4.374821193371 +4.290928600499 +4.207115125455 +4.123378323026 +4.039715860456 +3.956125508894 +3.872605135647 +3.789152697181 +3.705766232798 +3.622443858930 +3.539183764002 +3.455984203816 +3.372843497397 +3.289760023274 +3.206732216149 +3.123758563916 +3.040837605000 +2.957967925984 +2.875148159495 +2.792376982316 +2.709653113708 +2.626975313919 +2.544342382846 +2.461753158846 +2.379206517670 +2.296701371503 +2.214236668101 +2.131811390006 +2.049424553821 +1.967075209554 +1.884762439994 +1.802485360130 +1.720243116598 +1.638034887146 +1.555859880111 +1.473717333910 +1.391606516527 +1.309526724999 +1.227477284902 +1.145457549821 +1.063466900808 +0.981504745832 +0.899570519201 +0.817663680976 +0.735783716360 +0.653930135063 +0.572102470655 +0.490300279884 +0.408523141983 +0.326770657949 +0.245042449801 +0.163338159814 +0.081657449741 +-0.000000000000 +0.605043016810 +24.558540070983 +24.556361722971 +24.553859607107 +24.551260602190 +24.548675410324 +24.546175725842 +24.543793711174 +24.541515496818 +24.539291472592 +24.537060820329 +24.534774028030 +24.532402680814 +24.529937927458 +24.527384208759 +24.524753099742 +24.522058964448 +24.519316324752 +24.516538350434 +24.513735966361 +24.510917288492 +24.508087276268 +24.505247591947 +24.502396696387 +24.499530202748 +24.496641473343 +24.493722399856 +24.490764270971 +24.487758616348 +24.484697925434 +24.481576169051 +24.478389090906 +24.475134274220 +24.471811017567 +24.468420070331 +24.464963282428 +24.461443218477 +24.457862776937 +24.454224843508 +24.450531997337 +24.446786279686 +24.442989027889 +24.439140772788 +24.435241194754 +24.431289131721 +24.427282631789 +24.423219042665 +24.419095130224 +24.414907218555 +24.410651343924 +24.406323415096 +24.401919372332 +24.397435337316 +24.392867746278 +24.388213458906 +24.383469836395 +24.378634783304 +24.373706749857 +24.368684693788 +24.363568003711 +24.358356388905 +24.353049743062 +24.347647991549 +24.342150932840 +24.336558084834 +24.330868545785 +24.325080877760 +24.319193018141 +24.313202222134 +24.307105036745 +24.300897304645 +24.294574194807 +24.288130255872 +24.281559487831 +24.274855427665 +24.268011244907 +24.261019843592 +24.253873967460 +24.246566305658 +24.239089596297 +24.231436725202 +24.223600816911 +24.215575314693 +24.207354045914 +24.198931268856 +24.190301696989 +24.181460497032 +24.172403257811 +24.163125928148 +24.153624723659 +24.143896004309 +24.133936126750 +24.123741277500 +24.113307294785 +24.102629487975 +24.091702463949 +24.080519969236 +24.069074755556 +24.057358474437 +24.045361604299 +24.033073410919 +24.020481939870 +24.007574037557 +23.994335395981 +23.980750615437 +23.966803278952 +23.952476032348 +23.937750664151 +23.922608180259 +23.907028868907 +23.890992352240 +23.874477621452 +23.857463053068 +23.839926404441 +23.821844787066 +23.803194616714 +23.783951539911 +23.764090336758 +23.743584800653 +23.722407596075 +23.700530096175 +23.677922202504 +23.654552149687 +23.630386298185 +23.605388918398 +23.579521969248 +23.552744873946 +23.525014294969 +23.496283909284 +23.466504183718 +23.435622149033 +23.403581169942 +23.370320706914 +23.335776064434 +23.299878119330 +23.262553021977 +23.223721862700 +23.183300295455 +23.141198110994 +23.097318752093 +23.051558764025 +23.003807174322 +22.953944796717 +22.901843455135 +22.847365124340 +22.790360984389 +22.730670386188 +22.668119725022 +22.602521217888 +22.533671578667 +22.461350582578 +22.385319507997 +22.305319439584 +22.221069411891 +22.132264367366 +22.038572897092 +21.939634727013 +21.835057907087 +21.724415656125 +21.607242811453 +21.483031830429 +21.351228290663 +21.211225838018 +21.062360536430 +20.903904581497 +20.735059350787 +20.554947777894 +20.362606054354 +20.156974683811 +19.936888936782 +19.701068783331 +19.448108417268 +19.176465533061 +18.884450581023 +18.570216315073 +18.231748069984 +17.866855372555 +17.473165715887 +17.048121619760 +16.588982472591 +16.092833104914 +15.556601572445 +14.977089200253 +14.351016500088 +13.675089019851 +12.946087364308 +12.160985327911 +11.317099041648 +10.412267972550 +9.445065282123 +8.415030341543 +7.322910278526 +6.170890864186 +4.962790916644 +3.704190266893 +2.402461028409 +1.066677049440 +-0.292612255963 +-1.663740787753 +-3.034394928967 +-4.392152338497 +-5.725037180001 +-7.022035169496 +-8.273518515184 +-9.471545897990 +-10.610022232661 +-11.684722448145 +-12.693199067243 +-13.634602794820 +-14.509448384145 +-15.319355924444 +-16.066792258942 +-16.754830396611 +-17.386938005212 +-17.966800286448 +-18.498178138521 +-18.984799535350 +-19.430280306883 +-19.838069712846 +-20.211416078106 +-20.553348055161 +-20.866667606937 +-21.153951425295 +-21.417558128741 +-21.659639164654 +-21.882151850280 +-22.086873413234 +-22.087934210483 +-22.089058883197 +-22.090233553375 +-22.091452114964 +-22.092711041508 +-22.094007922342 +-22.095340900973 +-22.096708414987 +-22.098109060151 +-22.099541513605 +-22.101004488346 +-22.102496705755 +-22.104016879295 +-22.105563705548 +-22.107135860331 +-22.108731998520 +-22.110350756664 +-22.111990757786 +-22.113650617956 +-22.115328954311 +-22.117024394290 +-22.118735585891 +-22.120461208781 +-22.122199986144 +-22.123950697107 +-22.125712189659 +-22.127483393925 +-22.129263335707 +-22.131051150171 +-22.132846095589 +-22.134647567012 +-22.136455109795 +-22.138268432846 +-22.140087421522 +-22.141912150054 +-22.143742893412 +-22.145580138533 +-22.147424594808 +-22.149277203787 +-22.151139148045 +-22.153011859224 +-22.154897025304 +-22.156796597336 +-22.158712796101 +-22.160648119764 +-22.162605354896 +-22.164587596528 +-22.166598292055 +-22.168641353060 +-22.170721492757 +-22.172854656207 +-22.175043012821 +-22.177288711453 +-22.179593875345 +-22.181960597251 +-22.184390934787 +-22.186886906068 +-22.189450485644 +-22.192083600808 +-22.194788128310 +-22.197565891526 +-22.200418658143 +-22.203348138397 +-22.206355983932 +-22.209443787332 +-22.212613082367 +-22.215865345045 +-22.219201995490 +-22.222624400734 +-22.226133878473 +-22.229731701841 +-22.233419105279 +-22.237197291532 +-22.241067439872 +-22.245030715568 +-22.249088280666 +-22.253241306163 +-22.257490985570 +-22.261838549967 +-22.266285284558 +-22.270832546772 +-22.275481785952 +-22.280234564645 +-22.285092581534 +-22.290057696004 +-22.295131954372 +-22.300317617775 +-22.305617191702 +-22.311033457182 +-22.316569503590 +-22.322228763062 +-22.328015046493 +-22.333932581084 +-22.339986049421 +-22.346180630050 +-22.352522039532 +-22.359016575958 +-22.365671163931 +-22.372493401007 +-22.379491605659 +-22.386674866779 +-22.394053094852 +-22.401637074903 +-22.409438521387 +-22.417470135287 +-22.425745663664 +-22.434279962066 +-22.443089060251 +-22.452190231746 +-22.461602067960 +-22.471344557609 +-22.481439172414 +-22.491908960249 +-22.502778646942 +-22.514074748432 +-22.525825694896 +-22.538061969133 +-22.550816261526 +-22.564123644470 +-22.578021769574 +-22.592551091500 +-22.607755123029 +-22.623680726248 +-22.640378446766 +-22.657902897287 +-22.676313199649 +-22.695673495272 +-22.716053535581 +-22.737529366212 +-22.760184124739 +-22.784108962054 +-22.809404127623 +-22.836180229313 +-22.864559709255 +-22.894678582523 +-22.926688465978 +-22.960758978108 +-22.997080562527 +-23.035867805501 +-23.077363369037 +-23.121842610655 +-23.169619026790 +-23.221050632970 +-23.276547391305 +-23.336579759348 +-23.401688339223 +-23.472494412991 +-23.549710759242 +-23.634151366585 +-23.726737090955 +-23.828491103968 +-23.940511401729 +-24.063894095457 +-24.199552936048 +-24.347821997009 +-24.507592354566 +-24.674432654804 +-24.836402646841 +-24.964034782596 +-24.986143694912 +-24.729419367571 +-23.765863938629 +-21.160711731239 +-15.377179391459 +-7.188590824073 +0.769340690038 +6.493790595692 +10.227774626809 +12.708951367199 +14.411118726553 +15.629295528143 +16.533054929870 +17.224866090576 +17.768437654341 +18.205126173672 +18.562586470737 +18.859920003571 +19.110669426683 +19.324670168967 +19.509218546381 +19.669830204943 +19.810745419456 +19.935273535281 +20.046032654009 +20.145119581661 +20.234232410764 +20.314760331493 +20.387850380978 +20.454457707791 +20.515383882396 +20.571306423177 +20.622801787590 +20.670363447473 +20.714416224582 +20.755327755634 +20.793417734854 +20.828965414494 +20.862215737975 +20.893384384446 +20.922661943795 +20.950217393148 +20.976201005634 +21.000746797883 +21.023974601071 +21.045991818392 +21.066894927170 +21.086770765737 +21.105697642265 +21.123746293394 +21.140980716861 +21.157458897366 +21.173233441919 +21.188352138062 +21.202858446048 +21.216791934437 +21.230188666774 +21.243081546091 +21.255500622637 +21.267473369613 +21.279024930863 +21.290178343883 +21.300954741069 +21.311373531624 +21.321452566283 +21.331208286647 +21.340655860714 +21.349809305972 +21.358681601253 +21.367284788383 +21.375630064556 +21.383727866246 +21.391587945387 +21.399219438467 +21.406630929125 +21.413830504790 +21.420825807828 +21.427624081656 +21.434232212225 +21.440656765232 +21.446904019436 +21.452979996364 +21.458890486728 +21.464641073826 +21.470237154170 +21.475683955599 +21.480986553080 +21.486149882426 +21.491178752100 +21.496077853296 +21.500851768464 +21.505504978421 +21.510041868202 +21.514466731774 +21.518783775728 +21.522997122079 +21.527110810250 +21.531128798358 +21.535054963867 +21.538893103702 +21.542646933886 +21.546320088774 +21.549916119935 +21.553438494741 +21.556890594723 +21.560275713722 +21.563597055890 +21.566857733581 +21.570060765160 +21.573209072763 +21.576305480055 +21.579352709989 +21.582353382610 +21.585310012922 +21.588225008844 +0.260246577292 +4.677350039024 +4.688777804966 +4.701860917837 +4.715409317679 +4.728847247674 +4.741804928752 +4.754119236524 +4.765865667871 +4.777303242559 +4.788746341840 +4.800448344402 +4.812552145756 +4.825099405528 +4.838063834454 +4.851383355134 +4.864982541732 +4.878786034754 +4.892726099230 +4.906746973071 +4.920807508728 +4.934882698780 +4.948964150415 +4.963059379900 +4.977189842157 +4.991387792789 +5.005692300751 +5.020144900729 +5.034785437127 +5.049648591521 +5.064761429962 +5.080142107905 +5.095799683066 +5.111734848612 +5.127941325642 +5.144407639799 +5.161119035258 +5.178059330734 +5.195212580097 +5.212564453754 +5.230103300889 +5.247820885194 +5.265712809061 +5.283778655077 +5.302021881314 +5.320449510303 +5.339071652324 +5.357900902967 +5.376951653690 +5.396239352928 +5.415779754352 +5.435588188179 +5.455678890612 +5.476064425015 +5.496755225736 +5.517759290821 +5.539082042931 +5.560726368435 +5.582692833288 +5.604980061868 +5.627585252687 +5.650504794313 +5.673734937362 +5.697272475091 +5.721115386342 +5.745263400152 +5.769718450284 +5.794484998952 +5.819570220585 +5.844984047112 +5.870739085062 +5.896850420926 +5.923335334810 +5.950212943558 +5.977503793809 +6.005229423615 +6.033411908854 +6.062073408399 +6.091235720180 +6.120919859223 +6.151145668424 +6.181931473204 +6.213293791907 +6.245247114574 +6.277803763003 +6.310973844466 +6.344765309506 +6.379184120829 +6.414234535231 +6.449919494008 +6.486241109914 +6.523201231142 +6.560802055962 +6.599046766400 +6.637940146624 +6.677489151869 +6.717703396963 +6.758595539584 +6.800181541372 +6.842480799235 +6.885516148392 +6.929313747022 +6.973902859081 +7.019315556481 +7.065586364215 +7.112751872521 +7.160850338876 +7.209921300331 +7.260005213564 +7.311143136788 +7.363376464343 +7.416746721877 +7.471295427330 +7.527064020657 +7.584093863198 +7.642426305693 +7.702102822201 +7.763165205333 +7.825655816460 +7.889617882782 +7.955095831465 +8.022135649734 +8.090785258781 +8.161094888978 +8.233117444194 +8.306908844077 +8.382528335042 +8.460038763248 +8.539506805978 +8.621003161289 +8.704602699307 +8.790384581915 +8.878432360446 +8.968834063241 +9.061682286288 +9.157074300640 +9.255112189743 +9.355903028357 +9.459559112373 +9.566198245803 +9.675944087586 +9.788926556974 +9.905282292301 +10.025155154227 +10.148696761351 +10.276067043699 +10.407434798193 +10.542978230025 +10.682885464934 +10.827355019660 +10.976596221224 +11.130829569812 +11.290287044561 +11.455212355969 +11.625861152331 +11.802501190032 +11.985412477934 +12.174887403889 +12.371230845974 +12.574760261778 +12.785805735612 +13.004709945561 +13.231827989888 +13.467526985798 +13.712185323624 +13.966191427145 +14.229941837236 +14.503838402679 +14.788284329794 +15.083678812156 +15.390409932877 +15.708845503755 +16.039321476336 +16.382127527523 +16.737489385400 +17.105547419340 +17.486330975301 +17.879727900332 +18.285448684157 +18.702984674073 +19.131559927320 +19.570076500824 +20.017053403643 +20.470560124689 +20.928146671687 +21.386773475627 +21.842746344083 +22.291663819567 +22.728386618489 +23.147040919377 +23.541068564164 +23.903336989217 +24.226319105437 +24.502347741944 +24.723940458689 +24.884179123154 +24.977116268815 +24.998169512253 +24.944459279813 +24.815046419183 +24.611036068291 +24.335531274968 +23.993440903880 +23.591166612296 +23.136208615440 +22.636736754198 +22.101171592237 +21.537811673773 +20.954530701561 +20.358555412109 +19.756323761033 +19.153415003190 +18.554538634478 +17.963567508245 +17.383600955495 +16.817045581665 +16.265703869152 +15.730863267794 +15.213380785243 +14.713760035268 +14.232219215727 +13.768749589565 +13.323164787304 +12.895141706932 +12.484254024616 +12.089999408229 +11.711821495467 +11.709819904709 +11.707697351518 +11.705479941564 +11.703179131689 +11.700801517178 +11.698351590835 +11.695832801615 +11.693248044984 +11.690599919253 +11.687890870571 +11.685123278965 +11.682299510358 +11.679421947557 +11.676493007385 +11.673515148216 +11.670490870505 +11.667422712026 +11.664313238945 +11.661165033507 +11.657980678958 +11.654762742113 +11.651513753945 +11.648236188493 +11.644932440340 +11.641604800909 +11.638255433780 +11.634886349261 +11.631499378396 +11.628096146618 +11.624678047259 +11.621246215089 +11.617801500113 +11.614344441794 +11.610875243924 +11.607393750298 +11.603899421409 +11.600391312313 +11.596868051822 +11.593327823148 +11.589768346085 +11.586186860712 +11.582580112485 +11.578944338312 +11.575275252683 +11.571568031816 +11.567817291249 +11.564017045992 +11.560160624764 +11.556240453613 +11.552247405836 +11.548150771968 +11.543946244219 +11.539629542485 +11.535196423637 +11.530642690466 +11.525964200212 +11.521156872575 +11.516216697159 +11.511139740226 +11.505922150697 +11.500560165292 +11.495050112708 +11.489388416736 +11.483571598219 +11.477596275719 +11.471459164800 +11.465157075795 +11.458686909939 +11.452045653753 +11.445230371529 +11.438238195817 +11.431066315755 +11.423711963136 +11.416172396048 +11.408444879981 +11.400526666273 +11.392414967729 +11.384106931344 +11.375599607953 +11.366889918731 +11.357974618402 +11.348850255083 +11.339513126637 +11.329959233464 +11.320184227645 +11.310183358359 +11.299951413521 +11.289482657581 +11.278770765422 +11.267808752340 +11.256588900027 +11.245102678552 +11.233340664268 +11.221292453605 +11.208946572667 +11.196290382546 +11.183309980248 +11.169990095039 +11.156313980026 +11.142263298673 +11.127818005941 +11.112956223534 +11.097654108739 +11.081885716167 +11.065622851458 +11.048834915993 +11.031488741284 +11.013548411490 +10.994975072279 +10.975726723825 +10.955757995337 +10.935019898146 +10.913459553553 +10.891019891474 +10.867639314535 +10.843251322146 +10.817784087237 +10.791159977775 +10.763295013367 +10.734098245606 +10.703471048665 +10.671306303987 +10.637487460737 +10.601887447593 +10.564367410330 +10.524775240799 +10.482943857272 +10.438689187892 +10.391807797867 +10.342074080071 +10.289236939271 +10.233015820437 +10.173095977979 +10.109122790918 +10.040694883562 +9.967355810667 +9.888583884536 +9.803779699942 +9.712250755830 +9.613192285958 +9.505663288619 +9.388556244845 +9.260558558558 +9.120102995929 +8.965303330599 +8.793869843167 +8.602996975699 +8.389211865283 +8.148166932494 +7.874350985429 +7.560679470564 +7.197902267888 +6.773730773913 +6.271523845870 +5.668255456548 +4.931294240737 +4.013102814226 +2.841973949461 +1.307406502156 +-0.768210423424 +-3.651562473880 +-7.748335122525 +-13.305967320017 +-19.706506777162 +-23.940125368621 +-24.984721951826 +-24.138897844706 +-22.809471966963 +-21.526278257966 +-20.426263691217 +-19.510228890896 +-18.750759310492 +-18.117507837578 +-17.584897803587 +-17.132550444857 +-16.744712552991 +-16.409202397280 +-16.116569548838 +-15.859420362441 +-15.631914295234 +-15.429391465604 +-15.248097188872 +-15.084977299364 +-14.937524986818 +-14.803665204536 +-14.681666633730 +-14.570074012534 +-14.467655644742 +-14.373362324623 +-14.286294923665 +-14.205678607162 +-14.130842168170 +-14.061201341767 +-13.996245243030 +-13.935525270690 +-13.878645969109 +-13.825257465659 +-13.775049169920 +-13.727744500387 +-13.683096447835 +-13.640883822509 +-13.600908067863 +-13.562990541516 +-13.526970182642 +-13.492701507721 +-13.460052875350 +-13.428904982141 +-13.399149551343 +-13.370688186312 +-13.343431363569 +-13.317297545471 +-13.292212395260 +-13.268108080192 +-13.244922650813 +-13.222599486043 +-13.201086795702 +-13.180337172954 +-13.160307190725 +-13.140957036680 +-13.122250182330 +-13.104153082470 +-13.086634901579 +-13.069667264467 +-13.053224028636 +-13.037281076324 +-13.021816124362 +-13.006808550270 +-12.992239233172 +-12.978090408319 +-12.964345534104 +-12.950989170588 +-12.938006868688 +-12.925385069175 +-12.913111010817 +-12.901172646945 +-12.889558569871 +-12.878257942563 +-12.867260437067 +-12.856556179157 +-12.846135698775 +-12.835989885812 +-12.826109950824 +-12.816487390299 +-12.807113956110 +-12.797981628817 +-12.789082594491 +-12.780409224769 +-12.771954059847 +-12.763709794143 +-12.755669264403 +-12.747825439989 +-12.740171415158 +-12.732700403119 +-12.725405731680 +-12.718280840324 +-12.711319278542 +-12.704514705280 +-12.697860889368 +-12.691351710799 +-12.684981162748 +-12.678743354224 +-12.672632513249 +-12.666642990494 +-12.660769263272 +-12.655005939814 +-12.649347763772 +-12.643789618873 +-12.638326533664 +-12.632953686302 +-12.627666409335 +-12.622460194429 +-12.617330696986 +-12.612273740638 +-12.607285321556 +0.004662866567 diff --git a/examples-gallery/beginner/plot_particle_through_box.py b/examples-gallery/beginner/plot_particle_through_box.py new file mode 100644 index 00000000..86360b43 --- /dev/null +++ b/examples-gallery/beginner/plot_particle_through_box.py @@ -0,0 +1,340 @@ +# %% +r""" +Particle Through Box +==================== + +Objectives +---------- + +- Show how to use variable bounds. +- Show how to use the `eom_bounds` to restrict a combination of states and + inputs. + +Description +----------- + +In the horizonal X/Y planeA particle must move from the point (0, 0) to the +point (10, 10) as fast a possible. The controls are forces in x / y direction, +:math:`f_x` and :math:`f_y`. *At least* during some predescribed time interval, +the particle must be in a box defined by +:math:`x \in [x_{\min}, x_{\max}]` and :math:`y \in [y_{\min}, y_{\max}]`. +This is achieved by using variable bounds, which are fully open outside the +time interval and are restricted to the box inside the time interval. + +The particle is subject to speed dependent friction. + +The norm of the control force :math:`| \vec{F}| = |(f_x, f_y)|` +is limited by adding :math:`\sqrt{f_x^2 + f_y^2}` as an additional equation +of motion and using eom_bounds to restrict it. + +**States** + +- :math:`x` : x position of the particle +- :math:`y` : y position of the particle +- :math:`u_x` : x velocity of the particle +- :math:`u_y` : y velocity of the particle + +**Controls** + +- :math:`f_x` : x component of the force acting on the particle +- :math:`f_y` : y component of the force acting on the particle + +**Parameters** + +- :math:`m` : mass of the particle +- :math:`\mu` : friction coefficient +- :math:`g` : gravitational acceleration + +""" + +import os +import sympy as sm +import sympy.physics.mechanics as me +import numpy as np +import matplotlib.pyplot as plt +from opty import Problem +from opty.utils import MathJaxRepr +from matplotlib.patches import FancyArrowPatch +from scipy.interpolate import interp1d +from matplotlib.animation import FuncAnimation + + +# %% +# Equations of Motion +# ------------------- + +N = me.ReferenceFrame('N') +O, P = me.Point('O'), me.Point('P') +O.set_vel(N, 0) +t = me.dynamicsymbols._t +x, y, ux, uy = me.dynamicsymbols('x y ux uy') +fx, fy = me.dynamicsymbols('fx fy') +P.set_pos(O, x * N.x + y * N.y) +P.set_vel(N, ux * N.x + uy * N.y) + +m, mu, g = sm.symbols('m mu g') +Pa = me.Particle('Pa', P, m) +bodies = [Pa] +forces = [(P, (fx - mu * m * g) * N.x + (fy - mu * m * g) * N.y)] + +kd = sm.Matrix([ + ux - x.diff(t), + uy - y.diff(t) +]) + +kane = me.KanesMethod(N, q_ind=[x, y], u_ind=[ux, uy], kd_eqs=kd) +fr, frstar = kane.kanes_equations(bodies, forces) +eom = kd.col_join(fr + frstar) +eom = eom.col_join(sm.Matrix([sm.sqrt(fx**2 + fy**2)])) +MathJaxRepr(eom) + +# %% +# Set up The Optimization Problem +# ------------------------------- + +h = sm.symbols('h') +state_symbols = [x, y, ux, uy] +num_nodes = 501 +t0, tf = 0.0, h * (num_nodes - 1) +interval_value = h + +par_map = {} +par_map[m] = 1.0 +par_map[mu] = 0.5 +par_map[g] = 9.81 + +# %% +# The objective is to minimize the total duration. + + +def obj(free): + return free[-1] + + +def obj_grad(free): + grad = np.zeros_like(free) + grad[-1] = 1.0 + return grad + + +# %% +# Set the instance constraints. +instance_constraints = [ + x.func(t0) - 0.0, + y.func(t0) - 0.0, + ux.func(t0) - 0.0, + uy.func(t0) - 0.0, + x.func(tf) - 10.0, + y.func(tf) - 10.0, + ux.func(tf) - 0.0, + uy.func(tf) - 0.0, +] + +# %% +# Limit the norm of the control force to 25 N. +eom_bounds = {4: (0.0, 25.0)} + +# %% +# Set the variable bounds for x and y. +# +# The center of the time interval is t = teil * h. +teil = int(num_nodes / 2) + +# %% +# The width of the time interval where the particle must be in the box +# is 2 * delta. +delta = max(int(num_nodes / 20), 1) + +# %% +# Outside the time interval, the bounds are fully open. Inside the time +# interval,the bounds are as :math:`x \in [low_x, hi_x]` and +# :math:`y \in [low_y, hi_y]`. + +grenze1 = np.inf +low_x = 10.0 +hi_x = 13.0 +low_y = 1.0 +hi_y = 3.0 + +low_bound_x = np.array([-grenze1 for _ in range(0, teil - delta)] + + [low_x for _ in range(teil - delta, teil + delta)] + + [-grenze1 for _ in range(teil + delta, num_nodes)]) +up_bound_x = np.array([grenze1 for _ in range(0, teil - delta)] + + [hi_x for _ in range(teil - delta, teil + delta)] + + [grenze1 for _ in range(teil + delta, num_nodes)]) + +low_bound_y = np.array([-grenze1 for _ in range(0, teil - delta)] + + [low_y for _ in range(teil - delta, teil + delta)] + + [-grenze1 for _ in range(teil + delta, num_nodes)]) +up_bound_y = np.array([grenze1 for _ in range(0, teil - delta)] + + [hi_y for _ in range(teil - delta, teil + delta)] + + [grenze1 for _ in range(teil + delta, num_nodes)]) + +bounds = { + h: (0.0, 1.0), + x: (low_bound_x, up_bound_x), + y: (low_bound_y, up_bound_y) +} + +# %% +# Create the Problem. +prob = Problem( + obj, + obj_grad, + eom, + state_symbols, + num_nodes, + interval_value, + known_parameter_map=par_map, + instance_constraints=instance_constraints, + bounds=bounds, + eom_bounds=eom_bounds, + backend='numpy', + time_symbol=t, +) + + +# %% +# Solve the Problem. +# Use the solution of a previous iteration as initial guess if available. + +fname = f"particle_through_box_{num_nodes}_nodes_solution.csv" +if os.path.exists(fname): + initial_guess = np.loadtxt(fname) +else: + np.random.seed(0) + initial_guess = np.random.rand(prob.num_free) + initial_guess[-1] = 0.01 + +solution, info = prob.solve(initial_guess) +print(info['status_msg']) + +# %% +# Plot the results. Note the orange dotted lines, which show the active +# bounds for x and y. + +_ = prob.plot_trajectories(solution, show_bounds=True) + +# %% +# Plot the constraint violations. + +_ = prob.plot_constraint_violations(solution, subplots=True, show_bounds=True) + + +# %% +# Plot the objective value. + +_ = prob.plot_objective_value() + +# %% +# Animation +# --------- +fps = 15 + +resultat, inputs, *_, h_val = prob.parse_free(solution) +resultat = resultat.T +inputs = inputs.T +tf = h_val * (num_nodes - 1) +t_arr = np.linspace(t0, tf, num_nodes) +state_sol = interp1d(t_arr, resultat, kind='cubic', axis=0) +input_sol = interp1d(t_arr, inputs, kind='cubic', axis=0) + +t_in = (teil - delta) * h_val +t_out = (teil + delta) * h_val + +pL = [key for key in par_map.keys()] +pL_vals = [par_map[key] for key in par_map.keys()] +qL = [x, y, ux, uy] + [fx, fy] + +# Define the end of the force_vector. +arrow_head = me.Point('arrow_head') +scale = 5.0 +arrow_head.set_pos(P, fx / scale * N.x + fy / scale * N.y) + +# Get the coordinates of the points in the inertial frame for plotting. +coords = P.pos_from(O).to_matrix(N) +coords = coords.row_join(arrow_head.pos_from(O).to_matrix(N)) +coords_lam = sm.lambdify(qL + pL, coords, cse=True) + + +fig, ax = plt.subplots(figsize=(7, 7), layout='constrained') + +min_x = min(low_x, np.min(resultat[:, 0])) - 1.0 +max_x = max(hi_x, np.max(resultat[:, 0])) + 1 +min_y = min(low_y, np.min(resultat[:, 1])) - 1.0 +max_y = max(hi_y, np.max(resultat[:, 1])) + 1 +ax.set_xlim(min_x, max_x) +ax.set_ylim(min_y, max_y) +ax.set_xlabel('x', fontsize=15) +ax.set_ylabel('y', fontsize=15) + +ax.scatter(0.0, 0.0, s=25, color='blue') +ax.scatter(10.0, 10.0, s=25, color='green') +ax.set_aspect('equal', adjustable='box') + +arrow = FancyArrowPatch([0.0, 0.0], [0.0, 0.0], + arrowstyle='-|>', # nicer arrow head + mutation_scale=20, # makes head bigger + linewidth=1, + color='green') +ax.add_patch(arrow) + +# the box the particle must go through +ax.vlines(low_x, low_y, hi_y, colors='grey') +ax.vlines(hi_x, low_y, hi_y, colors='grey') +ax.hlines(low_y, low_x, hi_x, colors='grey') +ax.hlines(hi_y, low_x, hi_x, colors='grey') + +XX = np.linspace(low_x, hi_x, 100) +YY = [hi_y for _ in range(100)] +ax.fill_between(XX, YY, y2=low_y, color='black', alpha=0.25) + + +partic = ax.scatter([], [], s=50, color='red') +intime = ax.scatter([], [], s=25, color='red', marker='*') +followed_path, = ax.plot([], [], color='red', linewidth=0.5) + +x_values, y_values = [], [] +x_inbox, y_inbox = [], [] + + +def update(frame): + t = frame + coords_vals = coords_lam(*state_sol(t)[0:], *input_sol(t)[0:2], + *pL_vals) + ax.set_title( + f"Running time: {t:.2f} s \n Particle " + f"must be in the grey box at least from {t_in:.2f} sec " + f"to {t_out:.2f} sec \n Green arrow shows the force vector, " + f"norm = " + f"{np.linalg.norm([coords_vals[0, 1], coords_vals[1, 1]]):.2f}" + f" N \n The red stars are the path for {t_in:.2f} sec " + f"to {t_out:.2f} sec" + ) + + arrow.set_positions(np.array([coords_vals[0, 0], coords_vals[1, 0]]), + np.array([coords_vals[0, 1], coords_vals[1, 1]])) + partic.set_offsets([coords_vals[0, 0], coords_vals[1, 0]]) + + x_values, y_values = [], [] + x_inbox, y_inbox = [], [] + for zeit in np.concatenate((np.arange(0, t, 1.0/fps), np.array([t]))): + coords_vals = coords_lam(*state_sol(zeit)[0:], *input_sol(zeit)[0:2], + *pL_vals) + x_values.append(coords_vals[0, 0]) + y_values.append(coords_vals[1, 0]) + if t_in <= zeit <= t_out: + x_inbox.append(coords_vals[0, 0]) + y_inbox.append(coords_vals[1, 0]) + followed_path.set_data(x_values, y_values) + intime.set_offsets(np.column_stack((x_inbox, y_inbox))) + + return arrow, partic, followed_path, intime + + +ani = FuncAnimation(fig, update, + frames=np.concatenate((np.arange(0, tf, 1.0/fps), + np.array([tf]))), + interval=1500/fps, blit=False) + +plt.show()