Kitonum

21440 Reputation

26 Badges

17 years, 37 days

MaplePrimes Activity


These are answers submitted by Kitonum

@John Fredsted  Thanks for this elegant and simple solution (thumb up)!

I propose an improvement. Now it can also split polynomials and radicals.

Splitting:=proc(Expr)
local x, y, Expr1, Expr2;
x, y:=indets(Expr, name)[];
Expr1, Expr2 := selectremove(z -> has(z,x) and has(z,y), simplify(factor(Expr), symbolic));
``(simplify(select(has, Expr2*expand(Expr1), x)))*
``(simplify(remove(has, Expr2*expand(Expr1), x)));
end proc:


Example of use:

Expr:=(x^2*y+y)*y^3*exp(-x-y+1)*3^(-x-y)*sqrt(x^2*y-y);
Splitting(Expr);

                    

 

 

 

@AndreaAlp  You wrote  "I'm talking about the original surfaces f(x,y) =z and g(x,z)=y. If I understood correctly, f is a plane and g is a parabolid. But I cannot find the correct centre of the intersecting ellipse."
In fact, these two surfaces do not intersect. Below we show it strictly analytically (although it is easy to see also from the plotting). First, we eliminate z-variable from the system, and then reduce the resulting equation to completed square form:

restart;
with(Student:-Precalculus):
my_plane := z=2024.30587449691-.341275505799078*x-3.89936179341114*y:
my_quadric := y=-10595.4104931095+6.73749956241827*x+42.1022818380012*z-0.654818649508000e-1*x^2-0.421174257681115e-1*z^2:
Sys:=[my_plane, my_quadric];
A:=eliminate(Sys,z);
B:=CompleteSquare(%[2][], x);
C:=op(1,B)+CompleteSquare(`+`(op(2..-1,B)), y)=0;  
# The equation C has not any real solutions
plots:-implicitplot3d([my_plane, my_quadric], x=0..150, y=-100..450,z=400..600, style=surface, color=["LightBlue", yellow], numpoints=10000, scaling=constrained, axes=normal); # The visial check
                                

Let us dwell on the version with surfaces  z=f(x,y) and g(x,z)=0 . Of course, the first surface is a plane, and the second surface is an elliptical cylinder. To save all proportions, scaling=constrained  option is used:

restart:      
with(plots):    
with(Student:-Precalculus):
my_plane := z=2024.30587449691-.341275505799078*x-3.89936179341114*y:
my_quadric := -10595.4104931095+6.73749956241827*x+42.1022818380012*z-0.654818649508000e-1*x^2-0.421174257681115e-1*z^2:
Expr:=CompleteSquare(my_quadric, [x,z]);
x0:=solve(op(2,Expr))[1]; z0:=solve(op(1,Expr))[1]; 
# [x0,z0] are the coordinates the intersection of the axis of the cylinder with (x,z)-plane
A:=spacecurve([x0,t,z0], t=300..500, color=violet, thickness=3, linestyle=2):
B:=intersectplot(subs(y=y-1,my_plane), my_quadric, x=0..100, y=300..500,z=420..580, color=red, thickness=4): 
P:=plots:-implicitplot3d([my_plane, my_quadric], x=0..100, y=0..430,z=420..580, style=surface, color=["LightBlue", yellow], numpoints=10000, scaling=constrained, axes=normal, lightmodel=light4):
display(A,B,P);

 

 

Here is another solution, also based on reduction to the solution of a differential equation, but without any substitutions. The values of all the parameters for the numerical solution I took arbitrarily:

Download System.mw


Here is the corrected solution. I did not delete the previous version, because it is more simple and the idea of a solution is clearer on it:

System_new.mw


Edit.

You have a system of 5 linear ordinary differential equations with 14 parameters. Maple can not solve it symbolically, but it easily solves numerically. For this, we must specify the values of all parameters and the initial conditions. Here is an example of a solution with visualization: 
 

Download System.mw

restart;
RealDomain:-solve({x=r*cos(theta), y=r*sin(theta)}, {r,theta}, explicit);

   

Formally, both solutions are correct. But if you want  r>=0 , then leave only the first solution. Your expected result is incorrect, because  arctan(y/x)  returns the angle in the range  -Pi/2 .. Pi/2  only. See help on arctan  function about  two-argument function arctan(y, x)

