Ah, I was afraid of that. Looking at the code, I'm not sure if the algorithm provides a better way than continually refining with smaller epsilon until you get a separation, but I don't know the details of the algorithm so that could be wrong. I will note that you can use refine_root() once you have your intervals to just refine a single interval, which would at least be a little more efficient.
Aaron Meurer On Tue, May 21, 2024 at 4:30 PM Ani J <anij...@gmail.com> wrote: > > It doesn't look like just taking the minimum length works. > Consider the following program: > > from sympy import Poly > from sympy.abc import x > from sympy import div, ZZ, QQ, RR > p = Poly(x**6 + 19/5*x**5 + 131/50*x**4 - x**2 - 19/5*x - 131/50, x, > domain='QQ') > print(p.intervals()) > print(p.intervals(eps=0.5)) > > > like just taking the minimum length works. The first output is: [((-3, -2), > 1), ((-1, -1), 1), ((-1, 0), 1), ((1, 1), 1)] > Here the minimum interval length (>0) is 1. Even using 0.5 as the interval > length in the next line prints: [((-3, -14/5), 1), ((-1, -1), 1), ((-1, > -4/5), 1), ((1, 1), 1)] > but this has -1 as the common endpoint between the second and the third > interval. > It would be great if the intervals have different endpoint. For now, I just > start a while loop with eps=1 and keep dividing eps by 2, > until I get different endpoints. Hope this works for now. > > Best > > On Tuesday, May 21, 2024 at 2:02:20 PM UTC-7 asme...@gmail.com wrote: >> >> I'm not sure if it's enough to just take the minimum length of the >> intervals that overlap and set eps to something smaller than that. >> Someone more familiar with the inner workings of the algorithm would >> have to verify whether that would work or if it could still leave >> intersecting endpoints. >> >> IMO, we should just fix the function to not return intersecting >> endpoints in the first place. The intervals aren't really isolating if >> they intersect. >> >> Aaron Meurer >> >> On Tue, May 21, 2024 at 2:58 PM Ani J <ani...@gmail.com> wrote: >> > >> > Yes, this seems like a good option, so keep reducing eps in a while loop >> > until the endpoints of all intervals are different, right? >> > >> > On Tuesday, May 21, 2024 at 1:55:54 PM UTC-7 asme...@gmail.com wrote: >> >> >> >> I don't know if there's an existing option to do this. It seems like >> >> it would be useful. You can always lower the eps to make the intervals >> >> smaller: >> >> >> >> >>> Poly(x**6 + 19/5*x**5 + 131/50*x**4 - x**2 - 19/5*x - 131/50, x, >> >> >>> domain='QQ').intervals(eps=0.1) >> >> [((-29/10, -26/9), 1), ((-1, -1), 1), ((-10/11, -9/10), 1), ((1, 1), 1)] >> >> >> >> Aaron Meurer >> >> >> >> On Tue, May 21, 2024 at 2:51 PM Ani J <ani...@gmail.com> wrote: >> >> > >> >> > >> >> > Oh! I see, but i believe that the intervals overlap on the endpoints, >> >> > is it possible to make the intervals completely disjoint?? >> >> > For example consider the following program: >> >> > >> >> > from sympy import Poly >> >> > from sympy.abc import x >> >> > from sympy import div, QQ >> >> > p = Poly(x**6 + 19/5*x**5 + 131/50*x**4 - x**2 - 19/5*x - 131/50, x, >> >> > domain='QQ') >> >> > p.intervals() >> >> > >> >> > The intervals that this outputs is: [((-3, -2), 1), ((-1, -1), 1), >> >> > ((-1, 0), 1), ((1, 1), 1)] >> >> > >> >> > Here we can see that the point -1 is a common endpoint between the >> >> > second and >> >> > >> >> > the third term. Is it possible to enforce that there be no common point? >> >> > >> >> > >> >> > Best >> >> > >> >> > On Tuesday, May 21, 2024 at 10:27:15 AM UTC-7 asme...@gmail.com wrote: >> >> >> >> >> >> Yes, this is the case. The documentation for this method could perhaps >> >> >> be improved, but the key word is "isolating", meaning each interval >> >> >> contains exactly one root. You can also read more about the algorithm >> >> >> that is referenced in the docstring >> >> >> https://en.wikipedia.org/wiki/Vincent%27s_theorem >> >> >> >> >> >> Aaron Meurer >> >> >> >> >> >> >> >> >> On Tue, May 21, 2024 at 9:18 AM Chris Smith <smi...@gmail.com> wrote: >> >> >> > >> >> >> > I strongly suspect that the roots returned by `Poly.intervals` have >> >> >> > only one root in them (by definition). If you use >> >> >> > `refine_root(lo,hi,eps)` to refine the root bounds to arbitrary >> >> >> > width and give it an interval in which there is more than one root, >> >> >> > it will raise an error. >> >> >> > >> >> >> > /c >> >> >> > On Tuesday, May 21, 2024 at 6:06:14 AM UTC-5 ani...@gmail.com wrote: >> >> >> >> >> >> >> >> Is it possible to use SymPy library to get intervals (with rational >> >> >> >> endpoints) such that there is exactly one root in the interval? I >> >> >> >> would like to use an implementation of RRI algorithm for my >> >> >> >> purpose. I believe that the interval function does this. Is this >> >> >> >> correct? Is it guaranteed that the output intervals are guaranteed >> >> >> >> to not have any common points? >> >> >> >> >> >> >> >> >> >> >> > -- >> >> >> > You received this message because you are subscribed to the Google >> >> >> > Groups "sympy" group. >> >> >> > To unsubscribe from this group and stop receiving emails from it, >> >> >> > send an email to sympy+un...@googlegroups.com. >> >> >> > To view this discussion on the web visit >> >> >> > https://groups.google.com/d/msgid/sympy/807f8910-040d-475b-91b6-a5002cedeea0n%40googlegroups.com. >> >> > >> >> > -- >> >> > You received this message because you are subscribed to the Google >> >> > Groups "sympy" group. >> >> > To unsubscribe from this group and stop receiving emails from it, send >> >> > an email to sympy+un...@googlegroups.com. >> >> > To view this discussion on the web visit >> >> > https://groups.google.com/d/msgid/sympy/884eb7ff-0762-4771-a81f-930c13dada2dn%40googlegroups.com. >> > >> > -- >> > You received this message because you are subscribed to the Google Groups >> > "sympy" group. >> > To unsubscribe from this group and stop receiving emails from it, send an >> > email to sympy+un...@googlegroups.com. >> > To view this discussion on the web visit >> > https://groups.google.com/d/msgid/sympy/c987974b-cf39-4c8a-ad0a-579b61778513n%40googlegroups.com. > > -- > You received this message because you are subscribed to the Google Groups > "sympy" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to sympy+unsubscr...@googlegroups.com. > To view this discussion on the web visit > https://groups.google.com/d/msgid/sympy/a97ce484-8cbf-4b1f-934f-ae7bd908c3adn%40googlegroups.com. -- You received this message because you are subscribed to the Google Groups "sympy" group. To unsubscribe from this group and stop receiving emails from it, send an email to sympy+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/sympy/CAKgW%3D6%2BYDyOO%2BJjXpqdpuCPmeOp89ttBSd-xZNFCSU4fUgn7bQ%40mail.gmail.com.