acer

32405 Reputation

29 Badges

19 years, 345 days
Ontario, Canada

Social Networks and Content at Maplesoft.com

MaplePrimes Activity


These are answers submitted by acer

With the values for some variables set as in special below, then is it not clear that there are infinitely many solutions for the remaning variables, if r22 is taken between -1 and 1?
 

restart;

eq1:=r11^2+r21^2+r31^2 = 1:
eq2:=r12^2+r22^2+r32^2 = 1:
eq3:=r13^2+r23^2+r33^2 = 1:
eq4:=r11*r12+r21*r22+r31*r32 = 0:
eq5:=r11*r13+r21*r23+r31*r33 = 0:
eq6:=r12*r13+r22*r23+r32*r33 = 0:
eq7:=-30*r13-.79382581863774e-1*s1*r11-.95259098236529e-1*s1*r12
     +.992282273297173*s1*r13 = -.83717247687439e-1*t1:
eq8:=-30*r13+.79382581863774e-1*s2*r11+.95259098236529e-1*s2*r12
     +.992282273297173*s2*r13 = .76364294519742e-1*t2:
eq9:=-30*r13-.86165283952334e-1*s3*r11+.103398340742801*s3*r12
     +.990900765451843*s3*r13 = -.81460429387834e-1*t3:
eq10:=-30*r23-.79382581863774e-1*s1*r21-.95259098236529e-1*s1*r22
     +.992282273297173*s1*r23 = -.107930827800543*t1:
eq11:=-30*r23+.79382581863774e-1*s2*r21+.95259098236529e-1*s2*r22
      +.992282273297173*s2*r23 = .60269029165473e-1*t2:
eq12:=-30*r23-.86165283952334e-1*s3*r21+.103398340742801*s3*r22
      +.990900765451843*s3*r23 = .105021268850622*t3:
eq13:=-30*r33-.79382581863774e-1*s1*r31-.95259098236529e-1*s1*r32
      +.992282273297173*s1*r33 = .990627255252918*t1-30:
eq14:=-30*r33+.79382581863774e-1*s2*r31+.95259098236529e-1*s2*r32
      +.992282273297173*s2*r33 = .995256820446840*t2-30:
eq15:=-30*r33-.86165283952334e-1*s3*r31+.103398340742801*s3*r32
      +.990900765451843*s3*r33 = .991128009660183*t3-30:

sys:=[eq1,eq2,eq3,eq4,eq5,eq6,eq7,eq8,eq9,eq10,
      eq11,eq12,eq13,eq14,eq15]:
vars:=indets(sys, And(name,Non(constant)));

{r11, r12, r13, r21, r22, r23, r31, r32, r33, s1, s2, s3, t1, t2, t3}

special:=[r13=0, r23=0, r31=0, r32=0, r33=1,
          s1=0, s2=0, s3=0, t1=0, t2=0, t3=0]:

simpler:=remove(s->(lhs-rhs)(s)=0, {eval(sys, special)[]});

{r11^2+r21^2 = 1, r12^2+r22^2 = 1, r11*r12+r21*r22 = 0}

manysols:=solve(simpler, [r11,r12,r21], AllSolutions, Explicit):

map(print, manysols):

[r11 = r22, r12 = (-r22^2+1)^(1/2), r21 = -(-r22^2+1)^(1/2)]

[r11 = r22, r12 = -(-r22^2+1)^(1/2), r21 = (-r22^2+1)^(1/2)]

[r11 = -r22, r12 = (-r22^2+1)^(1/2), r21 = (-r22^2+1)^(1/2)]

[r11 = -r22, r12 = -(-r22^2+1)^(1/2), r21 = -(-r22^2+1)^(1/2)]

eval( eval(map(rhs-lhs,sys),special), manysols[1] );

[0, 0, 0, 0, 0, 0, 0., 0., 0., 0., 0., 0., 0., 0., 0.]

 


Download polysys2.mw

First, a few comments:

A few years (Maple major releases) ago the style of Help pages was changed so that Execution Group Boundaries were hidden from view in most Help pages Examples. The default setting for non-Help Documents and Worksheets is that Execution Group Boundaries are shown, however. That's the reason you see the mismatch between what appears in the Help page and what happens when you type the example into a fresh Document or Worksheet.

