From fda0cd082dcac7057795000a1917e348619088ce Mon Sep 17 00:00:00 2001 From: nguyed99 <nguyed99@zedat.fu-berlin.de> Date: Tue, 21 Nov 2023 15:58:30 +0100 Subject: [PATCH] Add UB4 --- UB2/MyIntegrator | Bin 33512 -> 33512 bytes UB2/QuadratureRule.cpp | 7 +- UB2/QuadratureRule.h | 2 +- UB2/main.cpp | 6 +- UB2/polynomial_new.py | 65 ++++++++++++ UB2/quadrature_full.py | 60 +++++++++++ UB2/shell_script.sh | 2 + UB2/test_quad.py | 38 +++++++ UB2/test_quad_composite.py | 46 +++++++++ UB2/test_quad_transformed.py | 42 ++++++++ UB3/__pycache__/run_rw2d.cpython-310.pyc | Bin 0 -> 672 bytes UB3/random_walk.py | 58 +++++++++++ UB3/run_rw2d.py | 48 +++++++++ UB4/UB4.py | 123 +++++++++++++++++++++++ shell_script.sh | 2 - 15 files changed, 492 insertions(+), 7 deletions(-) create mode 100644 UB2/polynomial_new.py create mode 100644 UB2/quadrature_full.py create mode 100644 UB2/shell_script.sh create mode 100644 UB2/test_quad.py create mode 100644 UB2/test_quad_composite.py create mode 100644 UB2/test_quad_transformed.py create mode 100644 UB3/__pycache__/run_rw2d.cpython-310.pyc create mode 100644 UB3/random_walk.py create mode 100644 UB3/run_rw2d.py create mode 100644 UB4/UB4.py delete mode 100644 shell_script.sh diff --git a/UB2/MyIntegrator b/UB2/MyIntegrator index 026b9ee91cf3c24edc6d2e0cd1b732abd64b7a49..50c1a570180b960467c9c23fed2122ee6a925bda 100755 GIT binary patch delta 6701 zcmaFS%Jia@X#)o%m#j1c7|2Rb7Gl)nViy4O7}y0Sdojv$#zJ@+v6G7!^<g}Z*vYFH z&k61@fJnmW$(>9YFf|&nlYcSQiM)Kg_*e3dn3l>N%SvOuyk}AV*SdCd4|6ILW5VW7 ztlOFEp%!pJjAB?I1YsDUi6=nC9ni!ppl;wufarsn1LIpj)iW|MFt9Q(FhG6Ba3LO| zzMhSNfk70)29r0S5+HGAun2^BfFur*gNQOPyg(9%84i;BfFureJ4l$}2a>o514BJn z5JU(-eE@PPKS%(I9iZYM*NZ{LKvV(LAa(`@29O?*7zkG&i8Fx&ptu1^oCPWdw!Z^O z0%RCWZUT}xELcHuGmykNK>|>`07;w+Dh8rfAc=E>1fX~WNZgfyfdOPG4^$9D?EpzY z#rZ%2P<#MMTo5V-qE5tbe#NcCBInP*;L&=Zgz5hUkLDvBhe1*d|4ps@85sVn+W1e_ z5;$A$$H0)rFYm&@@R?uk*MHSCG=3Z!KMalUhsJk9<J+O}&CvKxdT0V_XnZ*|z8D&x z&u{V$K`k|328J(bdi?S&U_W~F+A8`nFnIK`N`WZLA0?t5-K_U~CvynNaQK2GOkep< z))A6n^quS}B&X@ez`#(d9qQ3+8|BNuz~IsOw1mf_+qTV@f#F5wzyJSVr2PN?{}}6D zzsVDX0vLZxeki1(wx5ZC;S;|AYrQOp7IbX@ajKx44iG0*mVsfivaqMX8g`JCtpWf4 z|M%!T{$lUs8eusmCfUhzguMj}QRSQ_e-~D$w-*4JDZpAP1EK|6U;O+3A7o-Kl>Y(3 zZw1jF-Mt`bkKWJ)9=%{Y()cw_q<Qe?9rWnD2C^?&fPo>+gTL;8M`!DgfB*k`^s=@{ zgM4|+qnCA)H;8ro#i~Cb#~t$MZvF93?*D&~{sSJJ*IzLI{r}&iTT}(C3~b!S$u%M` zMX&z`sXzYW{qO((Uz`GQ8jt+gTqT;!$RzHz`My{HBhyir$%YbV88bHjmuO{@-SHKo z;R1;6c72iJq0OSI!N9;!!un#)=7rLJOpLypKgi}VYCQM|cH>L|h|3B=+-}z$9^IiJ zO(HN&J2$t;Co{5ze)#|Y<l)H$iV~Aq6;l{DPtH;dmDYX#|No00??6s>ec*BM0W&BZ zEZ+bBKjGx$e@Z%=*_4hjGB!;<tz2Jk!^ptk(e3)eqc=dpqucd{N9Qq+zf~C-7+%YP zGKELyVX%DX@fQZ)L4LRaGVJynkm0dEP9B~BQWWaZ`P8HNO@K#d?G2C4(hHyX1zk^k z;urKikjDT10EqYE6Tg7#flvG~AaMcS)!d+{jXPKmlKbIt-1P$}<-U#wJE1%D12pdR zA*oE@6Te{S4zL`=nIE9e<Yxl8UcjT<^#Ul$4uPB|57rauy5keSfbWY>{1FF1cD(Rt zcKyHzHlp+Ri}fI1Te^PWmzs2-<v?i{$Z;<|@khG;0ILOaC+n&1<bV40|NjXd-L5l0 zCZGF0`I~BDL@8LT^M*%v=#3N)ZFr2#d<6=g<1aS8`u`skD3Fi?>s$hgbxa-UP#yKJ z{{MdwHF>>SlW6)&P{6vr@aT?^@aT1Y0J67#vYUDgW76cs>gqf~UqF_C;~;qQHT3|t zM=!t$;DNg0WM2(U)=41l<bO(1lc#DpFg9+!rs2xSIBT+umbP%i50KVF9=)Jg2B+ou zo1?UhSSJ}ws1F5$tM*_j^s7B6HW(N_?1$1&K7#|JG_&;+CI*IR1_p+V`~Uw-Ff%Y% zJox|Lfti89<H7&`5zGt>91s8hXJBSv`1J7qe-jo429Zbq|4(6IU=Vov|Nj#f28QWR z|NjqQWnftL^#A_?RtAPGPyg5dpTNq%@bu~b{~K5t7!02M|9^p%fnoi#|NsB6F)%!T z_W!>OI|GB@^Z);2*cliip8x+phn<0;==uNud)OHmBwqage}sd9!RW>R|4%p=7#v>w z|Ifn7z~J}d|9=%u28LNL{{Q#jWMDY`;{X2)P6mc&FaH1M;9_9-^5Xx04K4--otO3h z|9fyTFu1+^|G$8lfg$GQ|Nj%185r_j{{O#$nSr6<<^TU5m>C%Mz5M@QgoT0O-OK;~ zLs%FX_+I`0U&6w`VE5|(|06663^}j<|7T%kU@&_9|Gy3^14Ga2|Np<RGBC_}{r|rR z8w10U*Z=>UurV;ad;R}^2pa=~!<+yAE7%wq!s_4r|38C`fnma%|NnQeF)%c}{r~?C z8w10XxBvg!urn|$d;9-?4LbwFk+=W<KVWBI;ClD}KLZB?L(IGX{}nhG7>eHg|L?%T zz##Vi|Nj&Y28QJK|NpmeFfhz`|Ns9I4hDup@Bjbr;ACL<^8Ww-6`TwVr62zPKf%es zu<pbE|1UTh80rsw`2RnHi-F<ChyVXOxEL6cKmPx}f{TG+%E$lzPjE3XJpTCq{~Im_ zhOZz0|L5UmU`YP-|Gxn@14HSj|NjHH85r6>{r_LU&A_nZ)BpbyxEUDEefs}@12+T1 z|4;w_UjWH}{{R02Hv_|}&;S1$@GvlleEI)Bf`@_O+n4|U1$Y?h8HB$6|6jqwz)<z= z|NkXC3=E6D{r`W2hk@bPxBvg2@Gvl_eE<KSgO`E9?EC-!8oUe)bH4xoAHd7N@Z$Ub z{{_4Z3>H8B|DV9iz>xRj|NjlV3=AiJ{QrM}mx1BskN^Ka@G>wc{rvx5fRBM8_~-xs z27C+*i+=w9AHv7Lu;u6f|0R4p3=B%Y{{NrB$H3t7YjT~jmL$Wy|NqrMsow?C09IjO zU@!qyj*|}>s~di}^Z!3`<4y!rkTWnaytwoK{{fILD3)PhVCZ3BU^q8f(nOx=$kWOH z?8GJqm~b#{gD?wBgvCm=85pFcdDuB7FfuSGFfcHHtm>FN(?pqZ(d4}*@{HRi-!+kE zoHY3_n3Oe@XRWyV|No!Kj;1mKkC}MbIT#o~_B>!@U?`fLYbwvA@?dhGsT^a%<h7>i zjQ=KIHC1M`pZwEQo=NY)<UUI&wlz!)3^ETUTbao*>Q0U{lV^;WTxq7vIAQW!GkL~_ z$$QP@89OH5H3Qperp$O?vZ6W26^`cej29*+nkzHSdj|Cg%j5;-ER3rsFEy8EJUscR zxja(<Txya93**|!tQPW2O3x;%S;#SNnVf4WJ~_sMgK^#DR10OsJCi#t<e8YBO<rXo z$7nM7q=h`A*5sEK%8aWf^IFO?UY{&zEzNp>m4V^SWM4~pMxV*Kmhy~llY1@Y8BHdy zwUlR4x<C1xr4pmp<d2r}jM0+?t>hVvCL3DGGrCL;w326BI=RqFo^jvgiB|HA*CubY zl4m?J`J$CP<DJPLt>hVlCJS22GiFRSw3cVwJUP%BBwJ{$%=8}Q0jbFwtXY^IKAS9O zFURJ?!N8#X9PHx{)*MW-5T<|)2NVDE$x=3QObX8@TiM7li9MejWh2L={(N$kjT~eD z<e4_|jQ1w*w2@~lntannU2)6v|NkF>5{4_EKpT@YFB{WMaO8nn0c$uI7$!|twAE%j zH`&(~<lbCcdB$6ldu^2&MJE5X6Xyb@iWp7?2DVp|FWIUwxxAYE%T|uDV6vp0Jkx?# zll3g6SkG`VFl?I~X(!M4VREINJmbg7GwtM=xL!}*WhciZ{d)2(J0(W9$%*#jT%cqI z%BB{tC(GF@F*Z$hw3laWnVe{^EV-PK^)w5^A|}=+EDV>JSf{cwEMN})%fj$r^IZF4 z-pLxi8AbxyAYU*rNJ1zE4QQVV+HnLGOkf!)Fv-AR5IgyhZ#`rDW+y*!M#k958=1r= z7x>R)Oqk3S@LVzxq6*e!2?cjw#6g<40`(bVCtC%&F`k&*7$`1z0@^QYhv;CCWMp7q zVh~{PpS&?pTrv*Y8G`i?)<R`-CO-@mmz)cg^@i&8V}j^?F<CH3oH2c}W{^AM{K<tu z;`JxRAxhjK6oU~9s6Qpa0P8uz^1U+)!~_8eh(efe3!&m#Q1N9DX@;9n@e5FKn0gLY zh&ity;*;5f1wDU2*bFegfT~H5PuZYB?gKS*D^za~RNN3MF2n{gvw3o2u(;$rs4UF1 zJy6*-lP3m?Gd`KTGI%-Tgvo&+`iwg!H-<>Sy5LZ=7@Rmj0U*T?0qt(V#3MKu7?c<U z7>+@Gq7RiQfQnl{#qFTtT~P5jIfww1V%P~4kJ5sO*TcHU9GnmfxS<mM5P60$sQ3p^ z&S79+FolXA;ACJBVh~_R0_7D328K+i_*+g;KVO<b0@`zi3Nw6xnzK$7A_6K!85kIh z7{s_B7FU7t30MT8pjiY|LQ69+pc&*j`C+IyW5i^^Fmc9O5NWy=YQi#T7|25mU^oU9 z=aYp9SVAa<7a;M;8<~VtnYkf$*FaqZ^*e()R2<z+QQQzupMi$jA7~#x9wrVA3~<TA zz`!sWBo4C4_ZG}VMTjF{!N>xt4H*O&-l;>xQy~<CCRDsl86p5nY@s|13_>6i>+7K^ zM4-NgI*DO64+DcBlQaWt5C)>3fnfzyeE>9^VSYUT6%T=i0W_W&-a*BUpe}<_4BVg! zo<X1<BPl9FBpALy9i#`f*_M}qL6J$CK>!+&u;GkIsQNWf2Q@;~H$uhjp@9hv0frk; zaY$0<XJCM(^-sJE41%CA@l@u6#OEETV_{(u4i%S%S_KRJem({UAtpfvSRo5_0mIbE z4<p14H$ipjLgNgUe(plW%b*^G<;Bk+UG-}G5I1;0Q{6|Xp(Rjp6==zQ3@W|?D&C+8 z5rA68@Ej_B3mQ={aZ3S+`7Y4-f(=)NL&TjJUO_F0f|$q9E&@rk2cW|?;FcBx1498s z1H&n3j!cKv3cZsrMv60D1e1?JWc?4Q%GpW~BVoZRDhP2(6g0S@5yqeg6_<ua9ZbEq zAjBo;Wkv;5eGRmf0*y<7Y+40Y&oFs2lc4W$sG2&cU2z}<3=9kpq2lPN?l)8%J(whg zpc#nKWb(%-@p>yEh#!_ggEJ6nZWL4;-Az40knDwCzRiHDUjWTN0Z?<cK*bB7VF9fg z8LmRa>ls9##T88A2SkEF4Vt=OfhQ^qap*aydeG<*$PNdncp5Z;2!jL}7#Q-Q;`UIB zVI|0HVFm_41{ns(&}KaYg8($%H$pX_7lv1%;y<7v1Z@~F{Dg{chg#49wKzZo;!rhc zf`+BTMiEHOfKs4?hG6@^5;6=C(AEjm9EQnIgVsWmT^>|oA5=U98q}}~`VLeaJp+7& znvWi3jG_z-qM%Ck4>XIxg4$v7#8`3998rir{y}SWSOk?o#dDy#V9vS-6-TdzUV%(w z{0AaU<-{Onq89=|P;vBBSR}^4pa3e`82cuFj1{k63RPzX%_%S!-++qiLgNA^{sk(& z0h&0np+P7k4spjJs5wDUac`*jEoj`q63sz~coc&cH1#cpYWM(=U|0y%04pPXB_I}{ z*K0*kaUW=$!kQU<lOM*3o6d#GhCq`VG=dpUL&c?`x?s-YmxN_z)ya<W;+FQ35L?lU zv>2#3dKo(#D(<s+Vtf_HX4{N!Op~W%3Qp$EkYh?o*=&%#jeqltst3$Wev*?<)#-7; z>Inhu$xQWbj5{WK*6VX3W?&lY%{dnsLqcZ3<b(C*oKv8KIa4MxHduh#*A4cJv6HL7 n<SsDztHGWzezH}gJ!8V;DloaL@f_p%$(>E+jQNufHmL&u8~P^B delta 6686 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 Pc5-KvIb-hRgH7rHHge{Y diff --git a/UB2/QuadratureRule.cpp b/UB2/QuadratureRule.cpp index 3063ce3..7591a8d 100644 --- a/UB2/QuadratureRule.cpp +++ b/UB2/QuadratureRule.cpp @@ -5,13 +5,16 @@ QuadratureRule::QuadratureRule(const std::vector<double>& w, const std::vector<d : weights(w), points(x) {} // the integrate method takes a callable function f and integrates it over the domain R -double QuadratureRule::integrate(const std::function<double(double)>& f) { - double integral = 0.0; +double QuadratureRule::integrate(const std::function<double(double)>& f, double a, double b) { + double integral = 0; + double stepSize = (b-a)/2; // the integration is a weighted sum of function values at the specified points for (size_t i = 0; i < weights.size(); i++){ integral += weights[i] * f(points[i]); } + + integral *= stepSize; return integral; } \ No newline at end of file diff --git a/UB2/QuadratureRule.h b/UB2/QuadratureRule.h index 134ae1a..f90d8b3 100644 --- a/UB2/QuadratureRule.h +++ b/UB2/QuadratureRule.h @@ -12,7 +12,7 @@ private: public: QuadratureRule(const std::vector<double>& w, const std::vector<double>& x); - double integrate(const std::function<double(double)>& f); + double integrate(const std::function<double(double)>& f, double a, double b); }; #endif // QUADRATURERULE_H diff --git a/UB2/main.cpp b/UB2/main.cpp index 9709cf5..1501401 100644 --- a/UB2/main.cpp +++ b/UB2/main.cpp @@ -4,12 +4,14 @@ int main() { std::function<double(double)> func = [](double x) { return x * x; }; - std::vector<double> weights = {1/3, 4/3, 1/3}; + std::vector<double> weights = {1.0/3.0, 4.0/3.0, 1.0/3.0}; std::vector<double> points = {-1,0,1}; QuadratureRule quadrature(weights, points); + double a = -1; + double b = 1; - double result = quadrature.integrate(func); + double result = quadrature.integrate(func,a,b); std::cout << "Approximate integral of f(x) = x^2 over [-1, 1] is: " << result << std::endl; diff --git a/UB2/polynomial_new.py b/UB2/polynomial_new.py new file mode 100644 index 0000000..3107878 --- /dev/null +++ b/UB2/polynomial_new.py @@ -0,0 +1,65 @@ +import numpy as np + +class polynomial: + + def __init__(self, coeff): + self.coeff = coeff + self.deg = len(coeff) - 1 + self._diff_coeff = np.zeros(self.deg + 1) + self._diff_coeff[:-1] = np.arange(1, self.deg + 1) * self.coeff[1:] + + def __call__(self, x): + if isinstance(x, float): + x = np.array([x]) + X = self._evaluate_powers(x) + return (self.coeff @ X)[0] + else: + X = self._evaluate_powers(x) + return self.coeff @ X + + def diff_p(self, x): + X = self._evaluate_powers(x) + + return self._diff_coeff @ X + + def _evaluate_powers(self, x): + X = np.zeros((self.deg + 1, len(x))) + for ii in range(self.deg + 1): + X[ii, :] = x**ii + + return X + +class polynomial_new(polynomial): + + def __init__(self, coeff): + # This method calls the constructor of the parent class: + super(polynomial_new, self).__init__(coeff) + # Overwrite array of derivative coefficients, they are replaced by + # a matrix of coefficients for all (relevant) derivatives: + self._diff_coeff = self._eval_diff_coeff() + + + # Overwrite derivative method: + def diff_p(self, x, order=0): + + if order > self.deg: + return np.zeros(x.shape) + else: + # Evaluate all powers of x at all data sites: + X = self._evaluate_powers(x) + + return self._diff_coeff[order, :] @ X + + # New function to generate derivative coefficients: + def _eval_diff_coeff(self): + # Compute all derivative coefficients: + diff_coeff = np.zeros((self.deg + 1, self.deg + 1)) + diff_coeff[0, :] = self.coeff + for ii in range(1, self.deg + 1): + if ii == 1: + upper_ind = None + else: + upper_ind = -ii + 1 + diff_coeff[ii, :-ii] = np.arange(1, self.deg + 2 - ii) * diff_coeff[ii-1, 1:upper_ind] + + return diff_coeff \ No newline at end of file diff --git a/UB2/quadrature_full.py b/UB2/quadrature_full.py new file mode 100644 index 0000000..dbe04a0 --- /dev/null +++ b/UB2/quadrature_full.py @@ -0,0 +1,60 @@ +import numpy as np + +class QuadratureRule: + + def __init__(self, x, w): + self.x = x + self.w = w + self._n = self.x.shape[0] + + def integrate(self, f): + # Evaluate f on all grid points: + fx = np.array([f(self.x[i]) for i in range(self._n)]) + + return np.dot(self.w, fx) + + + +class LinearTransformed(QuadratureRule): + + def integrate(self, f, T, dT): + # Evaluate f on transformed grid points: + fx = np.array([f(T(self.x[i])) for i in range(self._n)]) + # Transform weights: + wT = np.array([self.w[i] * dT for i in range(self._n)]) + + return np.dot(wT, fx) + + +class CompositeQuadrature: + + def __init__(self, a, b, n, x, w): + """ Composite quadrature on interval [a, b] using n sub- + intervals, and a quadrature rule on reference interval [-1, 1]. + + Parameters: + a, b: lower and upper bounds of integration domain + n: number of sub-intervals + x: grid points for reference quadrature rule + w: weights for reference quadrature rule + """ + self.a = a + self.b = b + self.n = n + # Create sub-division of [a, b]: + self.h = (b - a) / n + self.y = np.array([a + i * self.h for i in range(self.n+1)]) + # Mid-points of the sub-intervals: + self.c = 0.5 * (self.y[:-1] + self.y[1:]) + # Create quadrature rule object: + self.QR = LinearTransformed(x, w) + + def integrate(self, f): + I = 0.0 + # Iterate over sub-intervals: + for i in range(self.n): + # Linear transformation: + T = lambda x: 0.5 * self.h * x + self.c[i] + I += self.QR.integrate(f, T, 0.5*self.h) + + return I \ No newline at end of file diff --git a/UB2/shell_script.sh b/UB2/shell_script.sh new file mode 100644 index 0000000..1c30853 --- /dev/null +++ b/UB2/shell_script.sh @@ -0,0 +1,2 @@ +g++ main.cpp QuadratureRule.cpp -o MyIntegrator +./MyIntegrator diff --git a/UB2/test_quad.py b/UB2/test_quad.py new file mode 100644 index 0000000..280f47f --- /dev/null +++ b/UB2/test_quad.py @@ -0,0 +1,38 @@ +import numpy as np +import quadrature +import polynomial_new as poly + +""" Settings: """ +# Create an instance of the quadrature rule: +x = np.array([-1.0, 0.0, 1.0]) +w = np.array([1.0/3, 4.0/3, 1.0/3]) +S = quadrature.QuadratureRule(x, w) + +# Boundary values of interval: +a = -1.0 +b = 1.0 +# Number of test: +ntest = 10 + +""" Function to integrate polynomial: """ +def int_poly(P, a, b): + # Coefficients of the primitive function: + pc = P.coeff / np.arange(1, P.deg+2, dtype=float) + # Evaluate powers at both boundary points: + bx = np.array([b**i for i in range(1, P.deg+2)]) + ax = np.array([a**i for i in range(1, P.deg+2)]) + + return (pc @ bx - pc @ ax) + +""" Main Test: """ +for ii in range(ntest): + # Generate random third order polynomial: + #c = np.array([1.0, 0.0, 0.0, 1.0]) + c = np.random.randn(4) + print("Test %d: coeffs: "%ii, c) + P = poly.polynomial(c) + # Compute integral: + I = int_poly(P, a, b) + # Approximation with Simpson rule: + ISimp = S.integrate(P) + print("Test %d: diff = "%ii, np.abs(I - ISimp)) \ No newline at end of file diff --git a/UB2/test_quad_composite.py b/UB2/test_quad_composite.py new file mode 100644 index 0000000..e56026e --- /dev/null +++ b/UB2/test_quad_composite.py @@ -0,0 +1,46 @@ +import numpy as np +import matplotlib.pyplot as plt + +import quadrature_full + +""" Settings: """ +# Function to integrate: +f = lambda x: np.arctan(x) +# Anti-derivative: +F = lambda x: x * np.arctan(x) - 0.5 * np.log(1 + x**2) + +# Interval: +a = -1.0 +b = 3.0 + +# Array of grid sizes: +n_array = np.array([5, 10, 50, 100, 500, 1000, 5000, 10000]) +# Reference quadrature: +x = np.array([-1.0, 0.0, 1.0]) +w = np.array([1.0/3, 4.0/3, 1.0/3]) + +""" Demonstration: """ +# Compute reference: +Iref = F(b) - F(a) +# Convert grid sizes to step sizes: +h_array = (b - a) / n_array +# Apply composite quadrature: +E = np.zeros(h_array.shape[0]) +for i in range(h_array.shape[0]): + n = n_array[i] + QC = quadrature_full.CompositeQuadrature(a, b, n, x, w) + I = QC.integrate(f) + E[i] = np.abs(I - Iref) + +""" Figure: """ +plt.figure(figsize=(6, 4)) +plt.plot(h_array, E, "o--", label="Error Simpson") +plt.plot(h_array, h_array**4, "ro--", label=r"$h^4$") +plt.xscale("log") +plt.yscale("log") +plt.xlabel(r"$h$") +plt.ylim([1e-16, 1e-2]) +plt.legend(loc=2) +plt.show() + +print(I, Iref) \ No newline at end of file diff --git a/UB2/test_quad_transformed.py b/UB2/test_quad_transformed.py new file mode 100644 index 0000000..c03aadb --- /dev/null +++ b/UB2/test_quad_transformed.py @@ -0,0 +1,42 @@ +import numpy as np +import quadrature +import polynomial_new as poly + +""" Settings: """ +# Parameters of the quadrature rule on reference interval: +x = np.array([-1.0, 0.0, 1.0]) +w = np.array([1.0/3, 4.0/3, 1.0/3]) + +# Define linear transformation of [-1, 1] to [1, 5]: +a = 1.0 +b = 5.0 +T = lambda x: 2 * x + 3 +dT = 2.0 +# Number of tests: +ntest = 10 + +""" Function to integrate polynomial: """ +def int_poly(P, a, b): + # Coefficients of the primitive function: + pc = P.coeff / np.arange(1, P.deg+2, dtype=float) + # Evaluate powers at both boundary points: + bx = np.array([b**i for i in range(1, P.deg+2)]) + ax = np.array([a**i for i in range(1, P.deg+2)]) + + return (pc @ bx - pc @ ax) + + +""" Main Test: """ +S = quadrature.LinearTransformed(x, w) + +for ii in range(ntest): + # Generate random third order polynomial: + #c = np.array([1.0, 0.0, 0.0, 1.0]) + c = np.random.randn(4) + print("Test %d: coeffs: "%ii, c) + P = poly.polynomial(c) + # Compute integral: + I = int_poly(P, a, b) + # Approximation with Simpson rule: + ISimp = S.integrate(P, T, dT) + print("Test %d: diff = "%ii, np.abs(I - ISimp)) \ No newline at end of file diff --git a/UB3/__pycache__/run_rw2d.cpython-310.pyc b/UB3/__pycache__/run_rw2d.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eb602d2a62b12a374abbab7324c6114c71e11aed GIT binary patch literal 672 zcmd1j<>g{vU|@I?7MyyOnStRkh=Yt-7#J8F7#J9e{TLV+QW#Pga~Pr+!8B7Ya}*0B z11CcYQxt0oa}-+&OB8!5;{uKp)>QU1riF}AoGENkTq*2P+$kJUJSm(}yqpXvTq)cw z3{iY3jKK_=JTE~u`K8aA2?96m)2l_+xj(F0VxRefnStRY69WT7I!FZwzZ6066b?Xz z6&#XTL6T4mVzV(YFgSzU8^yrDP{Xi*VIcz}LkZ&orW%l|8CscA7}J;}8Q?r75N{z9 zSPgRua}ARi!$L+dkEMpWh9#W|%40?FY8ZkUG+F$L7#SECUV?}!>45x#(wxMS%=|os z#1e&)%-mFk5(QfYRXyW0O}1OC$vLTsMYos>a!PKo7bho{l%y8jVlBxm$w|G%QjwFH zdyAzqCo@-*^%iqlX8JA0h+B*$w^%B2GxI=XV#P{^A^`>lhF^O68Tq-X`US<AMX8B7 zCPw<jC8a5q`pNmZ1-iw_nfjql#`;C2dGST%Mk#s)mAClfOAAsGOH$+0GSf?oQpG^Q z!o$G8z`>}($OncjOhrNr3=Eq5w^;K^a|<eOG36E963k63Dagq$$;nL8E2spqZm~h= zB2ehwVoIsF#gtNVi_z~EYgKAde(^1)3WHlrB?h+`y^Hu57#NE9K?KNPu)C26K?Vkf oTO2mI`6;D2sdk{SE0zK|h=GTZiG_uUg^`7c4@`pCOiVnC0D%vmwg3PC literal 0 HcmV?d00001 diff --git a/UB3/random_walk.py b/UB3/random_walk.py new file mode 100644 index 0000000..3fd6fbb --- /dev/null +++ b/UB3/random_walk.py @@ -0,0 +1,58 @@ +import numpy as np +import random +import matplotlib.pyplot as plt + +from run_rw2d import _update_figure + +class RandomWalk2D: + def __init__(self, dx: float, N: int, x0: np.ndarray, dt: float): + """ + :param x0: vector of initial positions + :param N: population size + """ + assert x0.shape == (N,2), "x0 must have the shape (N,2)" + self.positions = x0 + self.time = [0] + self.dt = dt + self.N = N + self.dx = dx + + def simulate(self, K: int = 1): + """ + param K: number of discrete steps + """ + + choices = [(-1, 0), (1, 0), (0, 1), (0, -1)] + + for _ in range(K): + self.time.append(self.time[-1]+ self.dt) + directions = np.array([random.choice(choices) for _ in range(self.N)])* self.dx + self.positions += directions + + +### testing ### +N=100 +K=20 +dt=4e-2 +dx=4e-1 +RW = RandomWalk2D(dx=dx, N=N, x0 = np.zeros((N,2)), dt=dt) + +### visualisation ### + +# Axes limits for figure: +xmin = -8.0 +xmax = 8.0 +X = RW.positions +fig = plt.figure(figsize=(6, 4)) +fig = _update_figure(fig, X, 0.0, xmin, xmax) +for _ in range(1, K+1): + # Update positions: + RW.simulate() + X = RW.positions + print(f'{X=}') + t = RW.time[-1] + # Update figure: + fig = _update_figure(fig, X, t, xmin, xmax) + plt.pause(0.25) + +plt.show() diff --git a/UB3/run_rw2d.py b/UB3/run_rw2d.py new file mode 100644 index 0000000..24ac93b --- /dev/null +++ b/UB3/run_rw2d.py @@ -0,0 +1,48 @@ +import numpy as np +import matplotlib.pyplot as plt + +# import random_walk_2d as rw + +""" Settings: """ +# Mesh sizes: +dx = 0.4 +dt = 0.04 +# Population size: +N = 1000 +# Initial conditions: +x0 = np.zeros((2, N)) +t0 = 0.0 +# Number of discrete time steps: +K = 20 +# Axes limits for figure: +xmin = -8.0 +xmax = 8.0 + +""" Function to update the figure: """ +def _update_figure(fig, X, t, xmin, xmax): + fig.clear() + plt.scatter(X[:, 0], X[:, 1]) + plt.title("Population at time t = %.3f"%t) + plt.xlim([xmin, xmax]) + plt.ylim([xmin, xmax]) + + return fig + +# """ Instantiate the class: """ +# RW = rw.RandomWalk2D(dx, dt, N, x0) + +# """ Simulation: """ +# X = RW.positions() +# fig = plt.figure(figsize=(6, 4)) +# fig = _update_figure(fig, X, 0.0, xmin, xmax) + +# for ii in range(1, K+1): +# # Update positions: +# RW.simulate() +# X = RW.positions() +# t = RW.time() +# # Update figure: +# fig = _update_figure(fig, X, t, xmin, xmax) +# plt.pause(0.25) + +# plt.show() diff --git a/UB4/UB4.py b/UB4/UB4.py new file mode 100644 index 0000000..402e74d --- /dev/null +++ b/UB4/UB4.py @@ -0,0 +1,123 @@ +import numpy as np +import matplotlib.pyplot as plt + +# Ex1: Numerical integrators + +def implicit_euler(f, y0: np.ndarray, t: float, dt: float) -> np.ndarray: + """ + A-stable + :param f: function to be integrated + :param y0: initial value + :param t: time interval + :param dt: time step + """ + no_of_steps = int(t // dt) + y = np.zeros((no_of_steps, *y0.shape)) + y[0] = y0 + + for i in range(1, no_of_steps): + y[i] = y[i-1] + f(y[i-1]) * dt + y[i] = y[i-1] + f(y[i]) * dt + + return y + +def explicit_euler(f, y0: np.ndarray, t: float, dt: float) -> np.ndarray: + """ + :param f: function to be integrated + :param y0: initial value + :param t: time interval + :param dt: time step + """ + no_of_steps = int(t // dt) + y = np.zeros((no_of_steps, *y0.shape)) + y[0] = y0 + + for i in range(1, no_of_steps): + y[i] = y[i-1] + f(y[i-1]) * dt + + return y + +def implicit_midpoint(f, y0: np.ndarray, t: float, dt: float) -> np.ndarray: + """ + Not L-stable, doesn't decay properly - oscillation + :param f: function to be integrated + :param y0: initial value + :param t: time interval + :param dt: time step + """ + no_of_steps = int(t // dt) + y = np.zeros((no_of_steps, *y0.shape)) + y[0] = y0 + + for i in range(1, no_of_steps): + y[i] = y[i-1] + dt * f(y[i-1] + dt/2 * f(y[i-1])) + y[i] = y[i-1] + dt * f(1/2 * (y[i-1] + y[i])) + + return y + +# Ex2: dy/dt = lambda * y, y(0) = 1, lambda = -1 +y0 = np.array([1]) +lamda = -1 +t = 100 +dt = 1e-2 +f = lambda y: lamda * y +y = [implicit_euler(f, y0, t, dt), explicit_euler(f, y0, t, dt), implicit_midpoint(f, y0, t ,dt)] +integrators = ['implicit euler', 'explicit euler', 'implicit midpoint'] + +# for i in range(3): +# plt.figure() +# plt.plot(y[i]) +# plt.title(integrators[i]) +# plt.show() + +# Ex3: +def f(y: np.ndarray, k: float = 1) -> np.ndarray: + assert y.shape[0] == 3, 'y has the wrong dimension. It should be 3' + + A = np.array([[-1, 1, 0], + [1, -1-k, k], + [0, k, -k]]) + + return np.dot(A, y) + +dt = [1, 1e-1, 1e-2, 1e-3] +t = [10,100] +y0 = np.array([1,0,0]) + +# short time +fig = plt.figure() +for dt_i in dt: + y = implicit_euler(f, y0, t[0], dt_i) + plt.plot(y[:,0], '--',label = 'State 1') + plt.plot(y[:,1], 'x', label = 'State 2') + plt.plot(y[:,2], '>', label = 'State 3') + plt.legend() + plt.title(f'{integrators[0]}, dt = {dt_i}') + plt.show() + + + + + + +fig = plt.figure() +for dt_i in dt: + y = explicit_euler(f, y0, t[0], dt_i) + plt.plot(y[:,0], '--', label = 'State 1') + plt.plot(y[:,1], 'x', label = 'State 2') + plt.plot(y[:,2], '>', label = 'State 3') + plt.legend() + plt.title(f'{integrators[1]}, dt = {dt_i}') + plt.show() + +fig = plt.figure() +for dt_i in dt: + y = implicit_midpoint(f, y0, t[0], dt_i) + plt.plot(y[:,0], '--', label = 'State 1') + plt.plot(y[:,1], 'x', label = 'State 2') + plt.plot(y[:,2], '>', label = 'State 3') + plt.legend() + plt.title(f'{integrators[2]}, dt = {dt_i}') + plt.show() + + diff --git a/shell_script.sh b/shell_script.sh deleted file mode 100644 index 6d1b172..0000000 --- a/shell_script.sh +++ /dev/null @@ -1,2 +0,0 @@ -g++ main.cpp QuadratureRule.cpp -o MyApp -./MyIntegrator -- GitLab