powsimp() would normally be the function to do this.
However, it currently can't work if a is defined as real because
sqrt() splits apart automatically
>>> var('a', real=True)
a
>>> sqrt((4*a**2 + 1)*(1/(4*a**6 - 15*a**4 + 12*a**2 + 4)))
sqrt(4*a**2 + 1)*sqrt(1/(4*a**6 - 15*a**4 + 12*a**2 + 4))
I think we should remove this automatic evaluation from sqrt(). If we
did, then simply calling powsimp() on your expression would do what
you want.
Aaron Meurer
On Thu, Apr 1, 2021 at 8:43 AM 'B A' via sympy <[email protected]> wrote:
>
> What is described above has worked well for me. But there is a further
> simplification step that I need help with.
>
> I have some long expressions containing terms contain terms which look like
> this example:
> sqrt(4*a**2 + 1)*sqrt(1/(4*a**6 - 15*a**4 + 12*a**2 + 4))
> How can I instruct sympy to combine such square roots and factor the
> arguments? In this example that would lead to:
>
> sqrt(factor((4*a**2 + 1)/(4*a**6 - 15*a**4 + 12*a**2 + 4)))
> =
> 1/Abs(a**2 - 2)
>
> On Wednesday, March 31, 2021 at 9:03:08 AM UTC+2 B A wrote:
>>
>> Dear Chris,
>>
>> On 31.03.21 05:48, Chris Smith wrote:
>> > Oscar posted code at issue https://github.com/sympy/sympy/issues/19164
>> > for a interva-based Newton solver.
>>
>> Thank you, that's very useful. I didn't know about interval arithmetic.
>>
>> I just implemented the following, which works very well and helps to
>> increase my confidence that problems will be caught:
>>
>> d_abs={}
>> d_problems={}
>>
>> def MyAbs(x):
>> # check if this argument is already in dictionary
>> if x in d_abs:
>> return d_abs[x]
>> # see if there are any roots nearby
>> soln_list = nsolve_interval(x, 0.563, 0.583)
>> # nearby roots provide a warning message and get saved
>> if len(soln_list) > 0:
>> print('WARNING: ambiguous case found, argument of Abs() is', x)
>> d_problems[x]=soln_list
>> # Check sign, determine correct output
>> x1 = x.evalf(subs={a:0.573})
>> if x1 < 0.0:
>> out = -x
>> else:
>> out = x
>> # save into dictionary and return
>> d_abs[x] = out
>> return out
>>
>> Cheers,
>> Bruce
>
> --
> 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 [email protected].
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/sympy/44ef5b14-ea0a-45ca-a978-3b09f1cf82ddn%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 [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/sympy/CAKgW%3D6KMXvzZBfL9Gi6HkbyYPQwjsOHV-YKXxcwkZ9BiTQ9iuA%40mail.gmail.com.