As Samir mentions, you can toggle the setting yourself, obtaining the non-default display that matches the current/modern Help pages.

nb. If, from the Help browser, you open the help page as a Document in the main Maple window then it retains its setting w.r.t. display/hiding of Markers like Execution Group Boundaries. So with default settings for File->New Documents/Worksheets (that show such Markers) you'll also see a mismatch between a fresh New Document and a Help page opened as Document.

Now, a suggestion:

I notice that your attachment is a Document, rather than a Worksheet. The more common unit for input/output in a Document is the Document-Block (which wraps around some Execution-Group) rather than the bare Execution-Group. An Execution-Group contained in a Document-Block does not get its Execution Group Boundaries shown. And so it seems to me that a Document-Block would provide an alternative, natural mechanism to get the effect you seem to want (of a Document's style) in your Document.

nb. The main menubar's View->Markers checkbox controls whether Document-Block boundaries are shown. Note that -- when shown -- those appear in a thin column to the left and outside of the actual sheet, whereas boundaries of bare Execution Groups are shown as black brackets within the actual sheet.

Here's an attachment where I have left the View->Show/Hide Contents...->Markers->Execution Group Boundaries toggled on. 

Download displayDocBlock.mw

You can apply the commands lhs and rhs to a range such as 1490.90920124091 .. 1497.18170785000 in order to extract the end-points.

expr := 1490.90920124091 .. 1497.18170785000:

lhs(expr);
                   1490.90920124091

rhs(expr);
                   1497.18170785000

I can reproduce the problem in Maple 17.02 on a 64bit OS X host as well as on a 64bit Linux host.

The problem seems (at least in part) to be in the `combine/ln` procedure, but I have not really dug down into that.

restart; kernelopts(printbytes=false):                                                         

kernelopts(version);

            Maple 17.02, APPLE UNIVERSAL OSX, Sep 5 2013, Build ID 872941

`combine/ln`:=u->u: # extraordinary measure

ans:=CodeTools:-Usage( int(3628800/(y*(1/2+y)^11)
                           -3628800/(y*(39/2+y)^11), y=39/2..infinity) ):
  memory used=13.75MiB, alloc change=32.00MiB,
  cpu time=218.00ms, real time=321.00ms

lprint(ans);                                                                                   

 87385605194015325709926400/3919454781758919*ln(2)-7431782400*ln(3)
 -7431782400*ln(13)-53097887349433051488808628851346857/
 282200744286642168000000000+7431782400*ln(5)

And now, after restart,

restart;
ans:=87385605194015325709926400/3919454781758919*ln(2)-7431782400*ln(3)
 -7431782400*ln(13)-53097887349433051488808628851346857/
  282200744286642168000000000+7431782400*ln(5):

combine(ans);
memory used=49975.3MB, alloc=2666.1MB, time=189.08
memory used=51387.2MB, alloc=4078.1MB, time=189.75
memory used=52093.2MB, alloc=4784.1MB, time=189.77
memory used=52097.7MB, alloc=4784.1MB, time=189.84
memory used=52099.3MB, alloc=4785.4MB, time=189.85
Interrupted

Another workaround for the given example is to force the ftocms method of the int command.

restart; kernelopts(printbytes=false):

ans:=CodeTools:-Usage( int(3628800/(y*(1/2+y)^11)-3628800/(y*(39/2+y)^11),
                           y=39/2..infinity, method=ftocms) ):
memory used=15.56MiB, alloc change=24.00MiB, cpu time=210.00ms, real time=314.00ms

lprint(ans);
 -53097887349433051488808628851346857/282200744286642168000000000
 +7431782400*ln(40)-29128535064671775175475200/
 3919454781758919*ln(39)-91750400/3919454781758919*ln(78)

oldans:=87385605194015325709926400/3919454781758919*ln(2)-7431782400*ln(3)
  -7431782400*ln(13)-53097887349433051488808628851346857/
  282200744286642168000000000+7431782400*ln(5):

simplify(ans - oldans);

                                     0

Here is a simpler instance of trouble within `combine/ln` . In Maple 

restart;                                                        
kernelopts(version);

        Maple 17.02, APPLE UNIVERSAL OSX, Sep 5 2013, Build ID 872941

expr:=87385605194015325709926400/3919454781758919*ln(2)-ln(3):

combine(expr);
memory used=195798.0MB, alloc=2666.1MB, time=25.01
memory used=198455.8MB, alloc=5324.0MB, time=26.77
memory used=201156.1MB, alloc=8024.2MB, time=29.39
Interrupted

Now, you wouldn't want `combine/ln` to never do anything, as in my crudest workaround at top.

I might be able to figure out how to patch your Maple 17.02 `combine/ln` (say as a "hotfix" with ToInert/FromInert to avoid copyright issues). If I do I'll let you know. (It might be related to the elif d = 1 then clause shown around line 92 under showstat(`combine/ln`) in your version. A preliminary attempt shows your example succeeding after that... but it'd require more examination. Such a change would, I suspect, return the shorter, simpler example above unchanged by combine.)

