MATH 2270-2 MAPLE PROJECT 2b - Inner product spaces Fall 2004 We will explore two interesting inner product spaces. Refer to section 5.5 of the text. A good dot product and interval for orthogonal polynomials: The first inner product and interval we mention are used in numerical analysis algorithms. We'll call the inner product ``dot1''. It is the inner product of example 1, page 233. restart:with(plots): Warning, the name changecoords has been redefined
dot1:=(f,g)->int(f(t)*g(t),t=-1..1);
#our first inner product, for the
#interval -1<t<1 NiM+SSVkb3QxRzYiZio2JEkiZkdGJUkiZ0dGJUYlNiRJKW9wZXJhdG9yR0YlSSZhcnJvd0dGJUYlLUkkaW50R0YlNiQqJi05JDYjSSJ0R0YlIiIiLTklRjNGNS9GNDshIiJGNUYlRiVGJQ== dot1(t->t,t->1);
#the dot product of f(t)=t with g(t)=1
#you should get zero. Meaning what?
NiMiIiE= Meaning you just showed that f(t)=t and g(t)=1 are orthogonal for the dot1 inner product! Does this surprise you? In fact, once the inner product is defined, you can define magnitude, distance, angle between vectors, and you can even do projection problems. This is discussed in detail in section 5.5. mag1:=f->sqrt(dot1(f,f)):
# the magnitude of a vector dist1:=(f,g)->mag1(f-g):
# the ``distance'' between two functions cosangle1:=(f,g)->(dot1(f,g)/(mag1(f)*mag1(g))):
#computes the "cos of the angle" between functions fangle1:=(f,g)->evalf(arccos(cosangle1(f,g))):
#computes angle between functions For example we may use Gram-Schmidt to find an orthonormal basis for the polynomial subspace P2=span{1, t, t^2}: P0:=t->1;
P1:=t->t;
P2:=t->t^2;
#our usual "natural" basis NiM+SSNQMEc2ImYqNiNJInRHRiVGJTYkSSlvcGVyYXRvckdGJUkmYXJyb3dHRiVGJSIiIkYlRiVGJQ== NiM+SSNQMUc2ImYqNiNJInRHRiVGJTYkSSlvcGVyYXRvckdGJUkmYXJyb3dHRiVGJTkkRiVGJUYl NiM+SSNQMkc2ImYqNiNJInRHRiVGJTYkSSlvcGVyYXRvckdGJUkmYXJyb3dHRiVGJSokOSQiIiNGJUYlRiU= W0:=P0/mag1(P0):
#first orthonormal vector
Z1:=P1-dot1(P1,W0)*W0:
#P1 was orthogonal to P0, so don't really
#need the usual projection formuula, but
#here it is anyway.
W1:=Z1/mag1(Z1):
#second orthonormal vector
Z2:=P2-dot1(P2,W0)*W0-dot1(P2,W1)*W1:
W2:=Z2/mag1(Z2):
#third orthonormal vector W0(t);W1(t);W2(t);
#the orthonormal polynomials we get NiMsJCokIiIjIyIiIkYlRiY= NiMsJComSSJ0RzYiIiIiIiInI0YnIiIjRik= NiMsJComLCYqJEkidEc2IiIiIyIiIiMhIiIiIiRGKkYqIiM1I0YqRikjRi0iIiU= Projection: Now that we have an orthonormal basis for P2 we can do projection problems. We will try to find the closest degree 2 polynomial to f(t)=exp(t), using our inner product dot1 to measure distance: proj2:=f->evalf(dot1(f,W0)*W0+dot1(f,W1)*W1+dot1(f,W2)*W2);
#this is the usual projection formula, but we use evalf to
#get decimals rather than messy algebraic numbers. NiM+SSZwcm9qMkc2ImYqNiNJImZHRiVGJTYkSSlvcGVyYXRvckdGJUkmYXJyb3dHRiVGJS1JJmV2YWxmR0kqcHJvdGVjdGVkR0YuNiMsKComLUklZG90MUdGJTYkOSRJI1cwR0YlIiIiRjZGN0Y3KiYtRjM2JEY1SSNXMUdGJUY3RjtGN0Y3KiYtRjM2JEY1SSNXMkdGJUY3Rj9GN0Y3RiVGJUYl f:=t->exp(t); NiM+SSJmRzYiZio2I0kidEdGJUYlNiRJKW9wZXJhdG9yR0YlSSZhcnJvd0dGJUYlLUkkZXhwR0YlNiM5JEYlRiVGJQ== g:=t->proj2(f)(t); NiM+SSJnRzYiZio2I0kidEdGJUYlNiRJKW9wZXJhdG9yR0YlSSZhcnJvd0dGJUYlLS1JJnByb2oyR0YlNiNJImZHRiU2IzkkRiVGJUYl This polynomial g is "closer" to exp(t) than the usual Taylor polynomial p(t)=1+t+t^2/2, when we use the distance which we get from dot1. We can compare distances: p:=t->1+t+t^2/2; NiM+SSJwRzYiZio2I0kidEdGJUYlNiRJKW9wZXJhdG9yR0YlSSZhcnJvd0dGJUYlLCgiIiJGLTkkRi0qJEYuIiIjI0YtRjBGJUYlRiU= evalf(dist1(f,g));
evalf(dist1(f,p)); NiMkIitZMlwmeiQhIzY= NiMkIittenZ6JSohIzY= So, at least for our distance, the function g does about three times as well as the Taylor polynomial. You can also see this geometrically, by plotting the three graphs on the interval from -1 to 1: with(plots): actual:=plot(f(t),t=-1..1,color=red):
best:=plot(g(t),t=-1..1,color=black):
tayl:=plot(p(t),t=-1..1,color=blue):
display({actual,best,tayl}); LSUlUExPVEc2JS0lJ0NVUlZFU0c2JjdTNyQkISIiIiIhJCIzTEJXcjZXenlPISM9NyQkITNvbW1tO3AwayYqRi8kIjMuV15RdGZyVVFGLzckJCEzdktMJDM8WFo9KkYvJCIzLyUqKWYrUnU3KlJGLzckJCEzbW1tbVQlcCJlKClGLyQiM0ZjdV5kZ0BsVEYvNyQkITM6bW1tIjRtKEckKUYvJCIzbiZHbE1YbnpNJUYvNyQkITMiUUxMM2kuOSF6Ri8kIjMjcCYpPTooNCJ5YCVGLzckJCEzIm9tbVQhUj0wdkYvJCIzRzQ7MGZ1QEBaRi83JCQhM3UqKioqXFA4I1w0KEYvJCIzPUUuci4mUio9XEYvNyQkITMqcG1tVD9GMW4nRi8kIjMlejIqPSY9UUA4JkYvNyQkITNbKytdKHkkcFppRi8kIjMqZmNTVCYpW1FOJkYvNyQkITMzTExMJHlhRSJlRi8kIjMxcTdYYUYhPmYmRi83JCQhM2htbW0iPnMlSGFGLyQiM10wdXZSSEw1ZUYvNyQkITNRKysrXSQqNCkqXEYvJCIzRGhgPTQmZmsxJ0YvNyQkITM4KysrXV8mXGMlRi8kIjNlbikqKUhXKSpcTCdGLzckJCEzMCsrK10xYVpURi8kIjNRU2RqOXEtMG1GLzckJCEzdW1tOy8jKVtvUEYvJCIzWmQxVCN5KD5nb0YvNyQkITNoTExMJD1leEokRi8kIjMvNjwqUSk9W3dyRi83JCQhMylSTExMdElmJEhGLyQiM216KFwuRSl6YnVGLzckJCEzXSsrXVBZeCJcI0YvJCIzM3dGdSVRO1d6KEYvNyQkITNFTUxMTDdpKTQjRi8kIjNrNi1IViwncDUpRi83JCQhM2MqKioqXFAncHNtIkYvJCIzdi1GXWdvSWslKUYvNyQkITMnKSoqKipcNzRfYzdGLyQiMyRIIVtrO2lAPikpRi83JCQhMykzTExMM3gleiMpISM+JCIzKFJ2RF1cK2E/KkYvNyQkITNLTUxMM3MkUU0lRmZyJCIzVWkjR1tnOlxkKkYvNyQkITNcXm9tbTt6cikqISNAJCIzaSQpUU16STghKioqRi83JCQiMyVwSkwkZXp3NVZGZnIkIjMyWjBxNi4wVzUhIzw3JCQiM3MqKSoqKlxQUSNcIilGZnIkIjNic15rYVwhXDMiRmlzNyQkIjNHS0xMZSIqW0g3Ri8kIjM7KHpNQGxFMzgiRmlzNyQkIjNIKioqKioqKnB2eGwiRi8kIjNXJGVdZ2A1Lj0iRmlzNyQkIjMjeioqKipcX3FuMiNGLyQiM1RFO2A7YyIzQiJGaXM3JCQiM1UpKioqXGkmcEBbI0YvJCIzKlx5JzQkKXp0IkciRmlzNyQkIjNBKSoqKipcMidIS0hGLyQiM0cnPidbLDF2UzhGaXM3JCQiM0VsbW1tWnZPTEYvJCIzJykqPnBpKyE0J1IiRmlzNyQkIjNoKioqKioqXDJnb1BGLyQiM29IQVFFLnFkOUZpczckJCIzVUtMJGVSPCpmVEYvJCIzXSFSdHFNdGVeIkZpczckJCIzbCoqKioqKlwpSHhlJUYvJCIzKWYtSVdcSkBlIkZpczckJCIzY2ttO0ghby0qXEYvJCIzMF10Wj92Nlo7RmlzNyQkIjN5KSoqKlw3ay42YUYvJCIzaiRmJ2ZqPCF6ciJGaXM3JCQiMyNlbW1tVDlDI2VGLyQiMylmI1FrQGkvIXoiRmlzNyQkIjMyKioqKlxpISozYGlGLyQiMyFIMkolZkojKW89RmlzNyQkIjMlUUxMTCQqenltJ0YvJCIzZilbcHVPcXolPkZpczckJCIzd0tMTDNOMSM0KEYvJCIzT3ZTZkJ3UEs/RmlzNyQkIjNNbW07SFl0N3ZGLyQiM1tKXSRcbChwPkBGaXM3JCQiM1kqKioqKioqcChHKip5Ri8kIjMsaSE9UltSSz8jRmlzNyQkIjNdbW1tVDZLVSQpRi8kIjMoeUBzTipbLy5CRmlzNyQkIjNmS0xMTGJkUSgpRi8kIjNRYF14cmk4J1IjRmlzNyQkIjNaKytdaWAxaCIqRi8kIjNxVnFNYCZSJipcI0ZpczckJCIzVysrXVA/V2wmKkYvJCIzYHJRc2Zsby1FRmlzNyQkIiIiRiwkIjNgWCFmJUc9Rz1GRmlzN1M3JEYqJCIzRSoqKioqUj9zUEglRi83JEYxJCIzIT1pODQjZTg8VkYvNyRGNiQiM2E3a19FPDFhVkYvNyRGOyQiMzpCKkhZdlJTVCVGLzckRkAkIjMjPV1PeDVWVFwlRi83JEZFJCIzPTZrZXl4XiRmJUYvNyRGSiQiM2cybVIqM2xKcSVGLzckRk8kIjMkKj5xZjFxWE1bRi83JEZUJCIzQnFfITRaVyMqKVxGLzckRlkkIjN0OmQjM1FuRjsmRi83JEZobiQiMzdIPjdLLUhoYEYvNyRGXW8kIjNUQW4oWyt4SGImRi83JEZibyQiM20iNFxdMkl3eSZGLzckRmdvJCIzR3hLc1xaTVZnRi83JEZccCQiM0g4IlF2dUcpM2pGLzckRmFwJCIzdC42ZUJ1Nm1sRi83JEZmcCQiM2l1PktfQjgjKm9GLzckRltxJCIzJm8yWXp4cmA9KEYvNyRGYHEkIjMpUjBOJTQlcGhhKEYvNyRGZXEkIjNdZiZSPyVbPyQpeUYvNyRGanEkIjNFZCQ+SXJ1P0YpRi83JEZfciQiMyRlMWYlUWIkNG0pRi83JEZkciQiM3AhZmxMWnhmMypGLzckRmpyJCIzJVw5S3krbE9cKkYvNyRGX3MkIjMjKXlLJ2VeXT8mKipGLzckRmVzJCIzKipcTTp6bSdbLyJGaXM3JEZbdCQiM1xmR1MybHoqMyJGaXM3JEZgdCQiMyQpUTRGcCUpNFM2RmlzNyRGZXQkIjNfOjRpJ3ktUz4iRmlzNyRGanQkIjNreFM1VElrWzdGaXM3JEZfdSQiM0lGXHJsU0kuOEZpczckRmR1JCIzcD5JVStGMW04RmlzNyRGaXUkIjNfa2kpSEY0VlUiRmlzNyRGXnYkIjN3JlE7dEpRJSlbIkZpczckRmN2JCIzSScpUVxOd0ZbOkZpczckRmh2JCIzVzQvam8neWJoIkZpczckRl13JCIzQiQqeilmbihwIW8iRmlzNyRGYnckIjNTXCpSKj5eaV08RmlzNyRGZ3ckIjM7Y2M8PiRIMyM9RmlzNyRGXHgkIjNdbHk1TUlGJyo9RmlzNyRGYXgkIjMsbFpTTWwiMyg+RmlzNyRGZngkIjNHSEg9NSJlKls/RmlzNyRGW3kkIjMlNEY/WTxnJEdARmlzNyRGYHkkIjNCXEhVJT0oKkg/I0ZpczckRmV5JCIzJVEkUmVkQV4hSCNGaXM3JEZqeSQiM1UpenNdd3IwUCNGaXM3JEZfeiQiMyt1Umh4JSl5ZENGaXM3JEZkeiQiM1cqZiQpPWhnSWEjRmlzNyRGaXokIjNFKytTb1FsT0VGaXM3UzckRiokIjMrKysrKysrK11GLzckRjEkIjM5NGBmPUJdNF1GLzckRjYkIjMrelIjPS1LSy4mRi83JEY7JCIzckIweWNyNXhdRi83JEZAJCIzUWIiPSlRNmxSXkYvNyRGRSQiMyM+ZEsiUWA/P19GLzckRkokIjNvYDlnbmA/NmBGLzckRk8kIjN3UmN3LFQoPlUmRi83JEZUJCIzamA8b2doQmFiRi83JEZZJCIzRy8kPWM0ISpScSZGLzckRmhuJCIzLmhxPCkqSHB3ZUYvNyRGXW8kIjM7OnVMQWlbV2dGLzckRmJvJCIzUj9OaTAwJjREJ0YvNyRGZ28kIjMqeTdEPGQmKXBaJ0YvNyRGXHAkIjMvQCw8QVNjN25GLzckRmFwJCIzRylcITNqcGVUcEYvNyRGZnAkIjMwSy8jW3k8RUIoRi83JEZbcSQiMyVlQTgtdGBdXChGLzckRmBxJCIzMDdXcS9Dbj15Ri83JEZlcSQiM1FVbHI/JCplQCIpRi83JEZqcSQiMy5wa3FrKD48WilGLzckRl9yJCIzNSNceHdLQEMjKSlGLzckRmRyJCIzPilRYD87Rmo/KkYvNyRGanIkIjMrPEgsUzIwdiYqRi83JEZfcyQiMzlwbyU0M0wsKioqRi83JEZlcyQiM3dpR2c6by5XNUZpczckRlt0JCIzZ0dZMCkpRyJbMyJGaXM3JEZgdCQiMzxIY3lMcl1JNkZpczckRmV0JCIzRl92TnInPSZ6NkZpczckRmp0JCIzZVZ2Y0o+Q0g3RmlzNyRGX3UkIjM0Ml0kXHlBIXo3RmlzNyRGZHUkIjMqPUlkKTM5QU84RmlzNyRGaXUkIjMtSTVgUV5NKlEiRmlzNyRGXnYkIjMlR11rSSQ9KHlXIkZpczckRmN2JCIzNzxURy5qXi06RmlzNyRGaHYkIjM8MEgpM0o0U2MiRmlzNyRGXXckIjM1IkdKem5TTmkiRmlzNyRGYnckIjM0L3FgOy1dKG8iRmlzNyRGZ3ckIjNzMFAnKSopUnVePEZpczckRlx4JCIzWSZ5bi5fOTMjPUZpczckRmF4JCIzKyEzZ3Q1IjQqKT1GaXM3JEZmeCQiM3kqXGtbPCRwZz5GaXM3JEZbeSQiM3VtIWU0UHpNLiNGaXM3JEZgeSQiM11jbyQzXUE+NSNGaXM3JEZleSQiM3RmLEtDUD8jPSNGaXM3JEZqeSQiMyZIPiM0bDVuYkFGaXM3JEZfeiQiM1MnKSpIIkhAdE5CRmlzNyRGZHokIjMpNCdRaDVFLjlDRmlzNyRGaXokIjMrKysrKysrK0RGaXMtJSZDT0xPUkc2LCUkUkdCRyQiIzVGKyRGLEYrRltebUZbXm1GW15tRltebUZbXm1GW15tRmldbS0lK0FYRVNMQUJFTFNHNidRInQ2IlEhRmBebS0lJUZPTlRHNiQlKkhFTFZFVElDQUdGal1tJStIT1JJWk9OVEFMR0ZmXm0tJSVWSUVXRzYkOyQhIzVGK0ZpXW07JCIyQyFwRE1ScjNLRmlzJCIyc3ovaSgpKkdsRiEjOw== The orthogonal polynomials which you have been constructing are called the Legendre polynomials. Maple knows about them. To see the first few you can load the `orthopoly' package. By the way, if you define different weighted inner products you get different (famous to experts) orthogonal polynomial families, you can read about some of them on the help windows, starting at `orthopoly'. Orthogonal polynomials are used in approximation problems, as you might expect. with(orthopoly): P(0,x);P(1,x);P(2,x);P(3,x);P(4,x);P(5,x);
#these should look familiar, after what you just did!
#they haven't been normalized, though. NiMiIiI= NiNJInhHNiI= NiMsJiMhIiIiIiMiIiIqJEkieEc2IkYmIyIiJEYm NiMsJiokSSJ4RzYiIiIkIyIiJiIiI0YlIyEiJEYq NiMsKCMiIiQiIikiIiIqJEkieEc2IiIiJSMiI05GJiokRikiIiMjISM6Ris= NiMsKCokSSJ4RzYiIiImIyIjaiIiKSokRiUiIiQjISNOIiIlRiUjIiM6Rio= Fourier Series: Here's an interval and dot product which makes the usual trig functions into an orthonormal family! See page 238 of the text! dot2:=(f,g)->1/Pi*int(f(t)*g(t),t=-Pi..Pi); NiM+SSVkb3QyRzYiZio2JEkiZkdGJUkiZ0dGJUYlNiRJKW9wZXJhdG9yR0YlSSZhcnJvd0dGJUYlKiZJI1BpR0kqcHJvdGVjdGVkR0YvISIiLUkkaW50RzYkRi9JKF9zeXNsaWJHRiU2JComLTkkNiNJInRHRiUiIiItOSVGOUY7L0Y6OywkRi5GMEYuRjtGJUYlRiU= For example: f:=t->sin(5*t);
g:=t->cos(3*t);
dot2(f,f);
dot2(g,g);
dot2(f,g); NiM+SSJmRzYiZio2I0kidEdGJUYlNiRJKW9wZXJhdG9yR0YlSSZhcnJvd0dGJUYlLUkkc2luRzYkSSpwcm90ZWN0ZWRHRi9JKF9zeXNsaWJHRiU2IywkOSQiIiZGJUYlRiU= NiM+SSJnRzYiZio2I0kidEdGJUYlNiRJKW9wZXJhdG9yR0YlSSZhcnJvd0dGJUYlLUkkY29zRzYkSSpwcm90ZWN0ZWRHRi9JKF9zeXNsaWJHRiU2IywkOSQiIiRGJUYlRiU= NiMiIiI= NiMiIiI= NiMiIiE= We add the constant function to our collection, but it will need to be normalized: dot2(1,1);
dot2(f,1);
dot2(g,1);
#the constant function has norm squared
#equal to 2, however. But it is orthogonal
#to all cos(kt),sin(kt), k a natural number NiMiIiM= NiMiIiE= NiMiIiE= Thus, for any n, the family {1/sqrt(2), cos(t), cos(2t), ..., cos(nt), sin(t), sin(2t), ...sin(nt)} is an orthonormal basis of a 2n+1 dimensional subspace of functions. So it is easy to project onto this subspace using our usual projection formulas. It is an amazing fact that if f(t) is any piecewise continuous function on the interval -Pi<=t<=Pi, then as as n approaches infinity the distances between these projections and f converges to zero. Here's an example, see page 241: f:=t->t:
#the function we shall decompose into trigonometric pieces
a0:=int(f(t),t=-Pi..Pi);
#could you have predicted the answer? NiM+SSNhMEc2IiIiIQ== #now get projection coefficients
#AKA Fourier coefficients
for i from 1 to 10 do
g1:=t->cos(i*t):
g2:=t->sin(i*t):
a[i]:=dot2(g1,f):
b[i]:=dot2(g2,f):
od: fsum:=t-> a0/(2*Pi)+ sum(a[j]*cos(j*t),j=1..10) +
sum(b[j]*sin(j*t),j=1..10); NiM+SSVmc3VtRzYiZio2I0kidEdGJUYlNiRJKW9wZXJhdG9yR0YlSSZhcnJvd0dGJUYlLCgqJkkjYTBHRiUiIiJJI1BpR0kqcHJvdGVjdGVkR0YxISIiI0YvIiIjLUkkc3VtR0YlNiQqJiZJImFHRiU2I0kiakdGJUYvLUkkY29zRzYkRjFJKF9zeXNsaWJHRiU2IyomRjxGLzkkRi9GLy9GPDtGLyIjNUYvLUY2NiQqJiZJImJHRiVGO0YvLUkkc2luR0Y/RkFGL0ZERi9GJUYlRiU= fsum(t);
#why are there no cosine terms? NiMsNi1JJHNpbkc2JEkqcHJvdGVjdGVkR0YnSShfc3lzbGliRzYiNiNJInRHRikiIiMtRiU2IywkRitGLCEiIi1GJTYjLCRGKyIiJCNGLEY0LUYlNiMsJEYrIiIlI0YwRiwtRiU2IywkRisiIiYjRixGPi1GJTYjLCRGKyIiJyNGMEY0LUYlNiMsJEYrIiIoI0YsRkgtRiU2IywkRisiIikjRjBGOS1GJTYjLCRGKyIiKiNGLEZSLUYlNiMsJEYrIiM1I0YwRj4= plot1:=plot(fsum(t),t=-Pi..Pi,color=black):
plot2:=plot(t,t=-Pi..Pi,color=red):
display({plot1,plot2}); LSUlUExPVEc2JS0lJ0NVUlZFU0c2JTdTNyQkITMpKioqKjR0ayNmVEohIzxGKjckJCEzdyIqcHIpM1BZKyRGLEYuNyQkITM/M0VbKnlzYSlHRixGMTckJCEzZlgmKSk+Mmc5diNGLEY0NyQkITMpNDU3Ny5mbGgjRixGNzckJCEzdSJRTTo6KkgjWyNGLEY6NyQkITN4XEFoY0kjeU4jRixGPTckJCEzJmU9ZC1GTipHQUYsRkA3JCQhM3UlKkdCUCRSYzQjRixGQzckJCEzbENqJmYpM3hpPkYsRkY3JCQhMydvcjRBTio0RT1GLEZJNyQkITNRUVEqMyoqPWRxIkYsRkw3JCQhM2QhPmpnQCo+cTpGLEZPNyQkITNfO20sJSlIN005RixGUjckJCEzdig0RixLKSlISSJGLEZVNyQkITNSKjQhUiNbMFI9IkYsRlg3JCQhM29ZQFFxV0lVNUYsRmVuNyQkITNXcDN3JFIpXEIjKiEjPUZobjckJCEzRUpjOG8zOUd5RmpuRlxvNyQkITMnPVtCUC04SWYnRmpuRl9vNyQkITNDQjM8QD8peUImRmpuRmJvNyQkITNfKilSPFlvWlpSRmpuRmVvNyQkITM4VHFYPVcyLEVGam5GaG83JCQhM3BUSlkpb2NZTyJGam5GW3A3JCQhMzgsejdWS0osSiEjP0ZecDckJCIzOVNGZjN4RWE4RmpuRmJwNyQkIjMnUjIoKUh2ZSxjI0ZqbkZlcDckJCIzSWN3UjxUYmlRRmpuRmhwNyQkIjMqNCo9Sm9mMDNfRmpuRltxNyQkIjNxXTFYSXFPQ2xGam5GXnE3JCQiMyVIb0JsbWx6eihGam5GYXE3JCQiM151J2YjNCl6P0AqRmpuRmRxNyQkIjM4SHY8RUNGWzVGLEZncTckJCIzTmxqJUclMyVSPSJGLEZqcTckJCIzXC0pUkVmd29JIkYsRl1yNyQkIjNjTTJ2UXlGVDlGLEZgcjckJCIzeigzMnMkKlF4YyJGLEZjcjckJCIzNStLP0JzIyoqcCJGLEZmcjckJCIzPCNIJGVNYTtIPUYsRmlyNyQkIjMlPj5DWidlWWs+RixGXHM3JCQiM2tZdXlmaXglNCNGLEZfczckJCIzUzRxKSlmdS5HQUYsRmJzNyQkIjN5P3cnKio9Jj5nQkYsRmVzNyQkIjMhKj4zYT1XaiJbI0YsRmhzNyQkIjNBP2MqKXl1IjNpI0YsRlt0NyQkIjMsaS1IbldJWEZGLEZedDckJCIzdT1SV2hOLnlHRixGYXQ3JCQiM3NzKCpSU0EyMElGLEZkdDckJCIzISkqKipcL2wjZlRKRixGZ3Q3anU3JEYqJCEzP0xfK18nZWZEIiEjQzckJCEzTXVlWy1LWkNKRiwkITNJNyhvZWNkdVQkRmpuNyQkITNFWzxtZFBOMkpGLCQhMydRMTJCZG1reidGam43JCQhMz1BdyRHSk0tNCRGLCQhM3hodXhMPyQqNDVGLDckJCEzNCdcOCFvWzZ0SUYsJCEzI1JNIT52cygqRzhGLDckJCEzI1JDbCR5ZigpUUlGLCQhM0AzWigqNCUpKSo+PkYsNyRGLiQhM00iUixqdyI0SENGLDckJCEzKSoqeio0UlwwWEhGLCQhM0ojKltNMjYhPTIkRiw3JEYxJCEzQXZdJHkkKj0hekxGLDckJCEzUV1leio+QChvR0YsJCEzX28jWzg8MndTJEYsNyQkITNiIzQ0LGhwPiZHRiwkITNqVHo7IlxJTFQkRiw3JCQhMydRcmxfIlFmVkdGLCQhM1k0ZHMqUiwjM01GLDckJCEzc01CVT8hPV8kR0YsJCEzVVI6Olc/NClSJEYsNyQkITNmYip5YkFVbyNHRiwkITNsXUZnSEBHJFEkRiw3JCQhMyFwZE4yVm0lPUdGLCQhMykpXF5pJilcMWtMRiw3JCQhM0NoP09eSydceSNGLCQhMzF5cTp3J3AkXEtGLDckRjQkITNkLms6dk0nKiozJEYsNyQkITNGQi5nXiY0U28jRiwkITMob244YnlbJD5GRiw3JEY3JCEzR3BYRTxSZjBDRiw3JCQhMzxyRUhoUypIZSNGLCQhM11acHgpKlsoPkkjRiw3JCQhM09US1AiNEglXERGLCQhM1VvXHFaXC9TQUYsNyQkITNDRU5UMW1rS0RGLCQhM3VUd20peUFYQSNGLDckJCEzYjZRWEBUJ2VeI0YsJCEzPTRYcjkjPic9QUYsNyQkITMnbzQlXE87MypcI0YsJCEzWXc+XllLXkBBRiw3JEY6JCEzbVIyeCU0dEBCI0YsNyQkITN3OkwyLzYxP0NGLCQhMyJldFMlXC49PUJGLDckRj0kITNpKG9id2dEQVUjRiw3JCQhM2lteUokMzc8TSNGLCQhMyZ6eXglUmxdVkNGLDckJCEzIVJbQis2LGNLI0YsJCEzPl5zcWkkKVxnQ0YsNyQkITM/LCJIbjghXDRCRiwkITMhPkN2LEBNQ1ojRiw3JCQhMy89WlZqInpMSCNGLCQhM3Rkb2E6RXJ5Q0YsNyQkITMpW0xTLD5vc0YjRiwkITMhcCkqcC9iMip5Q0YsNyQkITNzXmYlb0BkNkUjRiwkITNqSSVcbmp0RlojRiw3JCQhM2RvOmJWaS9YQUYsJCEzWHEkKVJWbENnQ0YsNyRGQCQhMzNQUSFwcFE5VyNGLDckJCEzSVNddS50R2lARiwkITNcKlFBKHl0XjBCRiw3JEZDJCEzOWwhKkhCVzc4QEYsNyQkITNxNFlmNl4/SD9GLCQhM0t3RC5dRipvIz5GLDckRkYkITNdaWooMzVPJyl6IkYsNyQkITNxKSp6Qldwb1g+RiwkITM3QjlFVC9geTxGLDckJCEzd3MnPkQrLidHPkYsJCEzPzdUcUJ4JlF3IkYsNyQkITMjb00sMzE+OiI+RiwkITMweVxSNCQzV3YiRiw3JCQhMyczLSQzPl5WJSo9RiwkITMqKm8/c1NaIilcPEYsNyQkITMoKm9qa05zRWc9RiwkITNYTCY+OGJJSXYiRiw3JEZJJCEzIylSKlIieWMybzxGLDckJCEzaXg8YnIiNGZ3IkYsJCEzaD9XK0VBKUchPUYsNyRGTCQhM0txdm86TTk8PUYsNyQkITNmMisvPiF6KClvIkYsJCEzWVJSdWhvVDg9Riw3JCQhM2Z3aD1aIVI9biJGLCQhM3R6UnckKXBeMD1GLDckJCEzZlhCTHYhKipbbCJGLCQhM2E3O0wmKSpSS3oiRiw3JCQhM2U5JnlNNWZ6aiJGLCQhMyk+cEdQLEBseCJGLDckJCEzZV8zeGYielNnIkYsJCEzLFhUdnFcPUk8Riw3JEZPJCEzOVxaJCpwX2tvO0YsNyQkITNiLipSKzVoQF0iRiwkITN3d3NlLEc+OzpGLDckRlIkITNKPCNcN1MtQU8iRiw3JCQhMyVvQlchPSRSOFMiRiwkITMjKlxnOTJLOSs4Riw3JCQhMzlkPTJfY2JvOEYsJCEzKHBeaWUzXzFEIkYsNyQkITNXeCUqNCcpPnhOOEYsJCEzNyZRdCoqcEBgQCJGLDckRlUkITNVKCpvMS8oeVM+IkYsNyQkITNaKWZlNyFwV1Y3RiwkITM7Mzw0Mmw1Jj0iRiw3JEZYJCEzIyo0Wzshb1pkPiJGLDckJCEzRzYiKVFIX11bNkYsJCEzUiwuVEMyTys3Riw3JCQhMyVINydRd1w1ODZGLCQhM1lzUV1qOi8oPiJGLDckJCEzIls4JVFCWnF4NUYsJCEzTyZcSSRHQ2siPSJGLDckRmVuJCEzYipbKiopW1dzXjZGLDckJCEzOm82els6RkIpKkZqbiQhM15ZNnlyaGtuNUYsNyRGaG4kITMnUTFUMSUqZSk+JipGam43JCQhM05dI1s0aj5lXylGam4kITMkXGsiUmU7KTQyKUZqbjckRlxvJCEzPV1RKyZlU2Yob0ZqbjckJCEzIlJmS3EhKmUkPnZGam4kITNCOk5hRVU2K2xGam43JCQhM2NjJkhmJXBkNXNGam4kITNDSXVSI0d5NEInRmpuNyQkITNAPmwjWylceixwRmpuJCEzV2RIWmM0PGpnRmpuNyRGX28kITM0NlU8JnlxNClmRmpuNyQkITNiX3JXQXZXOmZGam4kITNHVzsmKip6N0UoZkZqbjckRmJvJCEzI1I9K3NXN0ojZkZqbjckJCEzIltoQHVzIUc6XEZqbiQhM1dcKj4mKjRNRnomRmpuNyQkITNRMUNuTCV6RWYlRmpuJCEzTDViPGB3QmhiRmpuNyQkITMmej5CKlIieStGJUZqbiQhM1g7WkQoKik9Ij5fRmpuNyRGZW8kITMiek9wOkwlUXBaRmpuNyQkITNLOmJKS2NGdUtGam4kITNhXyJ5d1hFRmMkRmpuNyRGaG8kITM6JVtNWyZlNkNBRmpuNyQkITNTIjRnTWJsRyk+RmpuJCEzKTMiKjRQJHBDXzZGam43JEZbcCQhM3NDdzUtLE4zVSEjPjckJCEzLXdeWCp6WDcuIkZqbiQhMzdjP3liXEAoKj1GalttNyQkITNiLkBaLyJcJHlwRmpbbSQhM0RIOVcxOChvMSdGYHA3JCQhMyVvVyNSOS1DV09GalttJCEzTmdyQiMpUSQpMykpISNANyRGXnAkITNpYXBdbzJNb2FGXXU3JCQiM3pkc0N5MjJgSkZqW20kIjNnUHAqPiUpZWZyJkZqXG03JCQiM3AwdCEzKUdGO21GalttJCIzIjMxVE1dIWUlPSZGYHA3JCQiM09ObkwpXFp6KyJGam4kIjMleVdMTFg8aHgiRmpbbTckRmJwJCIzS3NQdmt0TD5URmpbbTckJCIzMDIqKnlJS0BkPkZqbiQiMztyaDdNeEc5NkZqbjckRmVwJCIzVkgicCh6UXRYQEZqbjckJCIzOGxCPk5rTjZLRmpuJCIzW1NaNG84RVFNRmpuNyRGaHAkIjNVMGRvPGl0TVlGam43JCQiMylcQEUsZUgqKT4lRmpuJCIzZiNlIW93TiQpR15Gam43JCQiM2x0WiZHLzBgYCVGam4kIjNvP3E6aiNlJjNiRmpuNyQkIjNLS0xlMDBvcltGam4kIjN2M2wiNCRHcG5kRmpuNyRGW3EkIjNYOTgkeVo6WyJmRmpuNyQkIjMlM0YiUSpcNmknZUZqbiQiM1ZSZSU+JXBkdWZGam43JEZecSQiM2VtdC0xYyxzZkZqbjckJCIzdzMqbyUqb21GJW9Gam4kIjM6YFVZKy1bVGdGam43JCQiMyNvOyhbW2o7aHJGam4kIjNjSE1jYHVnKD4nRmpuNyQkIjMpW1UwdittJnp1RmpuJCIzVXkiKXpPbVdma0ZqbjckRmFxJCIza2JYKyE+JWVNb0ZqbjckJCIzdHk7Knl0QV1dKUZqbiQiM0hpJ3BcKnonKkghKUZqbjckRmRxJCIzaVMlPWFLK2hcKkZqbjckJCIzJUhbPGIuLXUlKSpGam4kIjNiKnk5dnpiPDIiRiw3JEZncSQiMy8jM2RLUEl5OiJGLDckJCIzPlFaTUkmKj0jMyJGLCQiMyYqZiVmeGVrVj0iRiw3JCQiM0RaPl5NbTU7NkYsJCIzX0BJQ0JRdSg+IkYsNyQkIjNJYyJ6J1FQLV02RiwkIjMvR11jbTNIKzdGLDckRmpxJCIzIWZJayY9M3UmPiJGLDckJCIza0NaSCF5dVlAIkYsJCIzISpvPFtYIz4lKj0iRiw3JCQiMyRSM1Z4cjNhQyJGLCQiMzQvKilldyhcXD0iRiw3JCQiM0BWOT5iRTl3N0YsJCIzJWYhSFBqJlJnPSJGLDckRl1yJCIzPylwM2lLLmY+IkYsNyQkIjNdTnY7L3BaUzhGLCQiM0Z0PER3al0+N0YsNyQkIjNfb19wOnMydThGLCQiM2cjPXNeJCk9IWU3Riw3JCQiM2EsSUFGdm4yOUYsJCIzIVxTciZ5IlE3SiJGLDckRmByJCIzSGtPWipvT3JQIkYsNyRGY3IkIjNSUXdmRi5vajtGLDckJCIzKGU2MSgzZ3krO0YsJCIzJz4teFRwPltzIkYsNyQkIjMmUjkwLTNMUWoiRiwkIjNYVDs/ODp5cjxGLDckJCIzKXlsYWZoYy5sIkYsJCIzczJsNmU/Pip5IkYsNyQkIjMtc1RxXiwpb20iRiwkIjNGT1xPbjxRLT1GLDckJCIzPCdvYHVvLk1vIkYsJCIzPlM9InlkdTgiPUYsNyRGZnIkIjNbKm9EcFs/aiI9Riw3JCQiMzlZSyopR2phazxGLCQiMz90JVFjd2ZOIT1GLDckRmlyJCIzLGZyZnQqNGt3IkYsNyQkIjM1PCY9QGEhKkgnPUYsJCIzKlxELmshKmVBdiJGLDckJCIzL1VQbFxjIm8qPUYsJCIzREpyKDRBIj1dPEYsNyQkIjNfYThVLiNHUCI+RiwkIjMmZSJ6MiFmWmB2IkYsNyQkIjMqcCcqKT1kMmtJPkYsJCIzSndEdioqeUtsPEYsNyQkIjNZemwmNEpgdiU+RiwkIjM+dyFSRVBnL3kiRiw3JEZccyQiMzxpJ1xIPkk0IT1GLDckJCIzRz5lRGk1aUg/RiwkIjMpKW9jcGwtI3ojPkYsNyRGX3MkIjNadWR5VlNgNUBGLDckJCIzLUdzJClmb1NoQEYsJCIzVyFSUGdzOktJI0YsNyRGYnMkIjNndiQ9NnQ1LVcjRiw3JCQiM3MmM1poPGRYQyNGLCQiM3QyUCNbLm4oZkNGLDckJCIzWmlyUyMqbzJoQUYsJCIzXSMqWydwLEZGWiNGLDckJCIzeVFzbTNtZnhBRiwkIjNNd18/U2knKnlDRiw3JCQiMzU6dCNcSztUSCNGLCQiMy5nOkF5YmJ5Q0YsNyQkIjNUIlIoPVRnajVCRiwkIjNEaiJ6XC5tPFojRiw3JCQiM3NudVdkZDpGQkYsJCIzNm8nKUc5Im8hZkNGLDckJCIzWld2cXRhblZCRiwkIjM3YVlRImZENlcjRiw3JEZlcyQiMyoqKW88S28keT1DRiw3JCQiM00/VUQvWyI0VSNGLCQiMy05Y0deK3I7QkYsNyRGaHMkIjN3OVcpWyUpUUZCI0YsNyQkIjMjKXBeMyxCLipcI0YsJCIzYVEoKSpSdkw6QSNGLDckJCIzPz8mSE89SWteI0YsJCIzdiEzNjl1cCc9QUYsNyQkIjM4cVE8bSFHUWAjRiwkIjNLJkcxSGgjSERBRiw3JCQiMzE/Iz0oW2ZBXkRGLCQiM2ZbWkhZTElVQUYsNyQkIjMiKj5wIVFyQGdlI0YsJCIzRkJedj8zajRCRiw3JEZbdCQiM0ljKmYpNGVlQENGLDckJCIzNVRINHQ0MSRvI0YsJCIzXHUqUUZ4VFVyI0YsNyRGXnQkIjNAY1lMLSU9djAkRiw3JCQiMz53J0czdSdbeUZGLCQiM1sjKXlIVFhQQEtGLDckJCIzUSE0blYscDsiR0YsJCIzJDN6SjNYUmFNJEYsNyQkIjNaKEhPNjpnI0dHRiwkIjM8PSllJHB0NSdRJEYsNyQkIjNjL2IhekdeWyVHRiwkIjNcJClHVzNlSDRNRiw3JCQiM2w2Wm5DQ1doR0YsJCIzPikqZSJcNSl6N01GLDckRmF0JCIzTSsnektYWVlSJEYsNyQkIjNDIylHPUpLejRIRiwkIjMvQDtAYVNsJEgkRiw3JCQiM3RYPSM0IUhiVEhGLCQiM11iXEwkKWU6KjQkRiw3JCQiM0I0M21xREp0SEYsJCIzcipvUWFDPSIzR0YsNyRGZHQkIjMlUkVrRj86S1UjRiw3JCQiMztIQiJITS0jUklGLCQiMzc0YydmWDNaIj5GLDckJCIzLicpW1VYQ0x0SUYsJCIzJT5ab3hPMl1LIkYsNyQkIjNbazZvJ1woUiE0JEYsJCIzb0wkSCl6NiRvKyJGLDckJCIzI0hXUHphaXU1JEYsJCIzMl5sIT4lWz52bkZqbjckJCIzT0BQPipmRlg3JEYsJCIzeSNmImU0JFJtUyRGam43JEZndCQiMyFHMC9rI3BlemkhI0QtJSZDT0xPUkc2KSUkUkdCRyQiIzUhIiIkIiIhRmhlbkZpZW5GaWVuRmllbkZpZW4tJStBWEVTTEFCRUxTRzYnUSJ0NiJRIUZfZm4tJSVGT05URzYkJSpIRUxWRVRJQ0FHRmdlbiUrSE9SSVpPTlRBTEdGZWZuLSUlVklFV0c2JDskISthRWZUSiEiKiQiK2FFZlRKRlxnbjskITIlPScqM2pJJilcTiEjOyQiMltkUG9uPyRcTkZiZ24= There are problems for you to do, on the template 2270proj2b.mws, which you can download from our Maple page.