>Hello,
>On Tue, Sep 21, 2010 at 12:01 AM, Jose Antonio Garcia Peiro
><jgpeiro at gmail.com> 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
> 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.