That link you gave indicates that within Matlab you can issue a command of the form

maple( ' ... ' )

and have the statement enclosed in single right-quotes be dispatched to the Maple symbolic engine. Is that correct?

If that is the case then (as I mentioned to you on stackexchange) you could use the Maple command zip to obtain a Matrix of equations from two given Matrix exp1 and exp2.  Did you try,

maple('zip(`=`,exp1,exp2)')

where the symbol `=`  is enclosed in single left-quotes?

Each of the commands evala , rationalize , and radnormal succeed in getting that form in Maple 17.02.

Using the avoid option of fsolve seems to be another way to get two distinct solutions.

Using 64bit Maple 2017.2 for Linux this worked for me at default Digits=10, without having to restrict the ranges narrower than the given 0<=beta,delta<=1 .

restart;

focdeltapioptS2Tbeta_eg := 2.*delta*(-8.016120437*10^13*beta-5.599041156*10^11*beta^4-9.950892840*10^12*beta^3+4.172202042*10^9*beta^2*delta^6-3.593992717*10^11*beta^5*delta^2-5.153172141*10^12*beta^4*delta^2+1.100201852*10^9*beta^4*delta^8+3.667339507*10^8*beta^6*delta^8-3.667339507*10^8*beta^3*delta^8-1.100201852*10^9*beta^5*delta^8+2.670209307*10^9*beta^4*delta^4+1.032944471*10^10*beta^3*delta^4+2.114848520*10^13*beta^2*delta^2-1.562440115*10^13*beta^3*delta^2-6.630411895*10^9*beta^3*delta^6-1.582188745*10^10*beta*delta^4+1.713992189*10^9*beta^5*delta^6+7.442176619*10^8*beta^4*delta^6+2.822233434*10^9*beta^2*delta^4+2.464874192*10^10*beta*delta^2+2.000000000*10^10*delta^2-5.383607038*10^13*beta^2)/(-2636.981242*beta^2*delta^2+2636.981242*beta*delta^2-4108.123654*beta-10000.)^3:

focbetapioptS2Tbeta_eg := (.8333333333*(1.784795533*10^13*beta^4*delta^6-1.780394727*10^13*beta^5*delta^6-5.910514827*10^13*beta^2*delta^4-5.501009263*10^10*beta^8*delta^6+1.701903476*10^14*beta*delta^2+1.100201852*10^10*beta^9*delta^6+1.100201852*10^11*beta^7*delta^6+5.842965601*10^12*beta^6*delta^6-3.878841795*10^13*beta+2.205824535*10^11*beta^5+1.735006720*10^11*beta^4+4.159889289*10^10*beta^6+7.379516540*10^12*beta^3-6.234247772*10^11*beta^6*delta^4+5.141976568*10^10*beta^8*delta^4-1.126878340*10^12*beta^5*delta^2-3.757524927*10^13*beta^4*delta^4+1.556869544*10^13*beta^5*delta^4-8.051300147*10^10*beta^7*delta^4+1.496707827*10^11*beta^6*delta^2+8.010627926*10^10*beta^7*delta^2+1.459035087*10^13-9.619344526*10^13*delta^2+2.590921095*10^11*beta^2-5.952985789*10^12*beta^3*delta^6+2.536603101*10^13*beta*delta^4+1.142130779*10^13*beta^4*delta^2-3.282217618*10^13*beta^2*delta^2-5.169893249*10^13*beta^3*delta^2+5.639818880*10^13*beta^3*delta^4))/((-1.+beta)^2*(-2636.981242*beta^2*delta^2+2636.981242*beta*delta^2-4108.123654*beta-10000.)^3):

