Product Tips & Techniques

Tips and Tricks on how to get the most about Maple and MapleSim

A customer on Twitter recently asked why Maple gives the following result:

 

 


The issue here is that the t in f(t) is the same as the integration variable. 140 characters is not a lot to work with for a reply, so here is a longer explanation.

 

First, note that the process of integration treats the integration variable differently than the other variables, so that replacing another variable by the integration variable has a different effect depending on whether the replacement is done before or after the integration is performed. Consider this simple example:

 

a := int(t, t)

(1/2)*t^2

(4)

eval(a, t = x)

(1/2)*x^2

(5)

a := int(x, t)

x*t

(6)

   

eval(a, t = x)

x^2

(7)

 

In other words, integration does not commute with substitution. This is a fundamental property of integration and in fact, Maple's eval has special rules to take this into account when you ask it to replace the integration variable.  For example, if you evaluate the inert form of the integral at x = y, the substitution is performed explicitly:

 

 

eval(Int(x-t, t = 0 .. x), x = y)

Int(y-t, t = 0 .. y)

(8)

value(Int(y-t, t = 0 .. y))

(1/2)*y^2

(9)

 

However, if you try to evaluate at x = t, the evaluation is delayed until after the integral is evaluated:

 

eval(Int(x-t, t = 0 .. x), x = t)

eval(Int(x-t, t = 0 .. x), {x = t})

(10)

 

value(eval(Int(x-t, t = 0 .. x), {x = t}))

(1/2)*t^2

(11)

 

The eval command knows it shouldn't substitute into an integral when the substitution involves the variable of integration.

 

However, in the user's example, asking Maple for f(t) is equivalent to substitution directly before the integration is performed, like this:

 

subs(x = t, Int(x-t, t = 0 .. x))

Int(0, t = 0 .. t)

(12)

which of course gives:

 

value(%)

0

(13)

 

Another way to have the two t variables be considered distinct is to explicitly make the integration variable a dummy by declaring it local:

 

f := proc (x) local t; int(x-t, t = 0 .. x) end proc
 

Now the ts are treated differently:

 

f(t)

(1/2)*t^2

(14)

``

Austin Roche

Senior Math Developer

Maplesoft

 

Download integration_variables.mw

Updates are now available for both Maple 18 and MapleSim 6.4. 

Maple 18.02 contains improvements to many areas, including:

  • Rendering of 2-D plots
  • Help pages and examples
  • Interactive components
  • MATLAB 2014a support
  • Math engine: Laplace transforms, complex floats, simplify
  • Matrix import
  • Context menus
  • Typesetting
  • Memory management
  • OpenMaple API
  • Physics (details in comments)

