Commit 8d0794fc authored by Bernardo Quaresma Dias's avatar Bernardo Quaresma Dias
Browse files

Inclusão de lib-math 1_2

parent 4943d523
func { id = "math_calc_polinomio", name = "Calcular Polinômio", group = "Blocos Matemáticos",
description = [[Calcula o polinômio de um valor a partir de uma lista de potências e coeficientes.]],
parameters = {
{ name = "Valor", type = "REAL"},
{ name = "Potências", type = "REAL[]"},
{ name = "Coeficientes", type = "REAL[]"},
},
results = {
{ name = "Valor Calculado", type = "REAL" }
},
code = [===[ function(v, pots, coefs) --[[ASSERT]] assert(#pots == #coefs, "Listas de Potências deve ter o mesmo tamanho da lista de Coeficientes.")
local ret = 0
for i, pot in ipairs(pots) do
local coef = coefs[i]
ret = ret + v^pot*coef
end
return ret
end ]===],
}
code = (code or "") .. [====[
MATH_ERF_POTS = { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21}
MATH_ERF_COEFS = { 1, -1/3, 1/10, -1/42, 1/216, -1/1320, 1/9360, -1/75600, 1/685440, -1/6894720, 1/76204800}
]====]
func { id = "math_calc_erf", name = "Calcular Função de Erro", group = "Blocos Matemáticos",
description = [[Retorna a função de erro (erf) de um valor usando um polinômio aproximado.]],
parameters = {
{ name = "x", type = "REAL"},
},
results = {
{ name = "Valor Calculado", type = "REAL" }
},
code = [===[ function(x)
return math_calc_polinomio(x, MATH_ERF_POTS, MATH_ERF_COEFS)
end ]===],
}
class{ id = "polinomio", name = "Polinômio", group = "Blocos Matemáticos",
bases = {},
description = [[Modelagem de polinômio com coeficientes até o quinto grau.]],
attributes = {
{ id = "max", name ="X Máximo", type = "REAL", access ="",
description = [[Valor máximo para variável em que o polinômio pode ser aplicado.]],
},
{ id = "min", name ="X Mínimo", type = "REAL", access ="",
description = [[Valor mínimo para variável em que o polinômio pode ser aplicado.]],
},
{ id = "a", name ="A", type = "REAL", access ="",
description = [[Coeficiente Linear.]],
},
{ id = "b", name ="B", type = "REAL", access ="",
description = [[Coeficiente do 1o grau.]],
},
{ id = "c", name ="C", type = "REAL", access ="",
description = [[Coeficiente do 2o grau.]],
},
{ id = "d", name ="D", type = "REAL", access ="",
description = [[Coeficiente do 3o grau.]],
},
{ id = "e", name ="E", type = "REAL", access ="",
description = [[Coeficiente do 4o grau.]],
},
{ id = "f", name ="F", type = "REAL", access ="",
description = [[Coeficiente do 5o grau.]],
},
},
methods = {
{ id = "informar_coeficiente", name ="Informar Coeficiente",
description = [[Informa os coeficiente associado ao índice.]],
parameters = {
{ name = "N", type = "INTEGER" },
},
results = {
{ name = "Coeficiente N", type = "REAL" },
},
code = [===[ function(self, n)
local coefs = {"a","b","c","d","e","f"}
return self[coefs[n+1]]
end ]===],
},
{ id = "calcular_polinomio", name ="Calcular Polinômio",
description = [[Calcula o valor do polinômio. Se o valor da variável estiver fora dos limites estabelecidos o método retorna nil.]],
parameters = {
{ name = "X", type = "REAL" },
},
results = {
{ name = "Valor Calculado", type = "REAL" },
},
code = [===[ function (self, x)
if self.min and self.max then
assert(self.min <= self.max, ("%s: valor de 'min' tem de ser menor ou igual a 'max'."):format(tostring(self)) )
end
if self.min and x < self.min then
return nil
end
if self.max and x > self.max then
return nil
end
local val = 0
for i=0, 5 do
local coef = self:informar_coeficiente(i) or 0
val = val + coef*x^i
end
return val
end ]===],
},
},
}
class{ id = "curva", name = "Curva", group = "Blocos Matemáticos",
bases = {},
description = [[]],
attributes = {
{ id = "coef_linear", name ="Coeficiente Linear", type = "REAL", access ="gs",
description = [[]],
},
{ id = "t_0", name ="Tempo Inicial", type = "REAL", access ="",
description = [[]],
},
{ id = "coef_angular", name ="Coeficient Angular", type = "REAL", access ="",
description = [[]],
},
{ id = "inverter", name ="Inverter", type = "BOOLEAN", access ="gs",
description = [[Inverte o sinal do coeficiente linear, invertendo o sentido da curva.]],
},
},
methods = {
{ id = "definir_t_0", name ="Definir Tempo Inicial",
description = [[Define o valor de Tempo Inicial para o tempo atual.]],
parameters = {
},
results = {
},
code = [===[ function(self)
self.t_0 = time()
end ]===],
},
{ id = "ajustar_t_0", name ="Ajustar Tempo Inicial",
description = [[Ajusta o valor de Tempo Inicial.]],
parameters = {
{ name = "Tempo Inicial", type = "REAL" },
},
results = {
},
code = [===[ function(self, v)
self.t_0 = v
end ]===],
},
{ id = "limpar", name ="limpar",
description = [[Limpa os dados da curva.]],
parameters = {
},
results = {
},
code = [===[ function(self, v)
self.t_0 = nil
self.coef_linear = nil
self.inverter = nil
end ]===],
},
{ id = "calcular", name ="Calcular",
description = [[
Calcula o valor da curva no tempo atual.
A fórmula utilizada é:
y(t) = a*t + b
onde,
a: coeficiente angular
b: coeficiente linear
t: tempo atual - tempo inicial
O tempo inicial deve ser definido usando os método "Definir Tempo Inicial" ou "Ajustar Tempo Inicial".
Se o atributo inverter for verdadeiro o valor do de a será considerado -a.]],
parameters = {
},
results = {
{ name = "Valor Calculado", type = "REAL" },
},
code = [===[ function (self)
local a = self.coef_angular
a = self.inverter and -a or a
local b = self.coef_linear
local t = time() - (self.t_0 or 0)
return a and b and t and a*t + b
end ]===],
},
},
}
--$COMPAT:_limitar_valor
func{ id = "limitar", name = "Limitar",
description = [[
Retorna o valor dentro dos limite informados.
Os limites são opcionais.
]],
parameters = {
{ name = "Valor", type = "REAL" },
{ name = "Valor Mínimo", type = "REAL" },
{ name = "Valor Máximo", type = "REAL" },
},
results = {
{ name = "Valor Limitado", type = "REAL" },
},
code = [===[ function(v, vmin, vmax)
if vmin and (v < vmin) then return vmin end
if vmax and (v > vmax) then return vmax end
return v
end ]===],
}
func{ id = "dround", name = "Arredondar para Casa Decimal",
description = [[
Arredonda um número real para o número de casas decimais informado.
Se nenhum parâmetro for passado, o valor será arredondado para um número inteiro.
O maior número de casas decimais permitido é 99.
]],
parameters = {
{name = "Valor", type = "REAL" },
{name = "Casas Decimais", type = "INTEGER" },
},
results = {
{name = "Valor Arredondado", type = "REAL" },
},
code = [===[ function (v, n)
local neg = (v < 0) and -1 or 1
local dec
if n == nil then
dec = 1
else
dec = 10^(limitar(n, 0, 99))
end
local upped = math.abs(v*dec)
local round = math.ceil(upped-0.5)
return neg*round/dec
end ]===],
}
--$COMPAT:_calcular_media_ponderada
func{ id = "media_ponderada", name = "Calcular Média Ponderada",
description = [[
Calcular o valor intermediário entre dois valores.
Se um peso não for definido retorna a média entre os dois valores.
A função considera peso entre 0 e 1 e irá sinalizar um erro se este for definido fora desses limites.
]],
parameters = {
{name="Valor A", type="REAL"},
{name="Valor B", type="REAL"},
{name="Peso A", type="REAL"},
},
results = {
{name="Média Ponderada", type="REAL"},
},
code = [===[ function(a, b, w)
if w == nil then
w = 0.5
else
assert(w>=0 and w<=1, "peso definido fora dos limites esperados [0;1]: "..w)
end
return a*w + b*(1-w)
end ]===],
}
func{ id = "ramp", name = "Calcular Rampa",
description = [[
Função que calcula o valor atual a ser aplicado em uma rampa.
Se o tempo atual for maior que o tempo final, o valor final será retornado.
Se, por outro lado, o tempo atual for menor que o tempo inicial, o valor inicial será retornado.
]],
parameters = {
{name = "Valor Inicial", type = "REAL" },
{name = "Valor Final", type = "REAL" },
{name = "Tempo Inicial", type = "REAL" },
{name = "Tempo Final", type = "REAL" },
},
results = {
{name = "Valor Atual", type = "REAL" },
},
code = [===[ function (v1, v2, t1, t2)
local t = time()
if t > t2 then
return v2
elseif t < t1 then
return v1
else
local a = 0
if t2 ~= t1 then
a = (v2-v1)/(t2-t1)
end
local b = v1-a*t1
return a*t+b
end
end ]===],
}
func{ id = "lessthan", name = "Menor Que",
description = [[
Compara dois valores e informa se o primeiro é menor do que o segundo levando
em consideração uma tolerância.
]],
parameters = {
{name = "Valor 1", type = "REAL" },
{name = "Valor 2", type = "REAL" },
{name = "Tolerância", type = "REAL" },
},
results = {
{name = "Relação", type = "BOOLEAN" },
},
code = [===[ function (v1, v2, tol) --[[ASSERT]] assert(v1 and v2, ("lessthan: tentativa de comparar números indefinidos (%s, %s)."):format(tostring(v1), tostring(v2)) )
tol = tol or 0
return v1 < (v2-tol)
end ]===],
}
func{ id = "relate", name = "Avaliar Relação",
description = [[
Avalia a relação entre do primeiro valor com o segundo.
Se o segundo valor for zero a relação será considerada máxima seguindo o sinal do primeiro valor.
Se ambos valores forem zero a relação será considerada zero.
]],
parameters = {
{name = "Valor 1", type = "REAL" },
{name = "Valor 2", type = "REAL" },
},
results = {
{name = "Relação", type = "REAL" },
},
code = [===[ function (v1, v2) --[[ASSERT]] assert(v1 and v2, ("relate: tentativa de relacionar números indefinidos (%s, %s)."):format(tostring(v1), tostring(v2)) )
if v2 == 0 then
if v1 == 0 then
return 0
elseif v1 > 0 then
return math.huge
else
return -math.huge
end
end
return (v1-v2)/v2
end ]===],
}
func{ id = "comp_sign", name = "Comparação de Sinais",
description = [[
Função recebe dois valores e retornar somente verdadeiro
se ambos forem positivos ou negativos e não nulo.
]],
parameters = {
{name = "Valor 1", type = "REAL" },
{name = "Valor 2", type = "REAL" },
},
results = {
{name = "Retorno", type = "BOOLEAN" },
},
code = [===[ function (v1, v2) --[[ASSERT]] assert(v1 and v2, ("comp_sign: valores indefinidos. (%s, %s) "):format(tostring(v1), tostring(v2)) )
local ret = v1*v2
return ret > 0
end ]===],
}
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment