Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Differential equations with free variables #16

Open
vsht opened this issue Apr 4, 2019 · 4 comments
Open

Differential equations with free variables #16

vsht opened this issue Apr 4, 2019 · 4 comments

Comments

@vsht
Copy link

vsht commented Apr 4, 2019

Hi,

as to my understanding (and according to Issue #11), the Python version of Fuchsia can deal with systems that depend on a free variable, with the tacit assumption that the variable doesn't take values that lead to singularities.

I have a small example (3x3 matrix), where this works nicely and the epsilon form is found straightforwardly

{{(4 - 6*eps - 3*z + 2*eps*z)/(2*(-1 + z)*z), (-1 + 2*eps)/(2*(-1 + z)), 0}, 
 {-(-1 + 2*eps)/(2*(-1 + z)), -(-2*eps + z + 2*eps*z)/(2*(-1 + z)*z), 0}, 
 {-(((-1 + 2*eps)*z)/((-1 + z)*(1 + 2*c*z))), 
  -(((-1 + 2*eps)*(-2 + z))/((-1 + z)*(1 + 2*c*z))), 
  -((-eps - 2*c*z + 2*eps*z + 2*c*eps*z + 2*c*z^2)/
    ((-1 + z)*z*(1 + 2*c*z)))}}

However, with another similar matrix

{{-((-2 + 3*eps + z - 2*c*z + 4*c*eps*z)/((-1 + z)*z)), 
  ((-1 + 2*eps)*(1 + 4*c + 4*c^2*z))/(2*(-1 + z)*z), 0}, 
 {(-2*(-1 + 2*eps))/(-1 + z), (eps - z - 2*c*z + 4*c*eps*z)/((-1 + z)*z), 
  0}, {(-4*(-1 + 2*eps)*z)/((-1 + z)*(1 + 2*c*z)), 
  (2*(-1 + 2*eps))/(-1 + z), 
  -((-eps - 2*c*z + 2*eps*z + 2*c*eps*z + 2*c*z^2)/
    ((-1 + z)*z*(1 + 2*c*z)))}}

Fuchsia claims that it has found the canonical form, but the resulting matrix

{{-2*(2*c*eps-c-2)/(z-1)-eps/z,4*(2*c*eps-c-2)/z+1/2*((16*c^2-8*c+1)*eps^2+4*c^2-4*(4*c^2+7*c-2)*eps+16*c+16)/(eps*(z-1)),0},{-2*eps/(z-1),2*((2*c-1)*eps-c-2)/(z-1)+3*eps/z,0},{-4*eps/(c*(z-1)),2*((4*c-1)*eps-2*c-4)/(c*(z-1))+4*eps/(c*z),4*c*eps/(2*c*z+1)-eps/(z-1)-eps/z}}

is obviously not of the form eps*B. I wonder why that happens and if one can regard this as a bug: I wouldn't complain if Fuchsia would simply fail, but finishing successfully and returning something that is not correct, is somewhat odd.

If the free variable c is replaced by some prime number, Fuchsia will return the proper epsilon form, so that the matrix itself doesn't seem to be problematic.

Cheers,
Vladyslav

@magv
Copy link
Collaborator

magv commented Apr 4, 2019

Your understanding is correct, and this example looks like a giant bug...

I'll look into it.

In the mean while, you can use the new fuchsia. It produces this epsilon form matrix:

{{-eps*z^(-1)-2*eps*(-1+z)^(-1)*(-2+c),-8*z^(-1)*(2*eps-eps*c)+(25*eps+4*eps*c^2-20*eps*c)*(-1+z)^(-1),0},
{-eps*(-1+z)^(-1),-2*(3*eps-eps*c)*(-1+z)^(-1)+3*eps*z^(-1),0},
{eps*(-1+z)^(-1)*c^(-1),-2*eps*z^(-1)*c^(-1)+(5*eps-2*eps*c)*(-1+z)^(-1)*c^(-1),4*eps*(2*z+c^(-1))^(-1)-eps*z^(-1)-eps*(-1+z)^(-1)}}

... using this transformation:

{{2*eps*z^(-1),-2*(1+2*z*c-3*eps*z-4*eps-2*eps*z*c)*z^(-2),0},
{0,4*(-1+2*eps)*z^(-1),0},
{0,0,-8*(-1+2*eps)*(1+2*z*c)^(-1)*c}}

@vsht
Copy link
Author

vsht commented Apr 4, 2019

Thanks for the prompt reply! Indeed the new fuchsia does the job pretty well here 👍

I would be glad to use it more often, but unfortunately it seems to have some limitations when
working with matrices that have mixed singularities in the free variable and eps. Like in this 2x2 matrix

{{(-2*(-1 + 7*eps - 10*eps^2 + y^2 + eps*y^2 - 10*eps^2*y^2 + 2*y^4 - 
       14*eps*y^4 + 20*eps^2*y^4))/((-1 + y)*
     y*(1 + y)*(-1 + eps - y^2 + 5*eps*y^2)), (-4*eps*
     y)/((-1 + y)*(1 + y)*(-1 + eps - y^2 + 
       5*eps*y^2))}, {(-4*(-1 + 3*eps)^2*(-1 + 2*eps + 
       4*eps*y^2))/(y^3*(-1 + eps - y^2 + 5*eps*y^2)), (2*(-1 + 
       4*eps - 7*eps^2 - 2*eps*y^2 + 2*eps^2*y^2 - y^4 + 4*eps*y^4 + 
       5*eps^2*y^4))/((-1 + y)*
     y*(1 + y)*(-1 + eps - y^2 + 5*eps*y^2))}}

which yields

terminate called after throwing an instance of 'std::runtime_error'
  what():  pfmatrix(): can't solve equations of 2nd degree or higher

It can work in simple cases, where the mixed polynomial is only linear in y' and epsbut higher order polynomials seem to be a show stopper. CANONICA can deal with such systems since Meyer's algorithm is based on expanding the matrix ineps`. For example

RecursivelyTransformSectors[{mat}, {y}, {{1, 2}}, {1, 1}, 
 TDeltaDenominatorDegree -> 3, TDeltaNumeratorDegree -> 3]

returns

{{{2*eps*(-1 + y^2), (-1 + y^2)*(-y^2 + eps*(-4 + 5*y^2))}, {((1 - 3*eps)^2*(-1 + y^4))/y^2, 
   (-2*(1 - 3*eps)^2*(-1 + y^2))/y^2}}, 
 {{{(2*eps*(-3 + y^2))/(y*(-1 + y^2)), (4*eps*(5 - 4*y^2))/(y*(-1 + y^2))}, 
   {(4*eps)/(y - y^3), (4*eps*(3 - 2*y^2))/(y*(-1 + y^2))}}}}

Unfortunately, CANONICA has many other limitations, so I'd be more than happy to switch to the CPP version of fuchsia if my cases would be covered. However, I perfectly understand the difference between a dev preview and a final version, so I'm not complaining. Just would like to point out that this would be a nice feature for the stable release of the new fuchsia.

@magv
Copy link
Collaborator

magv commented Apr 4, 2019

Yes, that is the main limitation of the new version. I hope this limitation to be temporary, but I can't say when will it be fully lifted (it is a coding problem, not a problem in principle).

The somewhat good news is that the 1/(-1 + eps - y^2 + 5*eps*y^2) pole in your matrix is spurious. In fact, it can't physical, just look at it! Spurious poles can be completely removed, and do not appear in the epsilon form. In that sense it's the easy case. I'll try to make it work with the new Fuchsia.

I've previously removed such poles manually by 1) changing the master selection (with guesswork), and/or 2) making sure that my IBP gives the least possible number of masters (for example FIRE is known to give too many at times; I've had better luck with Kira). But there is an algorithmic way of removing these poles too.

@vsht
Copy link
Author

vsht commented Apr 5, 2019

I fully agree with you that such poles can be usually removed by choosing a better basis. But since
this procedure needs to be done by hand, it may take quite some time on larger systems or when there are many systems to deal with. So essentially it becomes a question of saving time: Can I still get away with a "bad basis" if my tool for finding the canonical form can handle that, or do I absolutely have to get my hands dirty and fix the basis.

I surely understand what you mean with a coding problem, as we all have only a finite amount of time to spend on developing tools. It is already good enough that Fuchsia is still being developed and maintained, unlike CANONICA.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants