On Thursday 08 January 2009 13:24:41 Stefano Ferri wrote:
> Mmm... I think it's not the right way. I gave a bad example.
> The real problem is this: I have a vector containing some
> polynomials, wich represent the displacements of some points of a
> structure (I'm writing a didactic software to solve structures in a
> symbolic way). In this vector, displacements are the combination of
> two kinds of deformation, axial and flexional, the first dependin
> on A (area), the second on I (momentum of inertia). So, in example:
>
> (%i1) u:matrix( [M*l^2/(E*I) + q*l/(E*A)] , [q*l/(E*A)] )$
>
> that is the matrix (a column vector) of displacements. The first
> term depends on both flexional and axial deformation, the second
> only on the axial one. Do not care about the meanings of the
> symbols, they are all assumed > 0. Now, I say that axial
> deformation is negligible with respect to flexional one. I can do
> this by saying A>>I. The resulting vector should be:
>
> u2: matrix( [ M*l^2/(E*I)] , [q*l/(E*A)])$
If you just want to cancel terms that depend on some variable
(which is not correct in terms of limits, of course), then try
cancel_terms (poly, x) := block([terms, poly : expand(poly)],
terms :
if atom(poly) or op(poly)#"+" then
[poly]
else
args(poly),
terms : sublist (terms, lambda([e], freeof (x,e))),
if terms=[] then
0
else
apply ("+", terms)
)$
cancel_terms (M*l^2/(E*I) + q*l/(E*A), A) => l^2*M/(E*I)
cancel_terms (M*l^2/(E*I) + q*l/(E*A), I) => l*q/(A*E)
cancel_terms (M*l^2/(E*I) + q*l/(E*A), E) => 0
If you want to reduce elements that depend on A and I, but keep
elements that depend only on A, then try something like
u : [M*l^2/(E*I) + q*l/(E*A), q*l/(E*A)]$
map (lambda([e], if freeof(A,e) or freeof(I,e) then e else
cancel_terms(e, A)), u);
A more mathematically correct version:
map (lambda([e], if freeof(A,e) or freeof(I,e) then e else
limit(e, A, inf)), u);
--
Pungenday, Chaos 8 YOLD 3175
Alexey Beshenov http://beshenov.ru/