Carl Love

## 18043 Reputation

7 years, 277 days
Mt Laurel, New Jersey, United States
My name was formerly Carl Devore.

## Angle-bracket operators: <..., ...>, <.....

The best way to convert an expression sequence into a vector or an expression sequence of vectors into a matrix is to use angle-bracket operators:

```f:= x-> <x | x+1>: # *row* vector
test:= <seq(f(i), i= 0..1, 0.1)>; #column of row vectors, i.e., a matrix

#You can plot a 2-column matrix without first extracting its x- and y-vectors:
plot(test, style= pointline);

#extraction of sequence of column vectors (don't know why this would be useful, but you asked):
ColVecs:= seq(test[..,k], k= 1..upperbound(test));
```

In your worksheet, you've repeatedly made the mistake of attempting to index a structure with parentheses as in S(1). Square brackets should usually be used for indexing, as in S and test[.., k]. With Vectors, Matrices, and Arrays (known collectively as rtables), in some cases you may use parentheses; this is known as programmer indexing. You used it correctly, albeit haphazardly, in your procedure in your worksheet. I'd recommend that you stay away from this for the time being.

The Maple structures for which square-bracket indexing can be used for member extraction are expression sequences, lists, sets, tables, rtables, modules (which includes Records), and objects that overload `?[]`. Modules may also be indexed as A:-B rather than A[B] if is explicitly an export of the module (in which case I recommend using the :- operator).

## Implies...

Implies(And(d1::even, d2::odd), d1+d2 <= 9);

The prettyprinted output of this will be in standard logical notation.

## Change x^... to locals...

Try this:

```TypeTools:-AddType(
special_polynomial,
(p, x::name)->
local
X, k:= 0,
T:= subsindets(
p,
identical(x)^{constant, And(name, Not(identical(x)))},
()-> X[++k]
)
;
type(T, polynom(anything, {x} union indets(T, X[posint])))
);```

Usage:

type(expr, special_polynomial(x));

I don't think that your way is good, for two reasons:

• I don't think that you understand what Maple's type algebraic is. Look up ?type,algebraic. Surely you don't want x^sin(x) to be considered a special polynomial.
• The scanning by remove is only through the top level of an expression--the terms in this case. Looking within the terms requires the deeper scan provided by subsindets (or evalindets). For example, your procedure would not call 3*x^(1/2) + 1 a special polynomial because it doesn't see the x^(1/2) because of the 3.

## Mathematical rather than syntactic opera...

The operators numer and denom are mathematical, not purely syntactic like lhs and rhs. It's easy enough to write a syntactic operator to do what you want:

Apparent_Numer_Denom:= (e::`*`)->
((D,N)-> (N,1/D))(selectremove(type, e, anything^negative))
:
Apparent_Numer_Denom(expr);

## mul...

ProductOfDiagonal:= (M::Matrix)-> mul(ArrayTools:-Diagonal(M));

Trying to guess your next Question, the sum of the k-wise products of the diagonal entries is

SumKwiseProducts:= (M::Matrix, k::nonnegint)->
:

## plots:-odeplot...

plots:-odeplot(sol, [t, diff(x(t), t)], t= 0..20);

## They're surfaces, so use plot3d...

For each kis a surface, not a curve, so use plot3d:

y:= k*x*sqrt(z*(1-z)):
plot3d(
[seq([x,y,z], k= 5..100, 5)], x= 0..1, z= 0..1,
color= [seq(COLOR(HUE, .85*(k-5)/95), k= 5..100, 5)],
transparency= .15
); ## Remove the set...

Your answer is a set, not an equation. Sets don't have right-hand sides. Here are four ways to proceed:

Map over the set:

Extract the first (and only) element from the set:

Extract all elements from the set (this only works because there's only one element):

The eval method is probably the one most commonly used by experienced Maple users.

## 1st and 3rd forms are complex equivalent...

The third form is equivalent to the first form under complex evaluation with appropriate adjustments of the contants of integration. And the second form can be obtained as a limit of the third form. For example,

 > restart:
 > Sol:= dsolve({     diff(y(x),x,x)*x^2+3*x*diff(y(x),x)+lambda*y(x),     y(1)=a, D(y)(1)=b }); > evalc(rhs(Sol)) assuming x>0, lambda>1; > limit(rhs(Sol), lambda=1); >