segunda-feira, 28 de outubro de 2019

Scilab: waitbar & messagebox

Janela de saída do waitbar.

Em alguns casos, os cálculos podem ser bem demorados e envolver algum tipo de estrutura de repetição. Nesses casos, pode ser interessante informar em passo do laço estão os cálculos com uma mensagem na tela. Para isso podemos usar o comando waitbar. E no final dos cálculos, uma mensagem de conclusão pode ser incluída com algum aviso sonoro (beep). Se os cálculos demorarem muitos dias, é prudente salvar os resultados parciais com o comando save.

Código exemplo Scilab:

clc;
janH=waitbar('Este é um exemplo');
x = rand(1000,1000,'n');
for j=1:25
  x = rand(1000,1000,'n');
  y=inv(x);
  vez = j/25;
  s = 'Invertendo a ' + string(j) + ' matriz.';
  waitbar(vez,s,janH);
end
close(janH);
beep();
messagebox('Fim dos cálculos', 'Fim - programa exemplo.', 'info');

Mensagem de saída final:

segunda-feira, 21 de outubro de 2019

Divulgando: Hackathon (Ceará, 2019)


O TCE Ceará promove o primeiro concurso cultural de tecnologia e inovação, denominado Hackathon - uma competição de programação no estilo maratona, promovendo a inovação em prol da sociedade.

Em 2019, o desafio é desenvolver uma solução para ler dados abertos dos diversos municípios e do governo do estado do Ceará, encontrar indícios e publicar informações, permitindo a checagem pelos cidadãos.

A ideia é disponibilizar uma plataforma ou parte dela para permitir a colaboração da sociedade no combate à corrupção.

As três melhores equipes serão premiadas.

PREMIAÇÃO: R$ 30.000,00 (trinta mil reais) em prêmios. 
  • 1º LUGAR: R$15.000 (quinze mil reais) 
  • 2º LUGAR: R$10.000 (dez mil reais) 
  • 3º LUGAR: R$5.000 (cinco mil reais)
* Mais informações aqui.

quinta-feira, 17 de outubro de 2019

Ser professor: vídeo de Leandro Karnal


No vídeo acima o professor Leandro Karnal (Lattes aqui) fala um pouco do que é ser professor. Acredito que é um vídeo bem interessante para todos aqueles que abraçaram essa carreira, seja nos níveis mais básicos, seja em nível universitário.

*** Link do vídeo.

sexta-feira, 11 de outubro de 2019

Solução iterativa de ponto fixo de uma equação não linear


Em algumas situações nos deparamos com problemas que envolvem a solução de equações não lineares. Por exemplo, qual o valor de $x$ para que $Q(x)$ definido na relação abaixo seja igual a $10^{-3}$?
$$ Q(x) \cong \frac{1}{x\sqrt{2\pi}} (1 - 0,7/x^2) e^{-x^2/2}$$
Até onde eu vejo, uma solução analítica não é possível. Logo, devemos buscar uma solução numérica. Uma forma de resolver esse problema é usar a técnica do ponto fixo. Para isso precisamos encontrar uma expressão do tipo $x_{k+1} = g(x_k)$, com algum valor para $x_0$ que não seja muito distante da solução desejada. Manipulando a expressão $Q(x) = 10^{-3}$ obtemos:
$$ x_{k+1} = \sqrt{-2\ln \left( \frac{10^{-3}x_k\sqrt{2\pi}}{1 - 0,7/x_k^2} \right)}$$
Começando com $x_0 = 2$, obtemos a seguinte sequência
k     x                  Q(x)
 1.   1.1947763   3.1947763
 2.   0.1105417   3.0842345
 3.   0.0096555   3.09389
 4.   0.0008504   3.0930396
 5.   0.0000749   3.0931144
 6.   0.0000066   3.0931078
 7.   0.0000006   3.0931084
 8.   5.104D-08   3.0931084
 9.   4.493D-09   3.0931084