fsolve({focdeltapioptS2Tbeta_eg, focbetapioptS2Tbeta_eg},
             {beta=0..1, delta=0..1}):
op(0,eval(%,1));
sol1:=%%;

set

{beta = .3884692297, delta = 0.}

fsolve({focdeltapioptS2Tbeta_eg, focbetapioptS2Tbeta_eg},
             {beta=0..1, delta=0..1}, avoid={sol1}):
op(0,eval(%,1));
sol2:=%%;

set

{beta = 0.3784251243e-4, delta = .3894512919}

fsolve({focdeltapioptS2Tbeta_eg, focbetapioptS2Tbeta_eg},
             {beta=0..1, delta=0..1}, avoid={sol1, sol2}):
op(0,eval(%,1));
# fsolve has returned unevaluated, ie. no other solution found.

fsolve

# We can automate the above process, attempting
# (avoiding) fsolve calls until it returns unevaluated.

foundsols:={}:
sol:=fsolve({focdeltapioptS2Tbeta_eg, focbetapioptS2Tbeta_eg},
             {beta=0..1, delta=0..1}, avoid=foundsols);
while type(eval(sol,1),specfunc(fsolve)) <> true do
  foundsols := foundsols union {sol};
   sol:=fsolve({focdeltapioptS2Tbeta_eg, focbetapioptS2Tbeta_eg},
             {beta=0..1, delta=0..1}, avoid=foundsols);
end do:
foundsols;

{beta = .3884692297, delta = 0.}

{{beta = 0.3784251243e-4, delta = .3894512919}, {beta = .3884692297, delta = 0.}}

kernelopts(version);

`Maple 2017.2, X86 64 LINUX, Jul 19 2017, Build ID 1247392`

 


Download bivar.mw

An earlier post of yours was marked as Product: Maple 18 , which would explain why you are not always getting the same results from other members here, using just the simplify command.

If that guess is true then please mark all your Mapleprimes Questions as Maple 18 for the Product.

In the attached worksheet I show how you can get simpler results using Maple 18.02.

Download simp18.mw

Use time[real]() instead of time() to compare wall-clock timing.

(...and make sure that your machine is not otherwise loaded.)

You could also wrap the call with CodeTools:-Usage . Note the "cpu time" shows the addition from all threads (concurrent or otherwise), which is why you need to compare real-time instead. Eg,

restart;
N:=1000000: with(Threads): CodeTools:-Usage( Seq(sqrt(i),i=1. .. N) ):
memory used=1.21GiB, alloc change=302.20MiB, cpu time=11.41s, real time=2.99s, gc time=3.23s

restart;
N:=1000000: CodeTools:-Usage( seq(sqrt(i),i=1. .. N) ):
memory used=1.21GiB, alloc change=247.64MiB, cpu time=9.14s, real time=6.47s, gc time=4.34s

To emulate the general effect of Matlab's parfor you could look at Threads:-Seq (if the statements are thread-safe) or Grid:-Seq.

Since the syntax for parfor is like a that of a do-loop you might have to use a procedure in the Seq call, if you're trying to get the effect of multiple statements.

One can compare also with:

restart;
solve({x^3+x*a+2 > 0}, x, parametric);