restart; 
with(LinearAlgebra):
for n from 5 to 8 do:
for i from 1 to n do for j from 1 to n do A[i,j]:=0 od: od:
for i from 1 to n-1 do A[i,i+1]:=3 od:
for i from 1 to n do A[i,i]:=4 od:
for i from 2 to n do A[i,i-1]:=5 od:
A[n]:=Matrix([seq([seq(A[i,j], j=1..n)], i=1..n)]);
P[n]:=Determinant(evalm(1-t*A[n]));
od:
seq(P[n], n=5..8);

 


Explanation. Your mistake is that at each step of the loop on n-variable you use the same name  A , which also coincides with the name of the indexed variable  A .

Your code can be written much shorter:
restart;
with(LinearAlgebra):
A:=n->Matrix(n, (i,j)->piecewise(i=j,4, j=i+1,3, j=i-1,5, 0));
seq(A(n), n=5..8);
seq(Determinant(evalm(1-t*A(n))), n=5..8);

 

Edit.

 

  

 

restart;
with(plots):
m1:=70.0:  m2:=25.0:  m3:=3.0:  g:=9.8:
Sys:=[T+N1-m1*g=0, N2-N1-m2*g=0,T-N2-m3*g=0]:
solvec:=fsolve(Sys);
convert(evalf[4](solvec), list); 
# Convert to the list and remove extra zeros
sol:=rhs~(%);  # Extract numeric values
A:=plots:-implicitplot3d(Sys, N1=0..300, N2=0..600, T=0..600, style=surface, color=[yellow, "LightBlue", green], axes=normal):  # Three planes
B:=pointplot3d(sol, color=red, symbol=solidsphere, symbolsize=18):  # The point in the space
display(A, B);   # Visualization of the system solution

                       

 

Addition. If you want to get solutions in symbolic form as a function of parameters  m1 , m2 , m3  (as you wrote  "Actual true answers"), then you have at first to remove assignments from these parameters:

m1, m2, m3 := 'm1', 'm2', 'm3':
solvec:=solve({T+N1-m1=0, N2-N1-m2=0,T-N2-m3=0}, [T,N1,N2])[];
 

I think that the issue is in incorrectly setting the boundary conditions. Their number should be 8. Here everything is correct. But  D(f)(0)  and  D(g)(0)  are specified through  f(0)  and  g(0), which are unknown. If you directly specify  D(f)(0)  and  D(g)(0)  as  any numbers, everything will be OK, for example

bcs := h(0) = 0, p(0) = 0, theta(0) = 1, (D(f))(0) = 0.5, (D(g))(0) =  -0.5, f(etainf) = 0, g(etainf) = 0, theta(etainf) = 0; 

If we look closely at the marks on the t-axis, we see that all the graphs are constructed in a logarithmic scale. I did not understand why this happened, because I did not find the appropriate settings in your document. By default Maple uses a uniform scale on both axes. I just restarted your document and got other graphics that do not cause questions:


 

odeSG := {diff(z(t), t) = (-phi*z(t)*sqrt(F*phi*z(t)/(5*t))/(3*t)+1-H/(1-z(t)))/(phi*(S_oi-S_or-sqrt(F*phi*z(t)/(5*t)))), z(t0) = z0};

{diff(z(t), t) = (-(1/15)*phi*z(t)*5^(1/2)*(F*phi*z(t)/t)^(1/2)/t+1-H/(1-z(t)))/(phi*(S_oi-S_or-(1/5)*5^(1/2)*(F*phi*z(t)/t)^(1/2))), z(t0) = z0}

(1)

solSG := dsolve(odeSG, numeric, method = lsode, parameters = [phi, F, H, S_oi, S_or, t0, z0]);

