Coding Period Week 4

Organization : SymPy
Solvers: Completing Solveset

12 June 2016 - 18 June 2016

by Shekhar Prasad Rajak — Posted on June 13, 2016

Back to GSoC Blog Home page

Solveset when domain = S.Integers

PR #11234

Right now we may not get our solution in Integer domain but we can use concept of diophantine equations in solveset. When I messaged about this in giiter channel Aaron told about the diophantine, already defined in solvers/diophantine.py. So we can use diophantine in solveset to get Integer solution.diophantine is coded pretty well and works fine.

Diophantine Equations

Let P(x, y, …) is a polynomial with integer coefficients in one or more variables. A Diophantine equation is an algebraic equation

P(x, y, z, ... ) =  0

for which integer solutions are sought.

Previous work on this :

PR #10994


solveset_univariate_trig_ineq :*

PR #11257 * Problem in current branch:

In [ ]: solveset((2*cos(x)+1)/(2*cos(x)-1) > 0, x, S.Reals)
Out[ ]:
(-oo, pi/3) \ ImageSet(Lambda(_n, 2*_n*pi + 5*pi/3), Integers()) U ImageSet(Lambda(_n, 2*_n*pi + pi/3), Integers()) U (2*pi/3, 4*pi/3) \ ImageSet(Lambda(_n, 2*_n*pi + 5*pi/3), Integers()) U ImageSet(Lambda(_n, 2*_n*pi + pi/3), Integers())

solution expected is :

(1/3)*(3*pi*n - pi) < x < (1/3)*(3*pi*n +pi), n element in Z

I am working on this and have opened PR #11257 but it is failing some cases. I am trying to improve it. It is inspired from previous solve_univariate_inequality but it seems need changes for trig ineq.

Main intention is to get extended solution for Trigonometric inequality.

eg.

In [2]: solveset((2*cos(x)+1)/(2*cos(x)-1) > 0, x, S.Reals)
Out[2]:
⎡⎧      π        ⎫  ⎧      π        ⎫⎤
⎢⎨n⋅π - ─ | n ∊ ℤ⎬, ⎨n⋅π + ─ | n ∊ ℤ⎬⎥
⎣⎩      3        ⎭  ⎩      3        ⎭⎦

n [4]: solveset(sin(x) > 1/sqrt(2), x, S.Reals)
Out[4]:
⎛⎧        π        ⎫  ⎧        3⋅π        ⎫⎞
⎜⎨2⋅n⋅π + ─ | n ∊ ℤ⎬, ⎨2⋅n⋅π + ─── | n ∊ ℤ⎬⎟
⎝⎩        4        ⎭  ⎩         4         ⎭⎠

In [15]: solveset(2*cos(x) + sqrt(3) < 0, x, S.Reals)
Out[15]:
⎛⎧        5⋅π        ⎫  ⎧        7⋅π        ⎫⎞
⎜⎨2⋅n⋅π + ─── | n ∊ ℤ⎬, ⎨2⋅n⋅π + ─── | n ∊ ℤ⎬⎟
⎝⎩         6         ⎭  ⎩         6         ⎭⎠

In [16]: solveset_univariate_trig_inequality(tan(x) > 0, x)
Out[16]:
⎛               ⎧      π        ⎫⎞
⎜{n⋅π | n ∊ ℤ}, ⎨n⋅π + ─ | n ∊ ℤ⎬⎟
⎝               ⎩      2        ⎭⎠
  • Still need some good idea to improve the PR #11257. will continue …

Continue- nonlinsolve :

PR #11111

  • After Amit’s review and comments, I improved the docstring, improved the complements and intersection if block present in substitution function.

  • The main thing I added is : now substitution method will return both Real and Complex solution. That mean now it is using solveset_real and solveset_complex. Previously it uses solveset_complex when there is S.EmpltySet from solveset_real.

  • Since both solveset_real and solveset_complex solution need similar steps. So I am using _solve_using_know_values function a helper for substitution method, where solver parameter can be solveset_real or solveset_complex. Another parameter is result which is list of dict <known_symbol: it’s value> (already solved symbol, mostly from nonlinsolve/_solve_poly_system).

Meanwhile

  • Opened an issue #11236.

  • PR #11239 for the issue

  • I found that right now diophantine can’t handle these types of equations :

In [ ]: diophantine((x+y)**2 - x**3 + y**3)
---------------------------------------------------------------------------
NotImplementedError: No solver has been written for cubic_thue.

continue..



Follow @shekharrajak