The following solves the system in much less time and gives a solution that
has 30% operations. It's not that SymPy can't solve the system, it's about
knowing when to do something different and what simplification is most apt
to be useful.
def test():
var('a:z')
e1=(-4*q - 5*r)*(f**2 - 5*f*r/(-4*q - 5*r) + 4*q**2/(
-4*q - 5*r) + 3*q*r/(-4*q - 5*r))
e2=10*r*(f**2*(-4*h*q - 4*i*q)/(10*r) + f*(-4*g*q/(5*r
) - g - 4*h*q/(5*r) - 2*h - i + 4*q**2/(25*r)
) - g/2 + 2*h*q**2/(5*r) - h/2 + 2*i*q**2/(5*r
) + 2*q**2/(25*r)+ q + r/2)
gis=[factor_terms(collect(i, f)) for i in solve(e2,g,
check=False,simplify=False)]
fis=solve(e1,f,check=False,simplify=False)
sol=[]
for gi in gis:
for fi in fis:
fi = factor_terms(fi)
sol.append({f:fi, g:gi.subs(f, fi)})
return sol
Issue #15441 has similar problems that have been identified. This case was
added there, too.
An improvement to the system-solver was removal of connected components.
The next thing that should probably be done is to recursively remove from
such subsets equations that uniquely contain a variable of interest or that
contain only one variable of interest. e.g. given f(a,b,c), g(a,b), h(a),
solve f for c, g for b and h for a.; for a case like f(a,b,c), g(a,b),h(c),
solve h for c then solve f and g for a and b.
/c
On Thursday, December 23, 2021 at 3:20:19 AM UTC-6 [email protected]
wrote:
> “never returns” is a bit of an over statement. About half an hour is not
> eternity :
>
> >>> from time import time as stime
> >>> t0 = stime() ; Sol2 = solve([e1, e2], [f, g], dict=True) ; t1 = stime() ;
> >>> print(t1 - t0)
> 1628.6711568832397
>
>
> Le mardi 21 décembre 2021 à 11:25:36 UTC+1, [email protected] a
> écrit :
>
>> After :
>>
>> ```
>> from sympy import symbols, solve
>> f, q, r, h, i, g = map(symbols, 'fqrhig')
>> e1 = -4*f**2*q - 5*f**2*r - 5*f*r + 4*q**2 + 3*q*r
>> e2 = -4*f**2*h*q - 4*f**2*i*q - 8*f*g*q - 10*f*g*r - 8*f*h*q - 20*f*h*r -
>> 10*f*i*r + 8*f*q**2/5 - 5*g*r + 4*h*q**2 - 5*h*r + 4*i*q**2 + 4*q**2/5 +
>> 10*q*r + 5*r**2
>> ```
>> trying `solve([e1, e2], [f, g])` never returns.
>>
>> FWIW, in Sage, with equivalent definitions :
>>
>> ```
>> sage: %time solve([e1, e2], [f, g], solution_dict=True)
>> CPU times: user 935 ms, sys: 12.1 ms, total: 947 ms
>> Wall time: 671 ms
>> [{f: -1/2*(5*r + sqrt(64*q^3 + 128*q^2*r + 5*(12*q + 5)*r^2))/(4*q + 5*r),
>> g: -1/5*(5120*h*q^5 - 1024*q^6 + 625*(12*(2*h + i)*q + 10*h + 5*i)*r^4
>> + 50*(10*(94*h + 38*i - 1)*q^2 - 24*q^3 + 25*(5*h + i)*q)*r^3 +
>> 80*(5*(132*h + 36*i - 1)*q^3 - 44*q^4 + 25*h*q^2)*r^2 + 128*(5*(41*h +
>> 5*i)*q^4 - 26*q^5)*r + (80*(2*h + 2*i + 11)*q^3*r + 64*q^4 + 125*(5*h + 5*i
>> + 18*q)*r^3 + 625*r^4 + 50*(4*(h + i + 12)*q^2 + 5*(h +
>> i)*q)*r^2)*sqrt(64*q^3 + 128*q^2*r + 5*(12*q + 5)*r^2))/(1024*q^5 +
>> 4608*q^4*r + 125*(12*q + 5)*r^4 + 200*(28*q^2 + 5*q)*r^3 + 80*(96*q^3 +
>> 5*q^2)*r^2)},
>> {f: -1/2*(5*r - sqrt(64*q^3 + 128*q^2*r + 5*(12*q + 5)*r^2))/(4*q + 5*r),
>> g: -1/5*(5120*h*q^5 - 1024*q^6 + 625*(12*(2*h + i)*q + 10*h + 5*i)*r^4
>> + 50*(10*(94*h + 38*i - 1)*q^2 - 24*q^3 + 25*(5*h + i)*q)*r^3 +
>> 80*(5*(132*h + 36*i - 1)*q^3 - 44*q^4 + 25*h*q^2)*r^2 + 128*(5*(41*h +
>> 5*i)*q^4 - 26*q^5)*r - (80*(2*h + 2*i + 11)*q^3*r + 64*q^4 + 125*(5*h + 5*i
>> + 18*q)*r^3 + 625*r^4 + 50*(4*(h + i + 12)*q^2 + 5*(h +
>> i)*q)*r^2)*sqrt(64*q^3 + 128*q^2*r + 5*(12*q + 5)*r^2))/(1024*q^5 +
>> 4608*q^4*r + 125*(12*q + 5)*r^4 + 200*(28*q^2 + 5*q)*r^3 + 80*(96*q^3 +
>> 5*q^2)*r^2)}]
>> ```
>>
>> WTF ?
>>
>>
--
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/4992a0a2-468c-4a88-af0a-29ba1132cca5n%40googlegroups.com.