Commit bed3c49a authored by Bernardo Quaresma Dias's avatar Bernardo Quaresma Dias
Browse files

[INSTMPA-759]

+ajuste de nomes de funções de lista
+agrupamento de modelos de lista em um mesma biblioteca de modelos
parent 98e1ebdc
func{ id = "sum", name = "Calcular Somatório de Lista", description =
[[Função que recebe lista de valores reais e retorna o somatório desses valores.
class{ id = "amostras", name = "Amostras", group = "Diagnstico",
Se o pârametro for positivo, as N primeiras amostras serão consideradas;
Se o parâmetro for negativo, as N últimas amostras serão consideradas na média;
Caso o parâmetro seja nulo, todas as amostras serão consideradas.
Se o valor absoluto de N for maior que o número de elementos da lista, todos os elementos serão considerados.
]],
parameters = {
{name = "Lista", type = "REAL[]" },
{name = "N", type = "INTEGER" },
},
results = {
{name = "Somatório", type = "REAL" },
{name = "Primeiro", type = "INTEGER" },
{name = "Último", type = "INTEGER" },
},
code = [===[ function (l, n)
local first, last = 1, #l
if n ~= nil then
if n > 0 then
last = math.min(last, n)
elseif n < 0 then
first = math.max(first, 1 + last + n)
end
end
local value = 0
for i = first, last do
value = value + l[i]
end
return value, first, last
end ]===],
}
func{ id = "average", name = "Calcular Média de Lista", description =
[[Função que recebe lista de valores reais e retorna a média desses valores de acordo com parâmetro N.
Se o pârametro for positivo, as N primeiras amostras serão consideradas;
Se o parâmetro for negativo, as N últimas amostras serão consideradas na média;
Caso o parâmetro seja nulo, todas as amostras serão consideradas.
Se o valor absoluto de N for maior que o número de elementos da lista, todos os elementos serão considerados.
]],
parameters = {
{name = "Lista", type = "REAL[]" },
{name = "N", type = "INTEGER" },
},
results = {
{name = "Média", type = "REAL" },
{name = "Primeiro", type = "INTEGER" },
{name = "Último", type = "INTEGER" },
},
code = [===[ function (l, n)
local total, first, last = sum(l, n)
local size = last - first + 1
return total / size, first, last
end ]===],
}
func{ id = "devsq", name = "Calcular Desvio Padrão de Lista", description =
[[Função que recebe lista de valores reais, calcula a média e retorna o desvio padrão para os valores.
Se o pârametro for positivo, as N primeiras amostras serão consideradas;
Se o parâmetro for negativo, as N últimas amostras serão consideradas na média;
Caso o parâmetro seja nulo, todas as amostras serão consideradas.
Se o valor absoluto de N for maior que o número de elementos da lista, todos os elementos serão considerados.
]],
parameters = {
{name = "Lista", type = "REAL[]" },
{name = "N", type = "INTEGER" },
},
results = {
{name = "Desvio Padrão", type = "REAL" },
{name = "Média", type = "REAL" },
},
code = [===[ function (l, n)
local avg, first, last = average(l, n)
local value = 0
for i = first, last do
value = value + (l[i] - avg) ^ 2
end
local size = last - first + 1
return math.sqrt(value/size), avg
end ]===],
}
func{ id = "covar", name = "Calcular Co-Variância de Lista", description =
[[Função que recebe duas listas de valores reais, e calcula a co-variância entre os valores.]],
parameters = { {name = "Lista", type = "REAL[]" }, },
results = { {name = "Desvio Padrão", type = "REAL" }, },
code = [===[ function (l1, l2)
assert(#l1 == #l2,"lists need to have the same number of elements")
local n = #l1
local m1 = average(l1)
local m2 = average(l2)
local c = 0
for i = 1, n do
c = c + (l1[i] - m1) * (l2[i] - m2)
end
return c / n
end ]===],
}
func{ id = "slope", name = "Calcular Slope de Lista", description =
[[Função que recebe duas listas de valores reais, e calcula a co-variância entre os valores.]],
parameters = { {name = "Lista 1", type = "REAL[]" }, {name = "Lista 2", type = "REAL[]" }, },
results = { {name = "Slope", type = "REAL" }, },
code = [===[ function (l1, l2)
local covar_12 = covar(l1,l2)
local q = devsq(l2)/#l1
return (q == 0) and 0 or covar_12/q
end ]===],
}
func{ id = "mediana", name = "Calcular Mediana de Lista", description =
[[Calcula a mediana de uma lista de valores.]],
parameters = {
{ name = "Valores", type = "REAL[]" },
},
results = {
{ name = "Mediana", type = "REAL" },
},
code = [===[ function(l)
table.sort(l)
local m = #l/2
if math.mod(#l,2) == 0 then -- número par de elementos na lista
return (l[m] + l[m+1])/2
else
return l[math.floor(m)+1]
end
end ]===],
}
class{ id = "lista_persistente", name = "Lista Persistente", group = "Listas",
bases = {},
description = [[Equipamento para armazenar uma lista de valores textuais em disco para que possam ser carregados em uma nova sessão.
A lista é carregada automaticamente ao inicilaizar a instância da classe e salva ao inserir ou remover um elemento.]],
attributes = {
{ id = "limite_elementos",
name = "Limite de Elementos",
type = "INTEGER",
access = "gs",
description = [[Limite de elementos que podem ser inseridos na lista.
Se, ao inserir um novo elemento, esse limite seja excedido, os elementos são removidos a partir do início da lista até que esse valor seja respeitado.]],
},
},
code = [====[
function _CLASS:load()
local val = loadfile(self._filename)
self._valores = val and val() or {}
end
function _CLASS:save()
local file = io.open(self._filename, "w")
file:write("return {\n")
for i, elem in ipairs(self._valores) do
file:write(string.format("%q,\n",elem))
end
file:write("}\n")
file:close()
end
function _CLASS:init()
self._filename = tostring(self)..".lua"
self:load()
end
]====],
methods = {
{ id = "inserir", name = "Inserir", description =
[[Insere um novo elemento no final da lista.
Os valores são armazenados como texto.]],
parameters = {
{ name = "Novo Valor", type = "STRING" },
},
results = {
},
code = [===[ function(self, valor)
table.insert(self._valores, valor)
while self.limite_elementos and (#self._valores > math.max(0, self.limite_elementos) ) do
self:remover()
end
self:save()
end ]===],
},
{ id = "remover", name = "Remover", description =
[[Remove o elemento na posição informada e retorna.
Se nenhuma posição for informada, o primeiro elemento da lista será removido.]],
parameters = {
{ name = "Posição", type = "INTEGER" },
},
results = {
},
code = [===[ function(self, posicao)
local ret = table.remove(self._valores, posicao or 1)
self:save()
return ret
end ]===],
},
{ id = "informar", name = "Informar", description =
[[Informa o valor de determinada posição da lista.
Se nenhuma posição for passada, indica o valor na última posição.]],
parameters = {
{ name = "Posição", type = "INTEGER" },
},
results = {
{ name = "Valor", type = "STRING" },
},
code = [===[ function(self, posicao)
return self._valores[posicao or #self._valores]
end ]===],
},
{ id = "informar_tamanho", name = "Informar Tamanho", description =
[[Informa o tamanho da lista.]],
parameters = {
},
results = {
{ name = "Tamanho", type = "INTEGER" },
},
code = [===[ function(self)
return #self._valores
end ]===],
},
},
}
class{ id = "amostras", name = "Amostras", group = "Listas",
bases = {}, description =
[[Classe que modela um conjunto de amostras de uma variável de processo.]],
attributes = {
......
include('lib-amostras-1_0.mpam')
include('lib-utils-list-1_0.mpam')
class{ id = "bloco_calculo", name = "Bloco de Cálculo", group = "Blocos de Cálculo",
class{ id = "bloco_calculo", group = "Classes Abstratas",
bases = {},
description = [[]],
attributes = {
......@@ -107,7 +106,7 @@ class{ id = "bloco_filtro", name = "Bloco Filtro", group = "Blocos de C
return self._ret or self.v_init
end ]===],
},
{ id = "executar", name = "Executar", description =
{ id = "calcular", name = "Calcular", description =
[[Executa o filtro sobre o valor do processo.
O filtro de primeira ordem calcula a seguinte equação sobre o valor do processo:
......@@ -220,7 +219,7 @@ class{ id = "bloco_media", name = "Bloco M
},
}
class{ id = "tempo_morto", name = "Tempo Morto", group = "Blocos de Cálculo",
class{ id = "bloco_tempo_morto", name = "Bloco Tempo Morto", group = "Blocos de Cálculo",
bases = {"bloco_calculo"},
description = [[Bloco de cálculo que retorna, ao executaro, o valor com atraso.]],
attributes = {
......@@ -316,3 +315,170 @@ class{ id = "tempo_morto", name = "Tempo Morto", group = "Blocos de C
},
},
}
class{ id = "bloco_integrador", name = "Bloco Integrador", group = "Blocos de Cálculo",
bases = {}, description =
[[]],
attributes = {
{ id = "k", name ="K", type = "REAL", access ="gs", description =
[[O valor da constante do processo.]],
},
{ id = "valor_referencia", name ="Valor Referência", type = "REAL", access ="gs", description =
[[O valor de referência do processo.]],
},
},
methods = {
{ id = "iniciar", name ="Iniciar", description =
[[Inicia o valor do somatório]],
parameters = {
},
results = {
},
code = [===[ function(self)
self.y_1 = nil
end ]===],
},
{ id = "calcular", name ="Executar", description =
[[Executa o integrador sobre o valor do processo.
O integrador calcula a seguinte equação sobre o valor do processo:
f(x) = K*S((x-VR)*dt)
Onde K é a constante de ganho adimensional do processo, S é o somatório, VR é
o valor de referência do processo e dt é a diferença de tempo, em segundos,
entre cada duas avaliações.]],
parameters = {
{ name = "Valor do Processo", type = "REAL" },
},
results = {
{ name = "Valor do Integrador", type = "REAL" },
},
code = [===[ function(self, x)
self:atualizar_tempos()
local y = 0
if (self.y_1 ~= nil) then
local VR = self.valor_referencia
local dt = self.t_0 - self.t_1
y = self.y_1+(x-VR)*dt
end
self.y_1 = y
local K = self.k
return K*y
end ]===],
},
{ id = "atualizar", name ="", description =
[[]],
parameters = {
},
results = {
},
code = [===[ function(self)
self.t_1 = self.t_0
self.t_0 = time()
end ]===],
},
},
}
class{ id = "bloco_derivador", name = "Bloco Derivador", group = "Blocos de Cálculo",
bases = {}, description =
[[]],
attributes = {
{ id = "ganho", name ="K", type = "REAL", access ="gs", description =
[[O valor da constante do processo.]],
},
{ id = "amostras", name ="N", type = "REAL", access ="gs", description =
[[Número de amostras a serem consideradas para o cálculo da derivada.]],
},
},
code = [[ function _CLASS:init()
self.values = {}
self.times = {}
end
]],
methods = {
{ id = "calcular", name ="Calcular", description =
[[Executa sobre o valor do processo.
O derivador calcula a seguinte equação sobre o valor do processo:
f(x) = K*(valor-valor_anterior)/dt
Onde K é a constante de ganho adimensional do processo e dt é a diferença de tempo, em segundos,
entre cada duas avaliações.
Se for determinado um número de amostras o resultado será a inclinação da reta de regressão linear para as amostras informadas.
Obs: A primeira execução irá retornar 0, como se não houvesse variação no valor.]],
parameters = {
{ name = "Valor do Processo", type = "REAL" },
},
results = {
{ name = "Variação do Valor", type = "REAL" },
},
code = [===[ function(self, v)
self:armazena_amostra(v)
if #self.values <= 1 then
return 0
else
local K = self.ganho or 1
if self.amostras == nil then
local dv = self.values[1] - self.values[2]
local dt = self.times[1] - self.times[2]
self.resultado = K*dv/dt
else
self.resultado = K*slope(self.values, self.times)
end
return self.resultado
end
end ]===],
},
{ id = "informar_resultado", name ="Informar resultado", description =
[[Informa o resultado da última execução do derivador.]],
parameters = {},
results = {
{ name = "Variação do Valor", type = "REAL" },
},
code = [===[ function(self)
return self.resultado
end ]===],
},
{ id = "armazena_amostra", name ="", description =
[[]],
parameters = {},
results = {},
code = [===[ function(self, value)
table.insert(self.values, 1, value)
table.insert(self.times, 1, time())
local amostras = self.amostras or 2
while #self.values > amostras do
table.remove(self.values)
table.remove(self.times)
end
end ]===],
},
{ id = "inicializar", name ="Inicializar", description =
[[Inicializa o derivador, apagando quaisquer valores históricos que existam.]],
parameters = {
},
results = {
},
code = [===[ function(self)
self.values = {}
self.times = {}
end ]===],
},
{ id = "verificar", name = "Verificar", description =
[[Verifica se o número de amostras e retorna verdadeiro caso esse número já tenha sido atingido.]],
parameters = {
},
results = {
{ name = "Preenchido", type = "BOOLEAN"},
},
code = [===[ function(self)
return #self.values >= (self.amostras or 2)
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