I am solving a fluid mechanic problem where the flow rate is to be determined.
I have the following sets of 4 eqs with 4 unknown variables (v, dot_v, Re,f):
v = dot_v / 0.0113
Re = v* 0.12 / 1.10**-6
1/sqrt(f) = -2*log10(2.51/(Re * sqrt(f))
8 = f* 800/0.12 * v**2 / (2*9.81)
I tried the following code:
import sympy as sym
import numpy as np
Ac = 3.14*0.12*0.12/4
v, dot_v, Re, f = sym.symbols('v, dot_v, Re, f')
eq1 = sym.Eq(dot_v/Ac,v)
eq2 = sym.Eq(v*0.12/(1*10**-6),Re)
eq3 = sym.Eq(-2*np.log10(2.51/(Re*np.sqrt(f))),1/np.sqrt(f))
eq4 = sym.Eq(f*800/0.12*v**2/(2*9.81),8)
result = sym.solve([eq1,eq2,eq3,eq4],(v, dot_v, Re, f))
I have the following errors: TypeError: loop of ufunc does not support argument 0 of type Mul which has no callable log10 method
How can I get the solution ? The solver itself is not my main focus (setting the set of equations was) but I still need to get the numerical solution. Google did not provide me any solution in Python. In past exercices, the flow rate was known thus Re, and I used the bissection method to get f but here flow rate is not known.
Thank you and happy new year
The TypeError likely occurred because sym.Eq did not like np.log10 inside eq3. On the other hand, your purpose would require the use of a numerical solver, since you want to get a numerical solution and sym.solve is rather an analytical solver for symbolic solutions and performs less well for providing numerical solutions. For your purpose, scipy.optimize can potentially be a better tool like in:
import numpy as np
from scipy.optimize import fsolve
# Constants
Ac = 3.14 * 0.12 * 0.12 / 4
mu = 1 * 10**-6
rho = 800
D = 0.12
def equations(var):
v, dot_v, Re, f = var
eq1 = dot_v / Ac - v
eq2 = v * D / mu - Re
eq3 = -2 * np.log10(2.51 / (Re * np.sqrt(f))) - 1 / np.sqrt(f)
eq4 = f * rho / D * v**2 / (2 * 9.81) - 8
return [eq1, eq2, eq3, eq4]
#initial guesses for the solver
initial_guess = [1, 1, 1e5, 0.02]
solution = fsolve(equations, initial_guess)
v, dot_v, Re, f = solution
print(f"v = {v}")
print(f"dot_v = {dot_v}")
print(f"Re = {Re}")
print(f"f = {f}")
Note that the initial guesses must be more or less good estimates of the solutions to get reliable results.