terça-feira, 17 de dezembro de 2013

Plot da Função de Ackermann no Scilab

A função de Ackermann é um exemplo de função computável que não é recursiva primitiva.
Ela cresce muito rapidamente e mesmo pequenos valores de entrada como (4,2) geram números com muitos dígitos.

A função de Ackermann para duas variáveis é definida utilizando recursão:


Tentar calcular num computador para valores maiores que (3,3) pode consumir muitos recursos devido ao excesso de chamadas recursivas.

Eu implementei no Scilab o cálculo de 32 pontos, isso foi o máximo que consegui para preencher uma matriz antes dos problemas de recursão. Por exemplo, para os valores (4,1) ou (5,0) já não é possível o cálculo.
Com os dados obtidos, gerei um gráfico 3d.

Segue o código:

function h = ack(a, b)
  if(a==0) then
    h = b+1
  elseif (b==0) then
    h = ack(a-1, 1)
  else
    tmp = ack(a, b-1)
    h = ack(a-1, tmp)
  end
endfunction

xmax = 3
ymax = 7

x = [0:1:xmax]
y = [0:1:ymax]
z = zeros(xmax, ymax)

for i=0:xmax
  for j=0:ymax
    z(i+1, j+1) = ack(i, j)
  end
end

plot3d(x,y,z, theta = 225, alpha = 1)


A matriz com os dados (m X n):

    1.    2.     3.     4.     5.      6.      7.      8.     
    2.    3.     4.     5.     6.      7.      8.      9.     
    3.    5.     7.     9.     11.     13.     15.     17.    
    5.    13.    29.    61.    125.    253.    509.    1021.  

E seu correspondente gráfico:

Mais perto, vemos os primeiros valores pequenos e depois um "salto":


Nenhum comentário:

Postar um comentário