To get this update, you can use Tools>Check for Updates from within Maple, or visit Maple 18.02 Downloads. (But depending on when you read this, Check for Updates may not have kicked in yet. If it doesn't find anything, wait until tomorrow morning and try again.)

For those users who haven't upgraded to MapleSim 7 yet, MapleSim 6.4.01 includes:

  • Efficiency improvements to the simulation engine, taking advantage of enhancements in Maple 18.02
  • Improvements to C code generation for model export
  • Improved handling of indexed variables when generating Modelica code

In MapleSim, use  Help>Check for Updates or visit MapleSim 6.4.02 Update. Note that MapleSim 6.4.02 is compatible with Maple 18.02.  Upgrade your Maple 18 installation to Maple 18.02 before installing this MapleSim update.

eithne

Updates are now available for both Maple 18 and MapleSim 6.4. 

Maple 18.02 contains improvements to many areas, including:

  • Rendering of 2-D plots
  • Help pages and examples
  • Interactive components
  • MATLAB 2014a support
  • Math engine: Laplace transforms, complex floats, simplify
  • Matrix import
  • Context menus
  • Typesetting
  • Memory management
  • OpenMaple API
  • Physics (details in comments)

To get this update, you can use Tools>Check for Updates from within Maple, or visit Maple 18.02 Downloads. (But depending on when you read this, Check for Updates may not have kicked in yet. If it doesn't find anything, wait until tomorrow morning and try again.)

For those users who haven't upgraded to MapleSim 7 yet, MapleSim 6.4.01 includes:

  • Efficiency improvements to the simulation engine, taking advantage of enhancements in Maple 18.02
  • Improvements to C code generation for model export
  • Improved handling of indexed variables when generating Modelica code

In MapleSim, use  Help>Check for Updates or visit MapleSim 6.4.02 Update. Note that MapleSim 6.4.02 is compatible with Maple 18.02.  Upgrade your Maple 18 installation to Maple 18.02 before installing this MapleSim update.

eithne

Updates are now available for both Maple 18 and MapleSim 6.4. 

Maple 18.02 contains improvements to many areas, including:

  • Rendering of 2-D plots
  • Help pages and examples
  • Interactive components
  • MATLAB 2014a support
  • Math engine: Laplace transforms, complex floats, simplify
  • Matrix import
  • Context menus
  • Typesetting
  • Memory management
  • OpenMaple API
  • Physics (details in comments)

To get this update, you can use Tools>Check for Updates from within Maple, or visit Maple 18.02 Downloads. (But depending on when you read this, Check for Updates may not have kicked in yet. If it doesn't find anything, wait until tomorrow morning and try again.)

For those users who haven't upgraded to MapleSim 7 yet, MapleSim 6.4.01 includes:

  • Efficiency improvements to the simulation engine, taking advantage of enhancements in Maple 18.02
  • Improvements to C code generation for model export
  • Improved handling of indexed variables when generating Modelica code

In MapleSim, use  Help>Check for Updates or visit MapleSim 6.4.02 Update. Note that MapleSim 6.4.02 is compatible with Maple 18.02.  Upgrade your Maple 18 installation to Maple 18.02 before installing this MapleSim update.

eithne

Maplesoft regularly hosts live webinars on a variety of topics. Below you will find details on upcoming webinars we think may be of interest to the MaplePrimes community.  For the complete list of upcoming webinars, visit our website.

Creating Questions in Maple T.A. – Part #1

This webinar will demonstrate how to create questions in Maple T.A., Maplesoft’s testing and assessment solution for any course involving mathematics. The presentation will begin with an overview of the basic types of questions available, and then delve into how to create various types of questions in Maple T.A. Incorporating algorithms and feedback directly into questions will also be touched on. Finally, the session will wrap up with an explanation and several examples of how to create better questions using the question designer.

This first webinar in a two part series will cover true/false, multiple choice, numeric, mathematical formula, fill in the blank, sketch, and FBD questions. A second webinar that demonstrates more advanced question types will follow.

To join us for the live presentation, please click here to register.

Clickable Calculus: Linear Algebra

In this webinar, Dr. Robert Lopez will apply the techniques of “Clickable Calculus” to standard calculations in Linear Algebra.

Clickable Calculus, the idea of powerful mathematics delivered using very visual, interactive point-and-click methods, offers educators a new generation of teaching and learning techniques. Clickable Calculus introduces a better way of engaging students so that they fully understand the materials they are being taught. It responds to the most common complaint of faculty who integrate software into the classroom – time is spent teaching the tool, not the concepts.

To join us for the live presentation, please click here to register.

MapleNet 18 is now available.  MapleNet 18 provides increased mobile support and eliminates the need for a Java plug-in when interacting with Maple documents in a web browser. See What’s New in MapleNet 18 for more information.

 

eithne

We have just released a new version of MapleSim.

MapleSim 7 makes it substantially easier to explore and validate designs, create and manage libraries of custom components, and use your MapleSim models with other tools. It includes:

  • Easy model investigation. A new Results Manager gives you greater flexibility when it comes to investigating your simulation results, including the ability to compare simulation runs on the same axes, instantly plot both probed and unprobed variables, and easily create custom plots.
  • Convenient library creation. With MapleSim 7, it is significantly easier to create, manage, and share libraries of custom components.
  • Improved Modelica support. MapleSim 7 expands the support of the Modelica language so that more Modelica definitions can be used directly inside MapleSim.

We have also updated and expanded the MapleSim 7 family of add-on products:

  • The new MapleSim Battery Library, which is available as a separate add-on, allows you to incorporate physics-based predictive models of battery cells into your system models so you can take battery behavior into account early in the design process. 
  • The MapleSim Connector for FMI, which allows engineers to share very efficient, high-fidelity models created in MapleSim with other modeling tools, has been expanded to support more export formats for co-simulation and model exchange.

See What’s New in MapleSim 7 for more information about these and other improvements in MapleSim.

 

eithne

Someone asked on math.stackexchange.com about plotting x*y*z=1 and, while it's easy enough to handle it with implicitplot3d it raised the question of how to get nice constained axes in the case that the x- or y-range is much less than the z-range.

Here's what WolframAlpha gives. (Mathematica handles it straight an an plot of the explict z=1/(x*y), which is interesting although I'm more interested here in axes scaling than in discontinuous 3D plots)

Here is the result of a call to implicitplot3d with default scaling=unconstrained. The axes appear like in a cube, each of equal "length".

 

Here is the same plot, with scaling=constrained. This is not pretty, because the x- and y-range are much smalled than the z-range.

 

How can we control the axes scaling? Resizing the inlined plot window with the mouse just affects the window. The plot itself remains  rendered in a cube. Using right-click menus to rescale just makes all axes grow or shrink together.

One unattractive approach it to force a small z-view on a plot of a much larger z-range, for a piecewise or procedure that is undefined outisde a specific range.

plots:-implicitplot3d(proc(x,y,z)
                        if abs(z)>200 then undefined;
                        else x*y*z-1; end if;
                      end proc,
                      -1..1, -1..1, -200..200, view=[-1..1,-1..1,-400..400],
                      style=surfacecontour, grid=[30,30,30]);

Another approach is to scale the x and y variables, scale their ranges, and then force scaled tickmark values. Here is a rough procedure to automate such a thing. The basic idea is for it to accept the same kinds of arguments are implicitplot3d does, with two extra options for scaling the axis x-relative-to-z, and axis y-relative-to-z.

implplot3d:=proc( expr,
                  rng1::name=range(numeric),
                  rng2::name=range(numeric),
                  rng3::name=range(numeric),
                  {scalex::numeric:=1, scaley::numeric:=1} )
   local d1, d2, dz, n1, n2, r1, r2, rngs, scx, scy;
   uses plotfn=plots:-implicitplot3d;
   (n1,n2) := lhs(rng1), lhs(rng2);
   dz := rhs(rhs(rng3))-lhs(rhs(rng3));
   (scx,scy) := scalex*dz/(rhs(rhs(rng1))-lhs(rhs(rng1))),
                scaley*dz/(rhs(rhs(rng2))-lhs(rhs(rng2)));
   (r1,r2) := map(`*`,rhs(rng1),scx), map(`*`,rhs(rng2),scy);
   (d1,d2) := rhs(r1)-lhs(r1), rhs(r1)-lhs(r1);
   plotfn( subs([n1=n1/scx, n2=n2/scy], expr),
           n1=r1, n2=r2, rng3, _rest[],
           ':-axis[1]'=[':-tickmarks'=[seq(i=evalf[3](i/scx),i=r1,d1/4)]],
           ':-axis[2]'=[':-tickmarks'=[seq(i=evalf[3](i/scy),i=r2,d2/4)]],
           ':-scaling'=':-constrained');
end proc:

The above could be better. It could also detect user-supplied custom x- or y-tickmarks and then scale those instead of forming new ones.

Here is an example of using it,

implplot3d( x*y*z=1, x=-1..1, y=-1..1, z=-200..200, grid=[30,30,30],
            style=surfacecontour, shading=xy, orientation=[-60,60,0],
            scalex=1.618, scaley=1.618 );

Here is another example

implplot3d( x*y*z=1, x=-5..13, y=-11..5, z=-200..200, grid=[30,30,30],
            style=surfacecontour, orientation=[-50,55,0],
            scaley=0.5 );

Ideally I would like to see the GUI handle all this, with say (two or three) additional (scalar) axis scaling properties in a PLOT3D structure. Barring that, one might ask whether a post-processing routine could use plots:-transform (or friend) and also force the tickmarks. For that I believe that picking off the effective x-, y-, and z-ranges is needed. That's not too hard for the result of a single call to the plot3d command. Where it could get difficult is in handling the result of plots:-display when fed a mix of several spacecurves, 3D implicit plots, and surfaces.

Have I overlooked something much easier?

acer

Maplesoft regularly hosts live webinars on a variety of topics. Below you will find details on some upcoming webinars we think may be of interest to the MaplePrimes community.  For the complete list of upcoming webinars, visit our website.

Maplesoft Solutions for Math Education

This webinar will demonstrate how Maplesoft’s solutions for mathematics education help teachers bring complex problems to life, allow students to focus on concepts rather than the mechanics of solutions, and offer students the necessary practice to master the concepts being taught.

Key takeaways include:

• How to quickly and painlessly place incoming students in the correct math courses

• How you can use hundreds of intuitive Clickable Math tools to demonstrate and explore up to advanced-level problems and algorithms in the classroom

• How to automate your testing and assessment needs, specifically for math courses

• How to bring your STEM courses to life in an online environment

To join us for the live presentation, please click here to register.

Introduction to Maple T.A. Placement Test Suite 10

This webinar will provide an overview and demonstration of the latest release of the Maple T.A. MAA Placement Test Suite. A result of the ongoing partnership between the Mathematical Association of America (MAA) and Maplesoft, this product gives you the ability to provide the renowned MAA placement tests in an online testing environment. Learn how the Maple T.A. MAA Placement Test Suite can greatly simplify your placement process and explore the latest additions, including a streamlined interface and new tests to determine your students’ readiness for Precalculus and Algebra courses.

To join us for the live presentation, please click here to register.

There is also a recording available from another live webinar we did earlier this month: Introduction to Maple T.A. 10.

Aujourd’hui, je suis ravis d’annoncer la disponibilité d’une large banque de questions françaises supportant les enseignements du secondaire et de l’enseignement supérieur. Ce contenu didactique est disponible via le MapleTA Cloud, et également grâce au lien de téléchargement ci-dessous.

Lien de téléchargement de la banque de questions françaises

Ces questions sont librement et gratuitement accessibles, et vous pouvez les utiliser directement sur vos propres évaluations et exercices dans MapleTA, ou les éditer et modifier pour les adapter à vos besoins.

Le contenu de cette banque de questions françaises traite de sujets pour les classes et enseignements pré-bac, post-bac pour en majorité les matières scientifiques.

Les matières traitées par niveaux et domaines sont:

Lycées :

  • Electricité
  • Équations Différentielles
  • Gravitation universelle
  • Langues
  • Maths I
  • Maths II
  • Physique
  • Chimie
  • Mécanique

Enseignement supérieur (Post-Bac) :

  • Astrobiologie
  • Introduction au Calcul pour la Biologie
  • Chimie
  • Déplacement d'onde
  • Electricité & Magnétisme
  • Maths pour l’économie
  • Maths Post-Bac
  • Mécanique Angulaire
  • Mécanique des Fluides
  • Mécanique linéaire
  • Physique Post-Bac
  • Electrocinétique
  • Matériau
  • Mécanique des Fluides
  • Thermodynamique

Jonny Zivku
Maplesoft Product Manager, Maple T.A.

Several Maple T.A. users have developed comprehensive sets of question content and assignments to support full courses in Maple T.A. These questions are available through the Maple T.A. Cloud, and we have decided to also post the associated course modules on Maple Primes as an alternative way of accessing this content.

Below you will find a link to the Introductory Calculus Maple T.A.. course module developed by Keele University.

This testing content is freely distributed, and can be used in your own Maple T.A. tests either as-is, or with edits.

These questions are designed to accompany the first semester of an introductory honours calculus course. The course is intended primarily for students who need or expect to pursue further studies in mathematics, physics, chemistry, engineering and computer science. With over 250 question, topics include: basic material about functions, polynomials, logs and exponentials, the concept of the derivative, and lots of practise exercises for finding derivatives and integrals, and material about series.

Jonny Zivku
Maplesoft Product Manager, Maple T.A.

Several Maple T.A. users have developed comprehensive sets of question content and assignments to support full courses in Maple T.A. These questions are available through the Maple T.A. Cloud, and we have decided to also post the associated course modules on Maple Primes as an alternative way of accessing this content.

Below you will find a link to the Introductory Calculus for Biological Sciences Maple T.A.. course module developed by the University of Guelph.

This testing content is freely distributed, and can be used in your own Maple T.A. tests either as-is, or with edits.

The Introductory Calculus for Biological Sciences course module is designed to cover a single-semester introductory calculus course for biological sciences students at the first-year university level. The questions are designed to span the topics listed below, allowing for practice, homework or testing throughout the semester.

Topics include:

  • Introduction to Functions
  • Composite and Inverse Functions
  • Trigonometric Functions
  • Logarithms and Exponents
  • Sequences and Finite Series
  • Limits and Continuity
  • Derivatives
  • Curve Sketching
  • Differentials
  • Linear Approximation
  • Taylor Polynomials
  • Difference Equations
  • Log-Log Graphs
  • Anti-Differentiation
  • Definite Integrals

Jonny Zivku
Maplesoft Product Manager, Maple T.A.

Erik Postma from Maplesoft has recently posted a Maple application going through some of the ways how to produce random numbers in Maple: http://www.maplesoft.com/applications/view.aspx?SID=153662&P=TC-4444

Doing a fair bit of work involving random numbers (i.e. simulations) myself, I was naturally drawn to it. The document is a nice extension of the relevant help pages, making practical use of some of the procs in RandomTools easier and clearer.

One particular issue I recently ran into, however, is not covered. I needed a random generator for a particular custom pdf (not one of the already recognized pdfs) that happens to be 3-dimensional. And I needed to do this >twice<, with the second generation using the result of the first one as a parameter. the problem is not unlike the last example in the help page for Statistics:-Sample.

Here is what I did:

The pdf looks graphically like this (and note that in this plot it is not normalized):

plot3d(Triangle63:-Trianglef(CrystalAngle,DeflectionAngle),\
       CrystalAngle=-0.8..0.2,DeflectionAngle=-0.6..0.6,projection=0.7);

The first set of random numbers is generated by setting CrystalAngle to a fixed number (-0.1 in this case), normalizing the pdf to the integral over DeflectionAngle and then generating the random numbers. Note that evaluation of the integral is relatively time-consuming (seconds).

trianglepdf:=(CrystalAngle,DeflectionAngle) ->\
             Triangle63:-Trianglef(CrystalAngle,DeflectionAngle)/\
             'evalf(Int(Triangle63:-Trianglef(CrystalAngle,Da),Da=-0.6..0.6,method = _d01akc))':
triangle0pdf:=(t) -> trianglepdf(-0.1,t):
Cr1:=Distribution(PDF=triangle0pdf);
Y:=RandomVariable(Cr1);

samples:=Sample(Y,[1..600],method=[envelope,range=-0.6..0.6]);

Histogram(samples,view=[-0.6..0.6,default],labels=["Deflection Angle  (µrad)","Counts/bin"]);

This looks as it should; and the random number generation is reasonably fast once the initial setup has been done (i.e. the time used scales only relatively weakly with the count of random numbers generated.

The issue now is the second stage, where for each new random number, the number generated above is a new input parameter for CrystalAngle. So I can no longer define the pdf once since the pdf is different for each number generated.

The pedestrian way to do this is like the following:

samples2:=Vector(1..numelems(samples),datatype=float):
CrystalOffset:=0.3;

for ii from 1 to numelems(samples) do
  triangleiipdf:=(t) -> (trianglepdf(samples[ii]-~CrystalOffset,t)); # subtract (VR peak -> 0)
  Crii:=Distribution(PDF=triangleiipdf);
  samples2[ii]:=evalf(Sample(RandomVariable(Crii),1,method=[envelope,range=-0.6..0.6])[1]+CrystalOffset);
end do:

This works, but only sort-of. First, it is very slow, since the whole sertup happens for each number generated (Sample()). Secondly, it tends to hang at a certain number of steps through the loop. The value of ii where it hangs is arbitrary and changes with the other parameters and CrystalOffset. It is however consistent for identical runs.

The last example in help for Statistics:-Sample would indicate that one needs to setup the pdf as a function of t as well as the parameter, call Distribution() only once and then assign the value to the parameter and call Sample() to get the random number(s) drawn from the pdf with the parameter being set to the wanted value. While this works in the example which uses a built-in pdf, I find that I cannot make it work with my pdf. Either the parameter gets ignored (i.e. stuck at the first value) or the thing runs just as slowly as my procedure above.

Ultimately I programmed my own random generator for an arbitrary pdf which, while not as efficient as Maple's built-in generator, does produce the expected set of random numbers for the 2nd path in a reasonable time. It is a simple-minded envelope-rejection method, that works fo reasonably well-behaved pdfs:

Rarbit:=proc(pdf,xmin,xmax,pdfmax)
local dx:=xmax-xmin;
local x1,x2;
x1:=RandomTools[MersenneTwister]:-GenerateFloat64()*dx+xmin; # pick location on x axis
x2:=RandomTools[MersenneTwister]:-GenerateFloat64()*pdfmax; # y axis, probability of returning x1

while (x2>evalf(pdf(x1))) do # if above pdf, reject
  x1:=RandomTools[MersenneTwister]:-GenerateFloat64()*dx+xmin; # new x-axis value
  x2:=RandomTools[MersenneTwister]:-GenerateFloat64()*pdfmax; # check value
end do; # eventually we'll succeed and return one.

x1;
end proc;

Using this routine I get my second and final set of randome:

for ii from 1 to numelems(samples) do
  newpdf:=(DefAng) -> Triangle63:-Trianglef(samples[ii]-CrystalOffset,DefAng);
  samples2[ii]:=Random:-Rarbit(newpdf,-0.6,0.6,28);
  DocumentTools:-SetProperty(ProgressBar,'value',ii,refresh);
end do:
                      CrystalOffset := 0.3
Histogram(samples2+~samples,view=[-0.6..0.6,default]);

 I would be interested in Erik's comment on this.

Mac Dude

 

Several Maple T.A. users have developed comprehensive sets of question content and assignments to support full courses in Maple T.A. These questions are available through the Maple T.A. Cloud, and we have decided to also post the associated course modules on Maple Primes as an alternative way of accessing this content.

Below you will find a link to the Introductory Mathematical Economics Maple T.A.. course module developed by the University of Guelph.

This testing content is freely distributed, and can be used in your own Maple T.A. tests either as-is, or with edits.

The Introductory Mathematical Economics course module is designed to cover a single-semester course in mathematical economics for economics and commerce students at the second-year university level. The questions are designed to span the topics listed below, allowing for practice, homework or testing throughout the semester.

Topics include:

  • Rules of Differentiation
  • First Order Differential Equations
  • Higher Order Derivatives
  • Optimization in One Variable
  • Second Order Conditions for Optimization
  • Systems of Linear Equations
  • Optimization with Direct Restrictions on Variables
  • Over Determined and Under Determined Systems
  • Matrix Representation of Systems
  • Gauss Jordan
  • Matrix Operations
  • Types of Matrices
  • Determinants and Inverses
  • Partial Differentiation
  • Second Order Partial Derivatives
  • Multivariate Optimization
  • Second Order Conditions for Multivariate Optimization
  • Multivariate Optimization with Direct Restrictions of Variables
  • Constrained Optimization and the Lagrangean Method
  • Second Order Conditions for Constrained Optimization

Jonny Zivku
Maplesoft Product Manager, Maple T.A.

Several Maple T.A. users have developed comprehensive sets of question content and assignments to support full courses in Maple T.A. These questions are available through the Maple T.A. Cloud, and we have decided to also post the associated course modules on Maple Primes as an alternative way of accessing this content.

Below you will find a link to the Introductory Electricity & Magnetism Maple T.A.. course module developed by the University of Guelph.

This testing content is freely distributed, and can be used in your own Maple T.A. tests either as-is, or with edits.

The Introductory Electricity & Magnetism course module is designed to cover a single-semester course in electricity and magnetism for physical sciences students at the first-year university level. The questions are designed to span the topics listed below, allowing for practice, homework or testing throughout the semester. Using the Maple engine that is part of Maple TA, a custom grading engine has been developed to provide even more flexible grading of scalar and vector responses. This partial grading engine can be configured to, among other things, assign part marks for missing units, transposed or missing vector components or missing algebraic terms.


Topics include:

  • Cross Products
  • Coulomb’s Law
  • Electric Fields
  • Point Charge Distributions
  • Continuous Charge Distributions (Integration)
  • Electric Potential
  • Electric Potential Energy
  • Electromotive Force
  • Resistance
  • Capacitance
  • Kirchhoff’s Laws
  • Magnetic Fields
  • Magnetic Fields Due to Current Carrying Wires
  • Forces on Wires in Magnetic Fields
  • Forces on Charges in Electric and/or Magnetic Fields
  • EM Waves
  • Two Source Interference
  • Double Slit Interference
  • Single Slit Diffraction
  • Diffraction Gratings

Jonny Zivku
Maplesoft Product Manager, Maple T.A.

First 23 24 25 26 27 28 29 Last Page 25 of 65