  lua-l archive

• Subject: Re: Symbolic equation solving in Lua
• From: Gavin Wraith <gavin@...>
• Date: Mon, 30 Apr 2018 12:11:15 +0100

```In message <CAGmA6cGxgim9d1GQB0+r6nb4KOkBcmVxBAYo5QEntokkQpbNEg@mail.gmail.com>
Hur Butun <hurbutun@gmail.com> wrote:

> I don't really understand what could be the different meanings of solve in
> this case. As I mentioned in my previous message, I would like to obtain
> the value of the friction factor using Colebrook equation.

Sorry - I meant "solve for which variable?". If that is "k" then
what you need is

local x = math.sqrt(lambda)
(exp(-1/(2*x))-2*51/(R*x))/(3.72*d)

On the other hand if you want lambda in terms of R, the Reynold's number, k and
d (hydraulic diameter) then you need

lambda = 1/(math.sqrt (fixpoint (f)))

where

f = function (x)
local a = ((2.51/R)*x + k/(3.72*d))
return -2*math.log(a)
end

where fixpoint(f) solves f(x) == x. To do this you need an initial guess, say 1,
a choice of accuracy epsilon, say 10^(-7) and the Newton-Raphson method:

local df = function (x) -- derivative of f
local c = -2*(2.51)/R
local y = (2.51*x)/R + k/(3.72*d))
return c/y
end

fixpoint = function (f)
local g = guess
while math.abs(g-f(g)) < epsilon do
g = g - f(g)/df(g)
end
return g
end

This is totally off the cuff, so E&OE.
--
Gavin Wraith (gavin@wra1th.plus.com)