Python Forum

Full Version: Sympy nonlinsolve does not return explicit solution
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
This is my first attempt at symbolic solving in Python and I would need some help. My aim is to get explicit solutions for my variables in terms of the parameters (tetaL, tetaH, Re, Rl, E).

So far, I only got solutions for the variables in function of the other unknow variables, instead of solutions depending on parameters only. For instance, i get the solution for Sb (SbSol) in terms of c2b, c1 which are unknown variables I am trying to solve for.

(I used the solver nonlinsolveas my equations are non-linear.)

I would really appreciate any help because I am a bit lost.

import sympy
import numpy as np
from sympy import *

#symbol declaration (variables to solve for + parameters)
teta, tetaL, tetaH, Re, Rl, E,  Sb, D, c, K, Lb, Lf, Sf, c1, c2, c1b, c2b, exoPstar = ( 
    symbols('teta tetaL tetaH Re, Rl E  Sb D, c K Lb Lf Sf c1 c2 c1b c2b exoPstar') )

exoPstar = Re/Rl
tetaTreshDec = (Re*(Lb + Sb * exoPstar) - c * exoPstar * D) / c*D*(Re- exoPstar)
prNoDefDec = (tetaTreshDec + 1)/2
UDec = prNoDefDec * ( teta * log(c1) + (1-teta) * log(c2)) + (1-prNoDefDec) * ( teta * log(c1b) + (1-teta) * log(c2b))

#the system of equations
focBkSdec = diff(UDec, Sb)
focBkCdec = diff(UDec, c)
focHHdec = diff(UDec, D)
Eq0 = teta - ( 1/2 * (tetaL + tetaH))
Eq1 = E - (D + K)
Eq2 = D - (Lb + Sb)
Eq3 = Lf - (Rl/(Re- Rl) * D * c)
Eq4 = Sf - (E - D - Lf)
Eq5 = c1 - c*D
Eq6 = c2 - (((Sb + Sf)* Re + (Lb- teta*c*D)*Rl + Lf*Rl) / (1- teta))
Eq7 = c1b - (Lb + Lf)
Eq8 = c2b - (c1b + (Sb+Sf)*Re /(1- teta))