proc (x_lsode) local _res, _dat, _vars, _solnproc, _xout, _ndsol, _pars, _n, _i; option `Copyright (c) 2000 by Waterloo Maple Inc. All rights reserved.`; if 1 < nargs then error "invalid input: too many arguments" end if; _EnvDSNumericSaveDigits := Digits; Digits := 15; if _EnvInFsolve = true then _xout := evalf[_EnvDSNumericSaveDigits](x_lsode) else _xout := evalf(x_lsode) end if; _dat := Array(1..4, {(1) = proc (_xin) local _xout, _n, _y0, _ctl, _octl, _reinit, _errcd, _fcn, _i, _yini, _pars, _ini, _par; option `Copyright (c) 2002 by the University of Waterloo. All rights reserved.`; table( [( "complex" ) = false ] ) _xout := _xin; _ctl := array( 1 .. 39, [( 1 ) = (1), ( 2 ) = (t0), ( 3 ) = (t0), ( 5 ) = (1), ( 4 ) = (1), ( 7 ) = (0), ( 6 ) = (10), ( 10 ) = (0.1e-6), ( 11 ) = (0), ( 8 ) = (z0), ( 9 ) = (0.1e-6), ( 15 ) = (0), ( 14 ) = (0), ( 13 ) = (0), ( 12 ) = (0), ( 21 ) = (0), ( 20 ) = (0), ( 23 ) = (0), ( 22 ) = (0), ( 16 ) = (0), ( 17 ) = (0), ( 18 ) = (0), ( 19 ) = (0), ( 31 ) = (-1), ( 30 ) = (0), ( 29 ) = (0), ( 28 ) = (0), ( 26 ) = (0), ( 27 ) = (0), ( 24 ) = (0), ( 25 ) = (0), ( 32 ) = (7), ( 33 ) = (0), ( 34 ) = (0), ( 35 ) = (0), ( 37 ) = (0), ( 36 ) = (0), ( 39 ) = (0), ( 38 ) = (0)  ] ); _octl := array( 1 .. 39, [( 1 ) = (1), ( 2 ) = (t0), ( 3 ) = (t0), ( 5 ) = (1), ( 4 ) = (1), ( 7 ) = (0), ( 6 ) = (10), ( 10 ) = (0.1e-6), ( 11 ) = (0), ( 8 ) = (z0), ( 9 ) = (0.1e-6), ( 15 ) = (0), ( 14 ) = (0), ( 13 ) = (0), ( 12 ) = (0), ( 21 ) = (0), ( 20 ) = (0), ( 23 ) = (0), ( 22 ) = (0), ( 16 ) = (0), ( 17 ) = (0), ( 18 ) = (0), ( 19 ) = (0), ( 31 ) = (-1), ( 30 ) = (0), ( 29 ) = (0), ( 28 ) = (0), ( 26 ) = (0), ( 27 ) = (0), ( 24 ) = (0), ( 25 ) = (0), ( 32 ) = (7), ( 33 ) = (0), ( 34 ) = (0), ( 35 ) = (0), ( 37 ) = (0), ( 36 ) = (0), ( 39 ) = (0), ( 38 ) = (0)  ] ); _n := trunc(_ctl[1]); _yini := Array(0..8, {(1) = t0, (2) = z0, (3) = undefined, (4) = undefined, (5) = undefined, (6) = undefined, (7) = undefined, (8) = undefined}); _y0 := Array(0..8, {(1) = t0, (2) = z0, (3) = undefined, (4) = undefined, (5) = undefined, (6) = undefined, (7) = undefined, (8) = undefined}); _fcn := proc (N, X, Y, YP) option `[Y[1] = z(t)]`; if Y[3]*Y[2]*Y[1]/X < 0 then YP[1] := undefined; return 0 end if; YP[1] := (-.149071198499986*Y[2]*Y[1]*evalf((Y[3]*Y[2]*Y[1]/X)^(1/2))/X+1-Y[4]/(1-Y[1]))/(Y[2]*(Y[5]-Y[6]-.447213595499958*evalf((Y[3]*Y[2]*Y[1]/X)^(1/2)))); 0 end proc; _pars := [phi = phi, F = F, H = H, S_oi = S_oi, S_or = S_or, t0 = t0, z0 = z0]; if not type(_xout, 'numeric') then if member(_xout, ["start", "left", "right"]) then return _y0[0] elif _xout = "method" then return "lsode" elif _xout = "numfun" then return trunc(_ctl[24+trunc(_ctl[1])]) elif _xout = "initial" then return [seq(_yini[_i], _i = 0 .. _n)] elif _xout = "parameters" then return [seq(_yini[_n+_i], _i = 1 .. nops(_pars))] elif _xout = "initial_and_parameters" then return [seq(_yini[_i], _i = 0 .. _n)], [seq(_yini[_n+_i], _i = 1 .. nops(_pars))] elif _xout = "last" then if _ctl[2]-_y0[0] = 0. then error "no information is available on last computed point" else _xout := _ctl[2] end if elif _xout = "enginedata" then return eval(_octl, 1) elif _xout = "function" then return eval(_fcn, 1) elif type(_xin, `=`) and type(rhs(_xin), 'list') and member(lhs(_xin), {"initial", "parameters", "initial_and_parameters"}) then _ini, _par := [], []; if lhs(_xin) = "initial" then _ini := rhs(_xin) elif lhs(_xin) = "parameters" then _par := rhs(_xin) elif select(type, rhs(_xin), `=`) <> [] then _par, _ini := selectremove(type, rhs(_xin), `=`) elif nops(rhs(_xin)) < nops(_pars)+1 then error "insufficient data for specification of initial and parameters" else _par := rhs(_xin)[-nops(_pars) .. -1]; _ini := rhs(_xin)[1 .. -nops(_pars)-1] end if; _xout := lhs(_xout); if _par <> [] then `dsolve/numeric/process_parameters`(_n, _pars, _par, _yini) end if; if _ini <> [] then `dsolve/numeric/process_initial`(_n, _ini, _yini, _pars) end if; if _pars <> [] then _par := {seq(rhs(_pars[_i]) = _yini[_n+_i], _i = 1 .. nops(_pars))}; for _i from 0 to _n do _y0[_i] := subs(_par, _yini[_i]) end do; for _i from _n+1 to _n+nops(_pars) do _y0[_i] := _yini[_i] end do else for _i from 0 to _n do _y0[_i] := _yini[_i] end do end if; _octl[2] := _y0[0]; _octl[3] := _y0[0]; for _i to _n do _octl[_i+7] := _y0[_i] end do; for _i to nops(_pars) do _octl[2*_n+30+_i] := _y0[_n+_i] end do; for _i to 39 do _ctl[_i] := _octl[_i] end do; if _Env_smart_dsolve_numeric = true and type(_y0[0], 'numeric') then procname("right") := _y0[0]; procname("left") := _y0[0] end if; if _xout = "initial" then return [seq(_yini[_i], _i = 0 .. _n)] elif _xout = "parameters" then return [seq(_yini[_n+_i], _i = 1 .. nops(_pars))] else return [seq(_yini[_i], _i = 0 .. _n)], [seq(_yini[_n+_i], _i = 1 .. nops(_pars))] end if else return "procname" end if end if; if _xout-_y0[0] = 0. then return [seq(_y0[_i], _i = 0 .. _n)] end if; _reinit := false; if _xin <> "last" then if 0 < 0 and `dsolve/numeric/checkglobals`(0, table( [ ] ), _pars, _n, _yini) then _reinit := true; if _pars <> [] then _par := {seq(rhs(_pars[_i]) = _yini[_n+_i], _i = 1 .. nops(_pars))}; for _i from 0 to _n do _y0[_i] := subs(_par, _yini[_i]) end do; for _i from _n+1 to _n+nops(_pars) do _y0[_i] := _yini[_i] end do else for _i from 0 to _n do _y0[_i] := _yini[_i] end do end if; for _i to _n do _octl[_i+7] := _y0[_i] end do; for _i to nops(_pars) do _octl[2*_n+30+_i] := _y0[_n+_i] end do end if; if _pars <> [] and select(type, {seq(_yini[_n+_i], _i = 1 .. nops(_pars))}, 'undefined') <> {} then error "parameters must be initialized before solution can be computed" end if end if; if not _reinit and _xout-_ctl[2] = 0 then [_ctl[2], seq(_ctl[_i], _i = 8 .. 7+_n)] else if sign(_xout-_ctl[2]) <> sign(_ctl[2]-_y0[0]) or abs(_xout-_y0[0]) < abs(_xout-_ctl[2]) or _reinit then for _i to 39 do _ctl[_i] := _octl[_i] end do end if; _ctl[3] := _xout; if Digits <= evalhf(Digits) then try _errcd := evalhf(`dsolve/numeric/lsode`(_fcn, var(_ctl))) catch: userinfo(2, `dsolve/debug`, print(`Exception in lsode:`, [lastexception])); if searchtext('evalhf', lastexception[2]) <> 0 or searchtext('real', lastexception[2]) <> 0 or searchtext('hardware', lastexception[2]) <> 0 then _errcd := `dsolve/numeric/lsode`(_fcn, _ctl) else error  end if end try else _errcd := `dsolve/numeric/lsode`(_fcn, _ctl) end if; if _errcd < 0 then userinfo(2, {dsolve, `dsolve/lsode`}, `Last values returned:`); userinfo(2, {dsolve, `dsolve/lsode`}, ` t =`, _ctl[2]); _i := 8; userinfo(2, {dsolve, `dsolve/lsode`}, ` y =`, _ctl[_i]); for _i from _i+1 to 7+_n do userinfo(2, {dsolve, `dsolve/lsode`}, `	 `, _ctl[_i]) end do; if _errcd+1. = 0. then if _ctl[14+trunc(_ctl[1])] <> 0 then error "an excessive amount of work was done, maxstep may be too small" else error "an excessive amount of work (greater than mxstep) was done" end if elif _errcd+2. = 0. then error "too much accuracy was requested for the machine being used" elif _errcd+3. = 0. then error "illegal input was detected" elif _errcd+4. = 0. then error "repeated error test failures on the attempted step" elif _errcd+5. = 0. then error "repeated convergence test failures on the attempted step" elif _errcd+6. = 0. then error "pure relative error control requested for a variable that has vanished" elif _errcd+7. = 0. then error "cannot evaluate the solution past %1, maxfun limit exceeded (see ?dsolve,maxfun for details)", evalf[8](_ctl[2]) else error "unknown error code returned from lsode %1", trunc(_errcd) end if end if; if _Env_smart_dsolve_numeric = true then if _y0[0] < _xout and procname("right") < _xout then procname("right") := _xout elif _xout < _y0[0] and _xout < procname("left") then procname("left") := _xout end if end if; [_xout, seq(_ctl[_i], _i = 8 .. 7+_n)] end if end proc, (2) = Array(0..0, {}), (3) = [t, z(t)], (4) = [phi = phi, F = F, H = H, S_oi = S_oi, S_or = S_or, t0 = t0, z0 = z0]}); _vars := _dat[3]; _pars := map(rhs, _dat[4]); _n := nops(_vars)-1; _solnproc := _dat[1]; if not type(_xout, 'numeric') then if member(x_lsode, ["start", 'start', "method", 'method', "left", 'left', "right", 'right', "leftdata", "rightdata", "enginedata", "eventstop", 'eventstop', "eventclear", 'eventclear', "eventstatus", 'eventstatus', "eventcount", 'eventcount', "laxtol", 'laxtol', "numfun", 'numfun', NULL]) then _res := _solnproc(convert(x_lsode, 'string')); if 1 < nops([_res]) then return _res elif type(_res, 'array') then return eval(_res, 1) elif _res <> "procname" then return _res end if elif member(x_lsode, ["last", 'last', "initial", 'initial', "parameters", 'parameters', "initial_and_parameters", 'initial_and_parameters', NULL]) then _xout := convert(x_lsode, 'string'); _res := _solnproc(_xout); if _xout = "parameters" then return [seq(_pars[_i] = _res[_i], _i = 1 .. nops(_pars))] elif _xout = "initial_and_parameters" then return [seq(_vars[_i+1] = [_res][1][_i+1], _i = 0 .. _n), seq(_pars[_i] = [_res][2][_i], _i = 1 .. nops(_pars))] else return [seq(_vars[_i+1] = _res[_i+1], _i = 0 .. _n)] end if elif type(_xout, `=`) and member(lhs(_xout), ["initial", 'initial', "parameters", 'parameters', "initial_and_parameters", 'initial_and_parameters', NULL]) then _xout := convert(lhs(x_lsode), 'string') = rhs(x_lsode); if type(rhs(_xout), 'list') then _res := _solnproc(_xout) else error "initial and/or parameter values must be specified in a list" end if; if lhs(_xout) = "initial" then return [seq(_vars[_i+1] = _res[_i+1], _i = 0 .. _n)] elif lhs(_xout) = "parameters" then return [seq(_pars[_i] = _res[_i], _i = 1 .. nops(_pars))] else return [seq(_vars[_i+1] = [_res][1][_i+1], _i = 0 .. _n), seq(_pars[_i] = [_res][2][_i], _i = 1 .. nops(_pars))] end if elif type(_xout, `=`) and member(lhs(_xout), ["eventdisable", 'eventdisable', "eventenable", 'eventenable', "eventfired", 'eventfired', "direction", 'direction', NULL]) then return _solnproc(convert(lhs(x_lsode), 'string') = rhs(x_lsode)) elif _xout = "solnprocedure" then return eval(_solnproc) elif _xout = "sysvars" then return _vars end if; if procname <> unknown then return ('procname')(x_lsode) else _ndsol; _ndsol := pointto(_dat[2][0]); return ('_ndsol')(x_lsode) end if end if; try _res := _solnproc(_xout); [seq(_vars[_i+1] = _res[_i+1], _i = 0 .. _n)] catch: error  end try end proc