{            3
{ [[RootOf(_Z  + _Z a + 2, index = real[3]) < x],
              3
    [RootOf(_Z  + _Z a + 2, index = real[1]) < x,
                  3
     x < RootOf(_Z  + _Z a + 2, index = real[2])]] , a < -3

    [[1 < x], [-2 < x, x < 1]] , a = -3
               3
    [[RootOf(_Z  + _Z a + 2, index = real[1]) < x]] , -3 < a
However...
restart; solve({x^3+x*a+2 > 0, a>-3}, x);

                             1/3              1/3
                           %1        a      %1        a
                      {x < ----- - -----}, {----- - ----- < x}
                             3       1/3      3       1/3
                                   %1               %1

                                              3      1/2
                            %1 := -27 + 3 (3 a  + 81)

restart; solve({x^3+x*a+2 > 0, a<-3}, x);

                             1/3              1/3
                           %1        a      %1        a
                      {x < ----- - -----}, {----- - ----- < x}
                             3       1/3      3       1/3
                                   %1               %1

                                              3      1/2
                            %1 := -27 + 3 (3 a  + 81)

So you originally called `define_external` with typed declarations for each of the arguments, instead of that `MAPLE` keyword argument? And then you edited the resulting generated C file?

You could try the same thing but in that preliminary call to `define_external` wrap REF(...) around the type for the `a3` parameter. Then compare with what you got before, and edit. (The auto-generated C code would declare both an ALGEB and a FLOAT64 variable associated with `a3` I think.)

I've done exactly the thing you want myself in the past, but I won't be able to look at the old files I had until Monday.

In such a scenario you would end up making the following call from Maple like,

  mult( 2., 3., 'mult1' );

using single-right (unevaluation) quotes.

 

I created this worksheet in Maple 16.02. Hopefully I have properly understood your goals.

restart;

xst := -1.0: xfn := 1.0: yst := -1.0: yfn := 1.0:

myfn := proc (x::numeric, y::numeric)

  local output;
  output := 5.0*x^2+y^2

end proc:

# If we had a way to obtain the z-value for any arbitrary (x,y)
# data point then we could use the `contourplot` command.
# We can even pass that command a `grid` option, to compute as
# fine a grid of z-values as we wish.
#
# The assumption is that this is not available to us. So the plot
# below is akin to an ideal, to which we may compare later plots.

plots:-contourplot(  myfn, xst .. xfn, yst .. yfn
                   , contours = [0.1, 0.5, 1.0, 1.5, 2.0]
                   , filledregions
                   , coloring=["Blue","Orange"]
                   , view=[xst..xfn, yst..yfn]
                  );

# The `Output` Array below contains the supplied data.
#
# The presumption is that this amount of discrete data is supplied
# by some black-box mechanism, and that we do not have the luxury of
# querying it for additional data. (If we could, then we'd just use
# the `contourplot` command on a procedure that could query that
# other process for any arbitary (x,y) point-pair.
#
# The formulas being used here convert any `i` and `j` integer index of
# the Array and turn those into corresponding `x` and `y` values within
# the ranges xst..xfn and yst..yfn.
#
# This step is emulating the black-box process by which the data
# is "given" to us (just the once). So the translated `x` and `y` values
# are used to compute the finite grid of discrete z-values.

a,b,c,d := -7,8,-5,6: # Or -10..10 and -10..10 or whatever you have.
Output := Array(a..b, c..d,
                (i, j) -> 5.0*(xst+(xfn-xst)*(i-a)/(b-a))^2
                          + (yst+(yfn-yst)*(j-c)/(d-c))^2):

# We can use the `listcontplot` command to produce a contour plot from
# the `Output` Array. Furthermore, we can use the `transform` command to
# turn the `listcontplot` axes (based on the integer Array indices) axes
# that correspond to the desired `x` and `y` ranges.

plottools:-transform((x,y)->[xst+(xfn-xst)*(x-1)/(b-a),
                             yst+(yfn-yst)*(y-1)/(d-c)])(
  plots:-listcontplot(  convert(Output,listlist)
                      , contours=[0.1, 0.5, 1.0, 1.5, 2.0]
                      , filledregions
                      , coloring=["Blue","Orange"]
                      , view=[xst..xfn, yst..yfn]
                     )
                    );

# The above plot is not very smooth, because we had only a small
# number of dicrete data points available.
#
# Now let's try and get smoother contours, by interpolating the
# supplied discrete data.
#
# We can use the CurveFitting:-ArrayInterpolation command for this.

newa,newb,newc,newd := 4*a,4*b,4*c,4*d;

-28, 32, -20, 24

# These are the original x and y points represented by
# the entries of Output.

xInput := Array(a .. b,
               (i)->xst+(xfn-xst)*(i-a)/(b-a),
               datatype=float[8]):
yInput := Array(c .. d,
               (i)->yst+(yfn-yst)*(i-c)/(d-c),
               datatype=float[8]):

# These are the new x and y points, at which
# we want to compute interpolated values.

newxInput := Array(newa .. newb,
                  (i)->xst+(xfn-xst)*(i-newa)/(newb-newa),
                  datatype=float[8]):

newyInput := Array(newc .. newd,
                  (i)->yst+(yfn-yst)*(i-newc)/(newd-newc),
                  datatype=float[8]):

newOutput := CurveFitting:-ArrayInterpolation(
               [Vector(xInput),Vector(yInput)],
               Array(Output,datatype=float[8]),
               Array(newa..newb,newc..newd,1..2,
                     (i,j,k)->`if`(k=1,newxInput[i],newyInput[j]),
                     datatype=float[8]),
               method=spline):

ArrayTools:-Dimensions(newOutput);

[-28 .. 32, -20 .. 24]

# The contours using the interpolated data (refinement getting
# us more discrete data points that we were originally supplied)
# now appear smoother. Magic.

plottools:-transform((x,y)->[xst+(xfn-xst)*(x-1)/(newb-newa),
                             yst+(yfn-yst)*(y-1)/(newd-newc)])(
  plots:-listcontplot(  convert(newOutput,listlist)
                      , contours=[0.1, 0.5, 1.0, 1.5, 2.0]
                      , filledregions
                      , coloring=["Blue","Orange"]
                      , view=[xst..xfn, yst..yfn]
                     )
                    );

# If we want to get really fancy then we can even build any interpolating
# procedure, which accepts any arbitrary (x,y) point-pair as arguments.
# It will interpolate the corrsponding z-value, from the original coarse data.

F := (x,y) -> CurveFitting:-ArrayInterpolation(
               [Vector(xInput),Vector(yInput)],
               Array(Output,datatype=float[8]),
               Array(1..1, 1..1, 1..2, [[[x,y]]],
                     datatype=float[8]),
               method=spline)[1,1]:

# We now have a procedure, F, which interpolates the original coarse data
# at arbitary (x,y) points. So, even though we aknowledged that we could not
# query the original black-box process to obtain arbirary new data values,
# we have in effect produced something which emulates that by interpolation.
# Magic.

plots:-contourplot(  F, xst .. xfn, yst .. yfn
                   , contours = [0.1, 0.5, 1.0, 1.5, 2.0]
                   , filledregions
                   , coloring=["Blue","Orange"]
                   , view=[xst..xfn, yst..yfn]
                  );

 


Download m16_listcont.mw

You could try using the inert Sum command rather than the active (lowercase) sum command.

Otherwise calling f(x) will return the symbolic summation result of x*cos(x).

restart

f := proc (x) options operator, arrow; Sum((-1)^n*x^(2*n+1)/factorial(2*n), n = 0 .. infinity) end proc

proc (x) options operator, arrow; Sum((-1)^n*x^(2*n+1)/factorial(2*n), n = 0 .. infinity) end proc

D(f)

proc (x) options operator, arrow; Sum((-1)^n*x^(2*n+1)*(2*n+1)/(x*factorial(2*n)), n = 0 .. infinity) end proc

diff(f(x), x)

Sum((-1)^n*x^(2*n+1)*(2*n+1)/(x*factorial(2*n)), n = 0 .. infinity)

diff(f(x), x)

Sum((-1)^n*x^(2*n+1)*(2*n+1)/(x*factorial(2*n)), n = 0 .. infinity)

simplify(%)

Sum((-1)^n*x^(2*n)*(2*n+1)/factorial(2*n), n = 0 .. infinity)

value(f(x))

cos(x)*x

f := proc (x) options operator, arrow; Sum((-1)^n*x^(2*n+1)/factorial(2*n), n = 0 .. infinity) end proc

proc (x) options operator, arrow; Sum((-1)^n*x^(2*n+1)/factorial(2*n), n = 0 .. infinity) end proc

f(x)

Sum((-1)^n*x^(2*n+1)/factorial(2*n), n = 0 .. infinity)

value(f(x))

cos(x)*x

``


Download Sum_vs_sum.mw

The Expression palette only has the active form sum (which displays with a black typeset Sigma as a visual cue). But you can get the inert form Sum in 2D Input (which displays with a gray typeset Sigma) by using command-completion after typing just the letters of "Sum" in 2D Input mode. Then choose the template from the drop-menu that appears.

You wrote that you want "3 decimals".

Do you mean that you want 3 digits in total, or do you mean that you want 3 digits to the right of the decimal point?

I'm going to guess that you want 3 digits to the right of the decimal place, throughout. In that case you can issue this statement, after the call to the Import command.

BTE := map(u->parse(sprintf("%.3f",u)),
           Matrix(BTE, datatype = anything)):
First 193 194 195 196 197 198 199 Last Page 195 of 336