#solving in function of the parameters (tetaL, tetaH, Re, Rl, E)
(SbSol, cSol, DSol, KSol, LbSol, LfSol, SfSol, c1Sol, c2Sol, c1bSol, c2bSol), = list(nonlinsolve([focBkSdec,focHHdec, focBkCdec, Eq0, Eq1, Eq2, Eq3, Eq4, Eq5, Eq6, Eq7, Eq8],[Sb, c, D, K, Lb, Lf, Sf, c1, c2, c1b, c2b]))
SbSol
Can you explain the problem, what the variables symbolize and the equations in the equation system? A print of the solution is very confusing, and it is obvious that the unknowns you hope to eliminate are not eliminated.
SbSol  = (-E*Re**2*Rl + E*Re*Rl**2 + 2*Re**2*c1 + Re*Rl**2*c1 - 2*Re*Rl*c1 - Re*Rl*c2b*teta + Re*Rl*c2b + 2*Re*c1*teta - 2*Re*c1 + Rl**2*c1*teta - Rl**2*c1 + Rl**2*c2b*teta - Rl**2*c2b - 2*Rl*c1*teta + 2*Rl*c1)/(Re*(Re**2 - Re*Rl + Re*teta - Re - Rl*teta + Rl))
cSol   = Complement(FiniteSet(Re*c1*(Re + teta - 1)/(E*Re**2 - E*Re*Rl - Re*Rl*c1 + 2*Re*c1 + Re*c2b*teta - Re*c2b - Rl*c1*teta + Rl*c1 - Rl*c2b*teta + Rl*c2b + 2*c1*teta - 2*c1)), FiniteSet(0))
DSol   = (E*Re**2 - E*Re*Rl - Re*Rl*c1 + 2*Re*c1 + Re*c2b*teta - Re*c2b - Rl*c1*teta + Rl*c1 - Rl*c2b*teta + Rl*c2b + 2*c1*teta - 2*c1)/(Re*(Re + teta - 1))
KSol   = (E*Re*Rl + E*Re*teta - E*Re + Re*Rl*c1 - 2*Re*c1 - Re*c2b*teta + Re*c2b + Rl*c1*teta - Rl*c1 + Rl*c2b*teta - Rl*c2b - 2*c1*teta + 2*c1)/(Re*(Re + teta - 1))
LbSol  = (E*Re**2 - E*Re*Rl - Re*Rl*c1 + Re*c2b*teta - Re*c2b - Rl*c1*teta + Rl*c1 - Rl*c2b*teta + Rl*c2b)/(Re**2 - Re*Rl + Re*teta - Re - Rl*teta + Rl)
LfSol  = Rl*c1/(Re - Rl)
SfSol  = (E*Re**2*(Re + teta - 1) - E*Re*Rl*(Re + teta - 1) - Re*Rl*c1*(Re + teta - 1) - (Re - Rl)*(E*Re**2 - E*Re*Rl - Re*Rl*c1 + 2*Re*c1 + Re*c2b*teta - Re*c2b - Rl*c1*teta + Rl*c1 - Rl*c2b*teta + Rl*c2b + 2*c1*teta - 2*c1))/(Re*(Re - Rl)*(Re + teta - 1))
c1Sol  = c1
c2Sol  = exp((teta*log(c1) + teta*log(c2b) - teta*log((E*Re + c2b*teta - c2b)/(Re + teta - 1)) - log(c2b))/(teta - 1))
c1bSol = (E*Re + c2b*teta - c2b)/(Re + teta - 1)
c2bSol = Complement(FiniteSet(c2b), ConditionSet(c2b, Eq(c2b**(2*Re**2*Rl**3*c1**2/(Re**2 - Re*Rl + Re*teta - Re - Rl*teta + Rl))*c2b**(2*Re**3*Rl**4*c1**2/(Re**2 - Re*Rl + Re*teta - Re - Rl*teta + Rl))*c2b**(2*Re**4*Rl**2*c1**2/(Re**2 - Re*Rl + Re*teta - Re - Rl*teta + Rl))*c2b**(2*Re**2*Rl**3*c1**2*teta**2/(Re**2 - Re*Rl + Re*teta - Re - Rl*teta + Rl))*c2b**(4*Re**2*Rl**4*c1**2*teta/(Re**2 - Re*Rl + Re*teta - Re - Rl*teta + Rl))*c2b**(4*Re**3*Rl**2*c1**2*teta/(Re**2 - Re*Rl + Re*teta - Re - Rl*teta + Rl))*c2b**(2*Re**3*Rl**3*c1**2*teta**2/(Re**2 - Re*Rl + Re*teta - Re - Rl*teta + Rl))*c2b**(2*Re**4*Rl**3*c1**2*teta/(Re**2 - Re*Rl + Re*teta - Re - Rl*teta + Rl))*((E*Re + c2b*teta - c2b)/(Re + teta - 1))**(2*Re**2*Rl**3*c1**2*teta/(Re**2 - Re*Rl + Re*teta - Re - Rl*teta + Rl))*((E*Re + c2b*teta - c2b)/(Re + teta - 1))**(2*Re**2*Rl**4*c1**2*teta**2/(Re**2 - Re*Rl + Re*teta - Re - Rl*teta + Rl))*((E*Re + c2b*teta - c2b)/(Re + teta - 1))**(2*Re**3*Rl**2*c1**2*teta**2/(Re**2 - Re*Rl + Re*teta - Re - Rl*teta + Rl))*((E*Re + c2b*teta - c2b)/(Re + teta - 1))**(2*Re**3*Rl**4*c1**2*teta/(Re**2 - Re*Rl + Re*teta - Re - Rl*teta + Rl))*((E*Re + c2b*teta - c2b)/(Re + teta - 1))**(2*Re**4*Rl**2*c1**2*teta/(Re**2 - Re*Rl + Re*teta - Re - Rl*teta + Rl))*(c1**(teta/(teta - 1))*c2b**(teta/(teta - 1))*c2b**(-1/(teta - 1))*((E*Re + c2b*teta - c2b)/(Re + teta - 1))**(-teta/(teta - 1)))**(2*Re**2*Rl**4*c1**2/(Re**2 - Re*Rl + Re*teta - Re - Rl*teta + Rl))*(c1**(teta/(teta - 1))*c2b**(teta/(teta - 1))*c2b**(-1/(teta - 1))*((E*Re + c2b*teta - c2b)/(Re + teta - 1))**(-teta/(teta - 1)))**(2*Re**3*Rl**2*c1**2/(Re**2 - Re*Rl + Re*teta - Re - Rl*teta + Rl))*(c1**(teta/(teta - 1))*c2b**(teta/(teta - 1))*c2b**(-1/(teta - 1))*((E*Re + c2b*teta - c2b)/(Re + teta - 1))**(-teta/(teta - 1)))**(2*Re**4*Rl**3*c1**2/(Re**2 - Re*Rl + Re*teta - Re - Rl*teta + Rl))*(c1**(teta/(teta - 1))*c2b**(teta/(teta - 1))*c2b**(-1/(teta - 1))*((E*Re + c2b*teta - c2b)/(Re + teta - 1))**(-teta/(teta - 1)))**(4*Re**2*Rl**3*c1**2*teta/(Re**2 - Re*Rl + Re*teta - Re - Rl*teta + Rl))*(c1**(teta/(teta - 1))*c2b**(teta/(teta - 1))*c2b**(-1/(teta - 1))*((E*Re + c2b*teta - c2b)/(Re + teta - 1))**(-teta/(teta - 1)))**(2*Re**2*Rl**4*c1**2*teta**2/(Re**2 - Re*Rl + Re*teta - Re - Rl*teta + Rl))*(c1**(teta/(teta - 1))*c2b**(teta/(teta - 1))*c2b**(-1/(teta - 1))*((E*Re + c2b*teta - c2b)/(Re + teta - 1))**(-teta/(teta - 1)))**(2*Re**3*Rl**2*c1**2*teta**2/(Re**2 - Re*Rl + Re*teta - Re - Rl*teta + Rl))*(c1**(teta/(teta - 1))*c2b**(teta/(teta - 1))*c2b**(-1/(teta - 1))*((E*Re + c2b*teta - c2b)/(Re + teta - 1))**(-teta/(teta - 1)))**(2*Re**3*Rl**3*c1**2*teta/(Re**2 - Re*Rl + Re*teta - Re - Rl*teta + Rl))*(c1**(teta/(teta - 1))*c2b**(teta/(teta - 1))*c2b**(-1/(teta - 1))*((E*Re + c2b*teta - c2b)/(Re + teta - 1))**(-teta/(teta - 1)))**(2*Re**3*Rl**4*c1**2*teta/(Re**2 - Re*Rl + Re*teta - Re - Rl*teta + Rl))*(c1**(teta/(teta - 1))*c2b**(teta/(teta - 1))*c2b**(-1/(teta - 1))*((E*Re + c2b*teta - c2b)/(Re + teta - 1))**(-teta/(teta - 1)))**(2*Re**4*Rl**2*c1**2*teta/(Re**2 - Re*Rl + Re*teta - Re - Rl*teta + Rl)), 0), Complexes))