(2)

solSG(parameters = [.1, 1, .1, 1, .1, 0.1e-3, 0]);

[phi = .1, F = 1., H = .1, S_oi = 1., S_or = .1, t0 = 0.1e-3, z0 = 0.]

(3)

NULL

Loading plots

plots:-odeplot(solSG, t = 0.1e-3 .. 10);

 

plots:-odeplot(solSG, t = 0.1e-3 .. 1);

 

plots:-odeplot(solSG, t = 0.1e-3 .. .1);

 

NULL


 

Download schechter_guo_v2_new.mw

In your code there are two "if", but only one "end if" .  Also what means  epsilon^() ?

The last initial condition  limit(diff((diff(f(x), x))/x, x), x = 0) = 0  follows from two conditions  D(f)(0)=0  and  (D@@2)(f)(0)=0 . But then the equation is obtained overdetermined (5 conditions instead of 4)  and Maple shows an error. The equation can be solved with the condition  D(f)(0)=0  and not very high accuracy:

restart;
ode := x^3*(diff(f(x), x, x, x, x))+alpha*(x^4*(diff(f(x), x, x))+x^3*(diff(f(x), x, x))-x^2*(diff(f(x), x)))-2*x^2*(diff(f(x), x, x, x))+3*x*(diff(f(x), x, x))-3*(diff(f(x), x))+R*x*f(x)^2-R*x^2*(diff(f(x), x, x))*(diff(f(x), x))-3*R*x*f(x)*(diff(f(x), x, x))+3*R*f(x)*(diff(f(x), x))+x^2*R*f(x)*(diff(f(x), x, x, x))-M^2*(x^3*(diff(f(x), x, x, x))-x^2*(diff(f(x), x))) = 0:
ics := f(0) = 0, f(1) = 1, D(f)(1) = 0, D(f)(0)=0:
sol:=dsolve(eval({ode, ics},[alpha=1,R=2,M=3]), method=bvp[midrich],numeric, maxmesh=1000, abserr=10^(-3));
plots:-odeplot(sol, [x,f(x)], x=0..1, color=red); 

                        


 

