Terça-feira, 2 de Junho de 2009

Fim deste formato

o blog passa a ficar noutro lado... diale.org

Quarta-feira, 13 de Maio de 2009

ENBF

Tenho andado a brincar com o pacote do Emacs EbnfToPsPackage para escrever um manual de programação para os meus alunos. Entretanto o diagrama de Backus–Naur para este blog poderia ser:



Há quem que por aqui nunca passe, outros que só passam uma vez e ainda alguns que repetidamente aqui voltam.

Quarta-feira, 6 de Maio de 2009

Fecha-se o círculo

twitter <-> blogspot

Quarta-feira, 8 de Abril de 2009

Expressões condicionais

Uma expressão condicional tem a forma

onde os p's são proposições e os e's expressões de qualquer tipo.

A expressão condicional

pode ler-se da sequinte forma

"Se p1 então e1, caso contrário, se p2 então e2"

A regra que permite determinar o sue valor é a seguinte: começa-se por examinar os p's da esquerda para direita; se se encontrar um p cujo valor seja V (verdade) então o valor da expressão condicional é e,a expressão correspondente.

Alguns exemplos:

Valor absoluto de x



Factorial



Raiz quadrada de um número positivo a (método de Newton)

Domingo, 5 de Abril de 2009

Mesmo agora

Sábado, 4 de Abril de 2009

Raiz quadrada de um número positivo

Consideremos o problema de calcular a raiz quadrada de um número positivo $x$, isto é,

$\sqrt{x}=y$ tal que $y\ge 0$ e $y^2=x$.

Como é que um computador calcula raízes quadradas? A maneira usual é usarmos o método de Newton para determinar a solução da equação $y^2=x$. Começando com uma aproximação inicial $y$ para o valor da raiz quadrada de $x$, conseguimos obter uma melhor aproximação calculando a média aritmética de $y$ e de $x/y$.

Consideremos o cálculo de $\sqrt{2}$. Tomando o valor $1$ como aproximação inicial, obtemos a tabela:

Aproximação         Quociente         Média

1 2/1 (2+1)/2=1.5

1.5 2/1.5=1.3333 (1.3333+1.5)/2=1.4167

1.4167 2/1.4167=1.4118 (1.4167+1.4118)/2=1.4142

1.4142 ...


Continuando com este processo iremos obter de cada vez melhores aproximações ao valor de $\sqrt{2}$.

Este algoritmo na sua presente forma foi descoberto por Herão de Alexandria no século um A.C.

A forma recursiva está implementada na função em GNU/Octave heron.m
function y=heron(x,y,tol)
while(abs(x-y.^2)>tol)
y=heron(x,(y+x/y)/2,tol);
endwhile;
endfunction;


O cálculo de uma aproximação à raiz quadrada de $2$ que corresponde ao comando
>  heron(2,1,.001)

é de facto a composição seguinte (processo definido por recorrência linear):
> heron(2,1,.001)
> heron(2,heron(2,3/2,.001),.001)
> heron(2,heron(2,heron(2,17/12,.001),.001),.001)
577/408

Quarta-feira, 25 de Março de 2009

In copious free time

Tenho andado ocupado com isto...



Para breve uma explicação (clicar na figura para se perceber o que é).

Terça-feira, 17 de Março de 2009

Primavera

Sexta-feira, 13 de Março de 2009

Exercício favorito



Este é um dos meus exercícios favoritos que costumo dar aos meus alunos para resolver. Mostra bem o efeito dos arredondamentos em operações efectuadas em vírgula flutuante.

O resultado final é, para mim, surpreendente!

Sincronismo de um pelotão de fuzilamento



Através de um do blogs que costumo ler dei com o Firing squad synchronization problem. A regra 60 dos autómatos celulares resolve-o.

Quarta-feira, 4 de Março de 2009

Citação

A significant component of piracy is simply that it offers a better user experience.


Paul Graham

Segunda-feira, 2 de Março de 2009

Come a papa, Joana come a papa

Bem sei que já não tem a frescura de outros tempos, mas ainda vale pela originalidade do conceito. Ainda não apareceu nada que se lhe aproxime. Vale a pena ler o comentário do autor do vídeo.

The LEGO Turing Machine

Quarta-feira, 25 de Fevereiro de 2009

Fórmulas pouco conhecidas

Pelos vistos as expressões





são obtidas da fórmula de Weiertrass para a a função Gamma de Euler.

O código em GNU/Octave seguinte calcula as expressões anteriores para 0, 25, 50 e 100 termos.

clear all;

x=linspace(0,2,100);
clf;
hold on;
grid;
yc=cos(pi*x);
ys=sin(pi*x);

for j=0:25:100
z=pi*x;
for i=1:j;
z=z.*(1-1/i^2*x.^2);
endfor;
plot(x,z)
endfor;

for j=0:25:100
y=ones(1,100);
for i=0:j;
y=y.*(1-4/(2*i+1)^2*x.^2);
endfor;
plot(x,y,'m')
endfor;

plot(x,yc,'r-;cos(x);')
plot(x,ys,'g-;sin(x);')
axis([0 2 -1.5 1.5])


O resultado é este: