Hi all,
just a minor fix in the description.
Cheers!
---------------------
Sirio Bolaños.
UNAM, México.
--~--~---------~--~----~------------~-------~--~----~
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at http://groups.google.com/group/sage-devel
URLs: http://www.sagemath.org
-~----------~----~----~----~------~----~------~--~---
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#function parameters are the inequality to solve and left and right endpoints tuple of the interval in which to search for a solution (consequence of the plot-dependant algorithm for finding all roots)
def isolve(ineq,(rleft,rright)):
"""
Inequality solver
sage can solve inequalities and express the result as the intervals of solution
syntax is: isolve(inequality,(left endpoint of interval in which to search for solutions,right endpoint))
sage: isolve(abs(x^2-2)<2,(-10,10))
'[[-2.0000000000000000 .. 2.0000000000000000]]'
AUTHORS:
-- Sirio Bolanos: initial version
EXAMPLES:
sage: isolve((x-1)*(x-2)*(x-3)*(x-4)*(x-5)<0,(-10,10))
'[[-infinity .. 1.0000000000000000], [2.0000000000000000 .. 3.0000000000000000], [4.0000000000000000 .. 5.0000000000000000]]'
sage: isolve(abs(x-2)+abs(2*x^3-1)>abs(2*x+7),(-10,10))
'[[-infinity .. -0.87961487981223052], [1.7837690610319452 .. +infinity]]'
"""
zeros = []
roots = []
solution = []
#perhaps eps should also be a parameter?
eps = 0.000000001
try:
op = ineq.__getitem__(1)
lm = ineq.__getitem__(0)
rm = ineq.__getitem__(2)
except:
raise ValueError, "trying to solve expression without operator"
if op == operator.eq:
raise ValueError, "trying to solve equation, please use solve() instead"
f = lm - rm
p = plot(f,(rleft,rright),plot_points=1000)
for i in range(len(p[0])-1):
if (p[0][i][1] > 0 and p[0][i+1][1] < 0) or (p[0][i][1] < 0 and p[0][i+1][1] > 0):
zeros.append((p[0][i],p[0][i+1]))
if len(zeros) is not 0:
for i in range(len(zeros)):
root = f.find_root(zeros[i][0][0],zeros[i][1][0])
#quick fix to find_root providing inexact roots if integers
if abs(floor(root)-root) < eps:
root = floor(root)
elif abs(ceil(root)-root) < eps:
root = ceil(root)
roots.append(root)
else:
raise ValueError, "inequality has no solution"
#FIXME provide a way of specifying if RIF is open or closed interval depending on operator (<,<=,>,>=)
if len(roots) > 1:
if bool(op(f(roots[0]-eps),0)) is True:
solution.append(RIF((-infinity,roots[0])))
for i in range(len(roots)-1):
if bool(op(f(roots[i]+eps),0)) is True:
solution.append(RIF((roots[i],roots[i+1])))
if bool(op(f(roots[-1]+eps),0)) is True:
solution.append(RIF((roots[-1],infinity)))
else:
if bool(op(f(roots[0]+eps),0)) is True:
solution.append(RIF((roots[0],infinity)))
else:
solution.append(RIF((-infinity,roots[0])))
return solution