sympy / sympy

A computer algebra system written in pure Python
https://sympy.org/
Other
12.78k stars 4.38k forks source link

Solver for Integrable series of special Riccati equation. #5348

Open yuri-karadzhov opened 13 years ago

yuri-karadzhov commented 13 years ago

The solver for special Riccati equation integrable series will be added to sympy.

Original issue for #5348: http://code.google.com/p/sympy/issues/detail?id=2249 Original author: https://code.google.com/u/110328265044803872166/

asmeurer commented 13 years ago
**Status:** Duplicate  
**Mergedinto:** 2250  

Original comment: http://code.google.com/p/sympy/issues/detail?id=2249#c1 Original author: https://code.google.com/u/asmeurer@gmail.com/

asmeurer commented 13 years ago

Apparently this is actually separate from issue #5349 .

Status: Accepted
Mergedinto:

Referenced issues: #5349 Original comment: http://code.google.com/p/sympy/issues/detail?id=2249#c2 Original author: https://code.google.com/u/asmeurer@gmail.com/

yuri-karadzhov commented 13 years ago

After the changes it will be possible to solve special Riccati euation

a*y'+b*y**2+c*x**alpha=0

where a, b, c != 0 and there's two infinite series for alpha when the equation is integrable in elementary functions.

Original comment: http://code.google.com/p/sympy/issues/detail?id=2249#c3 Original author: https://code.google.com/u/110328265044803872166/

asmeurer commented 12 years ago
**Status:** Valid  

Original comment: http://code.google.com/p/sympy/issues/detail?id=2249#c4 Original author: https://code.google.com/u/asmeurer@gmail.com/

oscarbenjamin commented 4 years ago

Currently this equation is matched by the 1st_power_series solver but it just returns oo. The lie_group solver also matches but then fails with NotImplementedError:

In [21]: a, b, c, alpha = symbols('a, b, c, alpha')                                                                                            

In [22]: x = Symbol('x')                                                                                                                       

In [23]: y = Function('y')                                                                                                                     

In [24]: eq = a*y(x).diff(x) + b*y(x)**2 + c*x**alpha                                                                                          

In [25]: eq                                                                                                                                    
Out[25]: 
  d             2         α
a⋅──(y(x)) + b⋅y (x) + c⋅x 
  dx                       

In [26]: dsolve(eq)                                                                                                                            
Out[26]: y(x) = ∞

In [27]: classify_ode(eq, y(x))                                                                                                                
Out[27]: ('1st_power_series', 'lie_group')

In [28]: dsolve(eq, hint='lie_group')                                                                                                          
---------------------------------------------------------------------------
NotImplementedError 

It looks like Ricatti equations can always be reduced to linear ODEs by substitution: https://en.wikipedia.org/wiki/Riccati_equation I think it would be useful if the ODE module actually implemented substitutions explicitly since it would make it very easy to implement solvers for equations like this.

naveensaigit commented 3 years ago

I think the substitution would be helpful if we implement the Kovacic algorithm. That way, any Riccati equation could be transformed to a linear second order equation which can then be solved by Kovacic. Another thing we could also use is the fact that knowing a particular solution gives the second solution very easily. But this would be a lot of special case code.

oscarbenjamin commented 3 years ago

We should definitely implement the Kovacic algorithm and make sure all cases of the Riccati equation are covered.

Right now the most immediately useful thing would be to fix #17590.