Logo, para $x = 3.0931084$, o valor de $Q(x)$ é igual a $10^{-3}$. Uma observação importante: nem sempre a convergência ocorre e algumas vezes a convergência pode ser muito lenta. Um código Scilab que resolve esse problema é:

clc; 
x = 2;
e = 1;
emax = 1e-8;
k = 0;
pe = 1e-3; p2r = sqrt(2*%pi); pp = pe*p2r;
while e>emax do
    x1 = sqrt(-2*log((pp*x)/(1-0.7/(x*x))));
    e = abs(x - x1);
    x = x1;
    k = k  + 1;
    disp([k, e, x]);
end
qx = exp(-x*x/2)*(1-0.7/(x*x))/(x*p2r);
disp(qx);

quarta-feira, 9 de outubro de 2019

Elaborando um projeto de pesquisa


Em geral, um projeto de pesquisa é composto dos seguintes itens obrigatórios: título, identificação do proponente ou equipe, resumo (de 300 a 500 palavras, no máximo), introdução, objetivos (geral e específicos), justificativa, revisão bibliográfica, metodologia (materiais e métodos), cronograma, custos e referências, podendo ainda incluir apêndices ou anexos. Outros itens (ex: equipe executora) podem ser acrescentados, mas acredito que os que foram citados já são suficientes para a maioria dos casos.

No projeto de pesquisa você deve descrever o que você pretende fazer, quais resultados devem ser alcançados e quais ferramentas deverão ser usadas. Para isso, é necessário estudar bem o tema, rever o que já foi publicado sobre o assunto, dando ênfase às pesquisas e publicações mais atuais e relevantes. Todas as ações, ou pelo menos as mais importantes, que serão desenvolvidas devem colocadas em uma linha do tempo, o cronograma.

O projeto de pesquisa deve ser um texto objetivo e claro, redundâncias precisam ser evitadas. O que já é bem conhecido e estabelecido na literatura pode ser referenciado, mas não precisa ser reescrito no corpo do projeto. Uma pergunta frequente: quantas páginas tem um projeto de pesquisa? Resposta: o número de páginas suficiente para "vender" o peixe, nem mais nem menos. Claro, devemos evitar os exageros: 5 ou 6 páginas me parece um número pequeno, 50 páginas é um exagero. Outros pontos e informações podem ser lidos em:

segunda-feira, 7 de outubro de 2019

Calculando uma integral com inttrap e intsplin


Muitos problemas requerem o cálculo de integrais definidas em um intervalo definido $(a,b)$. Algumas vezes esse cálculo é bem simples, em outros uma solução analítica não é possível. Se a função for contínua poderemos usar os comandos inttrap e intsplin do Scilab. O inttrap usa a regra dos trapézios repetida e é computacionalmente mais simples e menos preciso que o intsplin.

Vejamos um exemplo simples. A integral da função $y(t) = sin( \pi t)$ no intervalo $(0, 1)$ resulta no valor $\frac{2}{\pi}$. Temos que definir o passo do tempo $t$. Podemos, por exemplo, fazer o passo igual a $1/10$: t = 0:0.1:1, código Scilab é:

clc;
t = 0:0.1:1;
y = sin(%pi * t);
Inty1 = inttrap(t,y);
Inty2 = intsplin(t,y);
Intt = 2/%pi;
erro1 = 100*abs(Inty1 - Intt)/Intt;
erro2 = 100*abs(Inty2 - Intt)/Intt;
disp([Inty1, erro1, Inty2, erro2]);

Resultando em:
 0.6313752    0.8238231    0.6366199    0.0000138 

Claramente, o resultado que obtemos com o comando intsplin é muito superior. Naturalmente, se o passo que adotamos para o "tempo" for reduzido (ex: 0,05), os erros serão ainda menores. Um desafio -  calcular a integral abaixo:
\[ \int_0^{\infty} \frac{sin(\pi t)}{\pi t} dt\]
Obs: existem dois problemas no cálculo numérico acima: a divisão por zero e o "infinito" na integral. Como contornar esses problemas?