same expression prints in differs orders
Hello,
On Tue, Sep 21, 2010 at 12:01 AM, Jose Antonio Garcia Peiro <jgpeiro at gmail.com <https://www.cebix.net/mailman/listinfo/ginac-list>> wrote:
* I think that the problem is at internal representation or at internal order. When*>>* I debug the code, same expression prints differ.*>>* ex test = pow(log(x),2)/x;*>>* cout << test;*>>* // sometimes x^(-1)*log(x)^2*>>* // other sometimes log(x)^2*x^(-1)* Works as designed. This behavior is documented in the manual (section 5.7.2, titled as 'Expanding and collecting'): "Again, since the canonical form in GiNaC is not easy to guess you should be prepared to see different orderings of terms in such sums!". Also it has been explained on this mailing list several (quite a number, actually) times, see e.g.
http://www.cebix.net/pipermail/ginac-list/2010-April/001598.html
h <http://www.ginac.de/pipermail/ginac-list/2008-August/001403.html>ttp://www.ginac.de/pipermail/ginac-list/2008-August/001403.html <http://www.ginac.de/pipermail/ginac-list/2008-August/001403.html>
* How I can force GiNaC to unique representation?* You can't. And there's no need to do so. Instead fix the (buggy) code which makes assuptions about term ordering.
* I am try to test expressions with "match", but it not works*>>* always with the same expression.* Could you please post the actual expression and the pattern, so I can make a (more) specific suggestion?
Best regards, Alexei
You can't. And there's no need to do so. Instead fix the (buggy) code which makes assuptions about term ordering.
*mmm, I write about 50 lines with these assumptions, and i think that is not easy to correct....:-(* * * *
Could you please post the actual expression and the pattern, so I can make a (more) specific suggestion?
The code try to find the integral of a function. The code include all basic integration rules, for the function log(x)^2*x^(-1) apply these rule. ex f = pow(log(x),2)/x; // case a: f = x^(-1)*log(x)^2, case b: log(x)^2* x^(-1) * *ex w0, w1, w2;* *exmap m;* * * *if( f.match( pow(wild(0),wild(1))*wild(2), m ) || f.match( pow(wild(0),wild(1)), m ) ){ **// int( f^c*f', x) = f^(c+1)/(c+1) or ln(f) if c == -1* * w2 = 1; for( exmap::const_iterator i=m.begin(); i!=m.end(); ++i){ if (i->first.is_equal(wild(0)) ) w0 = i->second; // f else if (i->first.is_equal(wild(1)) ) w1 = i->second; // c else if (i->first.is_equal(wild(2)) ) w2 = i->second; // f' } if( has(w0,x) && !has(w1,x) ){ // f depends on x and c is constant ex dw0 = w0.diff(x,1); if( !dw0.is_equal(0) ){ // prevents division by 0 if( !has(w2/dw0,x) ){ if( w1.is_equal(-1) ){ //check if c == -1 return log( w0 ) * (w2/dw0); }else{ return pow( w0, w1+1 )/(w1+1) * (w2/dw0); } } } } } * * * *In case a: f = x, c = -1, and f' = log(x)^2, the code cannot compute the integral because f'/df = w2/dw0 = (log(x)^2)/(-x^-2) has the term 'x' and it cannot move out of integral.* *In case b: f = log(x), c = 2, f' = x^(-1), the code can compute integral because f'/df = w2/dw0 = x^(-1)/x^(-1) do not have the term 'x' and it can move out of integral.* The code fails because I assume that the product w2 dont have powers.
Hi again,
The code try to find the integral of a function. The code include all basic integration rules, for the function log(x)^2*x^(-1) apply these rule.
ex f = pow(log(x),2)/x; // case a: f = x^(-1)*log(x)^2, case b: log(x)^2*x^(-1) ex w0, w1, w2; exmap m;
if( f.match(pow(wild(0),wild(1))*wild(2), m)) {
[skipped the rest of the code] This .match is certainly ambigous, and term ordering has very little to do with the ambiguity. The thing is that possible to match the expression (at least) in two ways: one with $2 == x^(-1) and another with $2 == log(x)^2. Both are perfectly valid, no matter what internal representation is. I guess the solution is to 1. match against $0^$1 * $2^$3 and check a. if $2^$3 is derivative of $0^$1 b. if $0^$1 is the derivative of $2^$3 2. if there's no match, or neither a or b holds, match against $0^$1 * $2 Hope this helps, Alexei
participants (2)
-
Alexei Sheplyakov
-
Jose Antonio Garcia Peiro