[GiNaC-list] collecting on similar series expansion
Sheplyakov Alexei
varg at theor.jinr.ru
Mon Jan 29 15:47:20 CET 2007
Hello,
On Sun, Jan 28, 2007 at 09:31:18AM -0300, Charlls Quarra wrote:
> I'm just trying out ginac for the first time. I have
> an expression with sumands of this type (in latex
> format):
[snipped the expression]
> so i want to collect terms that have the same
> coefficients of the form D[0..i times] (F)(q) * D[ 0..
> j times] (F)(q) .... but the polynomial collect won't
> work.
Could you please post the complete example which illustrates this?
> Initially i thought about substituting each D[ ]
> (F)(q) with a different symbol, then collect on the
> multivariate polynomials of these symbols and then
> finally substitute back the D[] expressions, however,
> I don't know how the collect call is supposed to
> receive the symbols that it must collect,
Reading the manual _does_ help:
"Another useful representation of multivariate polynomials is as a
univariate polynomial in one of the variables with the coefficients
being polynomials in the remaining variables. The method `collect()'
accomplishes this task:
ex ex::collect(const ex & s, bool distributed = false);
The first argument to `collect()' can also be a list of objects in which
case the result is either a recursively collected polynomial, or a
polynomial in a distributed form with terms like c*x1^e1*...*xn^en, as
specified by the `distributed' flag.
Note that the original polynomial needs to be in expanded form (for the
variables concerned) in order for `collect()' to be able to find the
coefficients properly."
> the code
> looks like this:
>
> ex jacobian = diff( q + dq_new*dt , q )*diff( p
> + dp_new*dt , p ) - diff( q + dq_new*dt , p )*diff( p
> + dp_new*dt , q );
> cout << " the jacobian of the integrator is "
> << expand(jacobian) << endl;
> exmap diff_map , inv_diff_map;
> symbol foo[10];
> diff_map[ F(q) ] = foo[0]; inv_diff_map[
> foo[0] ] = F(q);
> diff_map[ F(q).diff(q) ] = foo[1];
> inv_diff_map[ foo[1] ] = F(q).diff(q);
> diff_map[ F(q).diff(q,2) ] = foo[2];
> inv_diff_map[ foo[2] ] = F(q).diff(q,2);
> diff_map[ F(q).diff(q,3) ] = foo[3];
> inv_diff_map[ foo[3] ] = F(q).diff(q,3);
> diff_map[ F(q).diff(q,4) ] = foo[4];
> inv_diff_map[ foo[4] ] = F(q).diff(q,4);
> ex rord = collect( jacobian.subs( diff_map ) ,
> { foo[0] , foo[1] , foo[2] , foo[3] , foo[4] } ); // i
> know this is an error in C++, but this is the idea
> rord = rord.subs( inv_diff_map );
> cout << "reordered we obtain " << rord <<
> endl;
>
> any thoughts on this?
I tnink this should do the job:
ex rord = jacobian.expand().collect(lst(F(q), F(q).diff(q),
F(q).diff(q, 2), F(q).diff(q, 3), F(q).diff(q, 4)),
true /* treat the expression as Z[x,y,...]
(as opposed to Z[x][y]...) */ );
Best regards,
Alexei
--
All science is either physics or stamp collecting.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 827 bytes
Desc: Digital signature
Url : http://www.cebix.net/pipermail/ginac-list/attachments/20070129/2dfdb03e/attachment.pgp
More information about the GiNaC-list
mailing list