;(function() { window.createMeasureObserver = (measureName) => { var markPrefix = `_uol-measure-${measureName}-${new Date().getTime()}`; performance.mark(`${markPrefix}-start`); return { end: function() { performance.mark(`${markPrefix}-end`); performance.measure(`uol-measure-${measureName}`, `${markPrefix}-start`, `${markPrefix}-end`); performance.clearMarks(`${markPrefix}-start`); performance.clearMarks(`${markPrefix}-end`); } } }; /** * Gerenciador de eventos */ window.gevent = { stack: [], RUN_ONCE: true, on: function(name, callback, once) { this.stack.push([name, callback, !!once]); }, emit: function(name, args) { for (var i = this.stack.length, item; i--;) { item = this.stack[i]; if (item[0] === name) { item[1](args); if (item[2]) { this.stack.splice(i, 1); } } } } }; var runningSearch = false; var hadAnEvent = true; var elementsToWatch = window.elementsToWatch = new Map(); var innerHeight = window.innerHeight; // timestamp da última rodada do requestAnimationFrame // É usado para limitar a procura por elementos visíveis. var lastAnimationTS = 0; // verifica se elemento está no viewport do usuário var isElementInViewport = function(el) { var rect = el.getBoundingClientRect(); var clientHeight = window.innerHeight || document.documentElement.clientHeight; // renderizando antes, evitando troca de conteúdo visível no chartbeat-related-content if(el.className.includes('related-content-front')) return true; // garante que usa ao mínimo 280px de margem para fazer o lazyload var margin = clientHeight + Math.max(280, clientHeight * 0.2); // se a base do componente está acima da altura da tela do usuário, está oculto if(rect.bottom < 0 && rect.bottom > margin * -1) { return false; } // se o topo do elemento está abaixo da altura da tela do usuário, está oculto if(rect.top > margin) { return false; } // se a posição do topo é negativa, verifica se a altura dele ainda // compensa o que já foi scrollado if(rect.top < 0 && rect.height + rect.top < 0) { return false; } return true; }; var asynxNextFreeTime = () => { return new Promise((resolve) => { if(window.requestIdleCallback) { window.requestIdleCallback(resolve, { timeout: 5000, }); } else { window.requestAnimationFrame(resolve); } }); }; var asyncValidateIfElIsInViewPort = function(promise, el) { return promise.then(() => { if(el) { if(isElementInViewport(el) == true) { const cb = elementsToWatch.get(el); // remove da lista para não ser disparado novamente elementsToWatch.delete(el); cb(); } } }).then(asynxNextFreeTime); }; // inicia o fluxo de procura de elementos procurados var look = function() { if(window.requestIdleCallback) { window.requestIdleCallback(findByVisibleElements, { timeout: 5000, }); } else { window.requestAnimationFrame(findByVisibleElements); } }; var findByVisibleElements = function(ts) { var elapsedSinceLast = ts - lastAnimationTS; // se não teve nenhum evento que possa alterar a página if(hadAnEvent == false) { return look(); } if(elementsToWatch.size == 0) { return look(); } if(runningSearch == true) { return look(); } // procura por elementos visíveis apenas 5x/seg if(elapsedSinceLast < 1000/5) { return look(); } // atualiza o último ts lastAnimationTS = ts; // reseta status de scroll para não entrar novamente aqui hadAnEvent = false; // indica que está rodando a procura por elementos no viewport runningSearch = true; const done = Array.from(elementsToWatch.keys()).reduce(asyncValidateIfElIsInViewPort, Promise.resolve()); // obtém todos os elementos que podem ter view contabilizados //elementsToWatch.forEach(function(cb, el) { // if(isElementInViewport(el) == true) { // // remove da lista para não ser disparado novamente // elementsToWatch.delete(el); // cb(el); // } //}); done.then(function() { runningSearch = false; }); // reinicia o fluxo de procura look(); }; /** * Quando o elemento `el` entrar no viewport (-20%), cb será disparado. */ window.lazyload = function(el, cb) { if(el.nodeType != Node.ELEMENT_NODE) { throw new Error("element parameter should be a Element Node"); } if(typeof cb !== 'function') { throw new Error("callback parameter should be a Function"); } elementsToWatch.set(el, cb); } var setEvent = function() { hadAnEvent = true; }; window.addEventListener('scroll', setEvent, { capture: true, ive: true }); window.addEventListener('click', setEvent, { ive: true }); window.addEventListener('resize', setEvent, { ive: true }); window.addEventListener('load', setEvent, { once: true, ive: true }); window.addEventListener('DOMContentLoaded', setEvent, { once: true, ive: true }); window.gevent.on('allJSLoadedAndCreated', setEvent, window.gevent.RUN_ONCE); // inicia a validação look(); })();
  • AssineUOL
Topo

Teoria do caos -a - História e aplicações

Carlos Alberto Campagner, Especial para a Página 3 Pedagogia & Comunicação

Não é sempre que podemos assistir ao nascimento de uma nova ciência. No entanto, isso aconteceu em 1955, quando um cientista chamado Edward Norton Lorenz, com 38 anos de idade, começou a trabalhar no corpo docente da Boston Tech (hoje chamada de MIT - Instituto de Tecnologia de Massachusetts). O departamento era o de Meteorologia, que acabava de iniciar um projeto de previsão estatística do tempo.Nos Estados Unidos, a previsão do tempo é uma verdadeira mania nacional, e os comentaristas do tempo nos noticiários da TV são venerados como astros da telinha. Logicamente, a previsão do tempo tem um papel muito importante, não só para a vida do cidadão comum, mas principalmente para a agricultura e os negócios que giram em torno dela. É essencial saber com antecedência o que vem por aí: tempestades, furacões, etc.

Previsão linear

As previsões estatísticas do tempo eram do tipo linear, ou seja, as equações das previsões tinham constantes e apresentavam uma certa periodicidade inerente ao sistema linear. Não satisfeito com os resultados das previsões por equações lineares, Lorenz propôs, em um simpósio de 1955, a utilização de equações não lineares, ou seja, em que, ao invés de as constantes multiplicarem as variáveis, as funções multiplicariam.

Exemplo: ax2 + bx + c = 0 onde a, b, c são constantes = equação linear

Quando a, b, c forem funções, normalmente em razão do tempo, e não constantes, a equação acima se torna não linear.

Condições iniciais e resultados

Tais equações possuem soluções não periódicas, gerando um modelo mais próximo da realidade. No final da década de 1950, Lorenz parou um processamento no meio e, ao retomá-lo, percebeu que os resultados não eram os mesmos do processamento anterior. Os resultados eram parecidos nos instantes iniciais, mas as alterações ficavam cada vez maiores diferindo muito dos processamentos anteriores. Ao invés de jogar aquela pilha de resultados no lixo, começou a analisá-los e chegou à conclusão de que quando se mudavam as condições iniciais os resultados finais eram totalmente diferentes. Isto foi denominado de caos.Até aqui tudo bem, mas, a resolução de tais equações requer um esforço computacional enorme. Supercomputadores são utilizados para este fim. Normalmente a resolução destas equações é feita por processos numéricos e não literais.

Efeito borboleta

Um dos elementos chaves da teoria do caos é o chamado "efeito borboleta", segundo o qual o bater de asas de uma borboleta pousada na muralha da China pode causar uma tempestade em Nova York. Isso significa, na verdade, que pequenos fatores podem provocar grandes transformações. Veja que se a previsão meteorológica é difícil em países temperados, nos paises tropicais os fatores influentes e, por conseguinte, as variáveis são inúmeras e mais complexas.

Consequências inesperadas

A teoria do caos deu origem aos fractais e suas bases foram expandidas em outras áreas. Como um pequeno boato pode influenciar a bolsa de valores? Se você se atrasar um minuto para sair de casa, pode perder o metrô de um certo horário, que pode provocar a perda de um ônibus para o aeroporto, que pode evitar a tomada de um avião que acabou caindo e matando todos os ageiros e tripulantes.

De volta à meteorologia

Existe uma história a respeito da previsão meteorológica que chateia muito os meteorologistas, mas que vale a pena conhecer. Em um país tropical (sul americano e subdesenvolvido cujo nome será aqui omitido) o acerto da meteorologia estava na casa dos 25%. Para melhorar tal índice foram gastos milhões de dólares em equipamentos e especialistas. Após anos de muito investimento e trabalho chegou-se ao extraordinário índice de 38% de acerto. Porém, se ao invés de tantos milhões de dólares gastos, toda a parafernália meteorológica fosse trocada por uma moeda de um dólar, no cara ou coroa, a previsão teria fatalmente um índice de acerto de 50%. Faz pensar, não é mesmo?