Edit.

f:=(R,h,l)->[(1/3)*Pi*R^2*h, Pi*R*l, Pi*R^2+Pi*R*l]:

Examples of use:

f(3,4,5);
map(t->f(t[]), L);
                          

You do not need any loops. See this toy example:

A:=Matrix([[["BrakePower", "BrakePower"], [2.356, 2.356], [2.749, 2.749], [3.142, 3.142], [3.534, 3.534], [3.927, 3.927], [4.32, 4.32]], [["BrakePower", "S2"], [2.356, .303], [2.749, .271], [3.142, .256], [3.534, .249], [3.927, .244], [4.32, .241]], [["BrakePower", "S4"], [2.356, .256], [2.749, .225], [3.142, .211], [3.534, .205], [3.927, .2], [4.32, .197]]]):
y := a*x^2+b*x+c:
CurveFitting[LeastSquares](convert(A[1,2..-1], list), x, curve = y);

 

For your "polynomial" you can do so:

norm(subs(1.25=125, aa), infinity);


Here is a more general method that is suitable for a "polynomial" with any number of terms with fractional exponents:

max(abs~(map(p->`if`(type(evalf(op(1,p)),numeric),op(1,p),1),[op(aa)]))[]);
 


Edit.

Should be  s:=s+i  instead of  s:=s+a[i]

Doubt_on_list_new.mw

Explanation:  i  is a member of the list  , and  a[i]  is the member of the list  a standing at  i_th place.

First 136 137 138 139 140 141 142 Last Page 138 of 289