Consequências da invariância da velocidade da luz


Como veremos, a simples exigência de que a velocidade da luz seja a mesma quando medida por um observador em um referencial inercial qualquer implica em profundas consequências tanto para o entendimento da mecânica quanto da estrutura do espaço-tempo.

Simultaneidade

Considere a situação ilustrada na figura 2. Dois eventos ocorrem em \(P\) e \(P^{\prime}\) igualmente distantes do observador \(O\) que está em repouso. Está observador poderá, por exemplo, coletar luz emitida pelos eventos e concluirá que os eventos foram simultâneos.

Figura 2

Outro observador \(O^{\prime}\) está em movimento na direção da separação entre os eventos. Como os sinais de luz levam algum tempo para alcançá-lo ele terá se deslocado de \(\Delta x\) na direção de \( P^{\prime}\) e, portanto, afirmará que \(P^{\prime}\) ocorreu antes que \(P\). Isto mostra que a simultaneidade não é um conceito absoluto. No entanto um observador em movimento transversal com relação à separação \(PP^{\prime}\), com qualquer velocidade, afirmará que os eventos ocorreram ao mesmo tempo.

Dilatação temporal

Na apresentação da TRE Einstein muitas vezes considerou necessário descrever uma forma operacional para se medir uma determinada quantidade. Para medir um intervalo de tempo, por exemplo, nada melhor que construir um relógio de luz, dada a constância de sua velocidade para todos os referenciais inerciais. Considere que dois observadores medem um intervalo de tempo, um deles no referencial \(O\) que se move com velocidade v em relação a \(O^{\prime}\). Um sinal de luz é emitido do ponto \(P_1\) , refletido por um espelho e coletado de volta em \(P_2\) ,como ilustrado na figura 3.

Figura 3

O observador \(O\) carrega consigo o relógio de luz e verifica que o tempo completo de ida e volta do sinal de luz é \(T = 2 \Delta t\) onde
$$ \Delta t = \frac{L}{c} . $$

O observador \(O^{\prime}\) , por sua vez, vê o relógio passar com velocidade \(v\) e medirá um intervalo de tempo \(T^{\prime} = 2 \Delta t^{\prime}\). Observe na figura que, pelo teorema de Pitágoras, temos
$$
L^{\prime 2} + \left( v \Delta t^{\prime} \right)^2 = \left( c \Delta
t^{\prime} \right)^2
$$

e, portanto,
$$
L^{\prime 2} = \Delta t^{\prime 2} \left( c^2 – v^2 \right) .
$$

Concluimos dai que
$$
\Delta t^{\prime} = \frac{L^{\prime}}{\sqrt{c^2 – v^2}} =
\frac{L^{\prime}}{c} \frac{1}{\sqrt{1 – \left( v / c \right)^2}} .
$$

Observe que \(L^{\prime} = L\) , pois não há ambiguidade no comprimento de distâncias perpendiculares à direção do movimento, logo
$$
T = \frac{2 L}{c}, \hspace{0.75em} T^{\prime} = \frac{2 L}{c}
\frac{1}{\sqrt{1 – \left( v / c \right)^2}} .
$$

Concluimos que
$$
T^{\prime} = \frac{T}{\sqrt{1 – \left( v / c \right)^2}},
$$
ou seja, o observador \(O^{\prime}\) mede intervalos de tempo maiores para o relógio em movimento, se comparado com as medidas do observador \(O\) , que está em repouso em relação ao relógio.

Contração espacial

Colocamos agora uma régua para medir a distância entre \(P_1\) e \(P_2\) nos dois referenciais. No primeiro caso ilustrado na figura 4, um observador \(O^{\prime}\) em repouso em relaçao à régua vê o feixe de luz ser emitido em \(P_1\) e recoletado em \(P_2\).

Figura 4

Como, para este observador, o intervalo de tempo gasto pela luz para percorrer o trajeto de ida é volta é \(T^{\prime}\), dado pela equação 3, a distância medida é \(R_0 =\) \(\overline{P_1 P_2} = vT^{\prime}\). Do ponto de vista do observador em \(O\) o relógio está fixo enquanto régua se move com velocidade \(– v\) e o tempo envolvido é \(T\). Portanto a distância percorrida é \( R = vT. \) Como conclusão os dois observadores medem uma distância diferente, relacionadas por
$$
\frac{R_0}{R} = \frac{T^{\prime}}{T} = \frac{1}{\sqrt{1 – \left( v / c
\right)^2}},
$$

o que representa uma contração espacial no sentido do movimento. O observador em movimento em relação à régua, vê seu comprimento como
$$
R = \sqrt{1 – \left( v / c \right)^2} R_0,
$$

onde \(R_0\) é o comprimento obtido por um observador parado em relação à régua.

é costume se definir os seguintes termos para o uso no contexto da TRE. A velocidade relativa do referencial ou objeto em estudo é
$$
\beta = \frac{v}{c},
$$

enquando

(4)

$$
\gamma = \frac{1}{\sqrt{1 – \left( \frac{v}{c} \right)^2}} =
\frac{1}{\sqrt{1 – \beta^2}} . \label{Gamma}
$$
Com estas definições podemos escrever
$$
T^{\prime} = \gamma T^{\prime}, \text{} R^{\prime} = R \sqrt{1 – \beta^2} .
$$

Concluímos que dois observadores em movimento relativo obtém diferentes resultados para medidas de intervalos de tempo e de distância ao longo do movimento. Cada observador verá as réguas do outro com menores comprimentos e seus relógios batendo mais devagar. Este fenômeno é irrelevante para os objetos da experiência diária, que têm velocidades pequenas se comparadas à da luz. No entanto dentro de aceleradores de partículas é possível acelerar partículas até velocidades muito próximas de \(c\) e, nesta situação, os efeitos relativísticos se tornam importantes.

(4) Como veremos mais tarde, a velocidade da luz não pode ser atingida por uma partícula com massa não nula.

Inúmeros exemplos podem ser citados como comprovação experimental destes resultados. Dentro dos aceladores de partículas são produzidas partículas \(\tau\) (tau), que têm meia-vida aproximada de \(3, 05 \times 10^{- 13}\) s quando observadas por um observador em repouso no referencial do laboratório. Elas se apresentam com velocidades muito altas, bem próximas da velocidade da luz(4). Portanto, estas partículas não pode viajar em média uma distância superior a
$$
d = 3 \times 10^8 \hspace{0.25em} \text{m.s}^{- 1} \times 3, 05 \times
10^{- 13} \hspace{0.25em} \text{s} = 9, 15 \times 10^{- 5} \hspace{0.25em}
\text{m},
$$

antes que decaiam sob a forma de outras partículas. No entanto se observa que elas viajam por distâncias muito superiores a esta! A solução para o aparente paradoxo está na TRE. No referencial do laboratório as partículas estão em altas velocidades e por isto seus relógios internos batem mais devagar, permitindo uma viagem mais longa antes do decaimento. Para um referencial colocado sobre as partículas, o chamado referencial comóvel, o tempo flui inalterado mas as distâncias ao longo do movimento ficam contraídas e o resultado final é o mesmo.

Ambos os fenômenos dependem do fator \(\gamma\) definido acima. Partículas \(\tau\) geradas no SLAC, Stanford Linear Accelerator Collider atingem tipicamente \(\gamma = 20\) e as partículas viajam por uma distância média de
$$
20 \times (9, 15 \times 10^{- 5} \hspace{0.25em} \text{m}) = 1, 8 \times
10^{- 2} \hspace{0.25em} \text{m} \approx 1, 8 \hspace{0.25em}
\text{mm}.
$$

Na prática, em um laboratório, a medida do alcance média das partículas é usada para se calcular a meia-vida do \(\tau\).

 

As transformações de Lorentz

Fundamentos Históricos da TRE

Issac Newton

Até o final do século XIX a física se baseava sobre dois pilares: a mecânica de Newton e a sua teoria da gravitação universal e o eletromagnetismo propostos por Faraday e resumidos nas equações de Maxwell. Logo ficou claro, no entanto, que as equações do eletromagnetismo não eram invariantes sob as mesmas leis de transformação que deixavam inalteradas as equações de Newton, as transformações de Galileu. Em outras palavras os processos eletromagnéticos, tais como interação entre cargas e correntes ou a propagação das ondas eletromagnéticas, não são igualmente observados em todos os referenciais inerciais. Além disto Maxwell mostrou sem ambiguidade que a luz é uma onda que se propaga mesmo no vácuo. Deveria haver, portanto, um meio responsável por esta propagação. Formulou-se então o conceito de um sistema de referencial privilegiado que correspondia a este meio, em relação ao qual se poderia determinar o movimento absoluto de todos os corpos. A esse sistema ideal se chamou éter cósmico.

Diversas tentativas foram feitas para resolver a contradição. A primeira possibilidade consistia em considerar que o princípio da relatividade não era aplicável aos fenômenos electromagnéticos, ponto de vista defendido por G. Lorentz, o fundador da teoria eletrônica. Segundo esta visão um sistema inercial parado em relação ao éter é um sistema privilegiado, onde valem as leis de Maxwell. Somente neste sistema a velocidade da luz no vácuo é igual em todas as direções. A segunda possibilidade era a de alterar as equações de Maxwell para que se tornassem invariantes sob as transformações de Galileu, mantendo intactos os conceitos de espaço e tempo clássicos. Esta foi a abordagem adotada por G. Hertz, entre outros. Segundo ele o éter é arrastado pelos corpos em movimento de forma que os fenômenos eletromagnéticos ocorrem da mesma para observadores parados ou em movimento. O princípio da relatividade de Galileu fica assim preservado.

(3) A velocidade da luz, no vácuo, é de aproximadamente \(c = 3 \times 10^{10} cms^{-1}\).


De acordo com as leis da eletrodinâmica a luz é uma onda que se progaga no vácuo com velocidade igual(3) em todas as direções. Por outro lado, de acordo com a composição de velocidades da mecânica de Newton, a velocidade seria diferente se observada por observadores em movimento relativo à fonte. Diversos experimentos foram propostos para detectar este meio. Em 1881 os cientistas americanos Michelson e Morley, entre outros pesquisadores, construiram um aparato com o objetivo de descobrir a velocidade com que a Terra supostamente se desloca através do éter cósmico. O aparelho, representado esquematicamente na figura 1, consistia em uma fonte de luz em \(F\) , refletida por uma placa semi-espelhada \(M\) que divide o feixe de luz. Os espelhos \(M_1\) e \(M_2\) refletem de volta o feixe que é coletado pelo detetor em \(O\). Inicialmente um dos braços do instrumento foi alinhado com a direção de movimento da Terra, ficando o outro na perpendicular.

Experimento de Michelson e Morley

Qualquer atraso na coleta de um os feixes de luz causaria figuras de interferência formadas em \(F\) , observadas por meio do interferômetro de Michelson, o que dotava a montagem de alto grau de precisão. A experiência foi tentada para diversas orientações dos braços, em diferentes horas do dia e épocas do ano, sempre com resultado nulo. Esta é provalvelmente a mais famosa experiência a se tornar importante por seu resultado negativo! Não foi possível observar o movimento da Terra em relação ao éter e a hipótese da existência de um sistema de referência privilegiado foi rejeitada experimentalmente.

Uma terceira possibilidade para a solução do confito entre a teoria eletromagnética e a mecânica clássica consiste na rejeição das noções clássicas sobre o espaço e tempo, a reconstrução das equações do movimento e a manutenção das equações de Maxwell. Esta foi, como veremos, a atitude adotada por Einstein e que deu origem à TRE.

A teoria de Einstein foi construída sobre dois postulados:

  • A velocidade da luz é a mesma para todos os observadores, independentemente de seu movimento relativo.
  • As leis da física são as mesmas em qualquer referencial inercial.

O primeiro postulado estabelece que a velocidade da luz, que denotaremos por \(c\), é uma constante universal da natureza. Um feixe de luz disparado por uma fonte em alta velocidade terá a mesma velocidade que um feixe disparado por uma fonte em repouso, em relação ao observador. O segundo representa um conceito importante, mesmo para a física clássica, embora não tenha sido justamente discutido e considerado no contexto clássico, antes da apresentação da Relatividade. Ele se baseia no conceito de que as leis da natureza devem ser válidas para quaisquer observadores postados em diferentes referenciais referenciais. Em outras palavras a forma matemática sob que estas leis estão expresas deve ser invariante para os diversos observadores.

Einstein desenvolveu uma teoria do movimento consistente com a invariância da velocidade da luz e com as propriedades de transformação da teoria de Maxwell. Ela é denominada Teoria da Relatividade Especial para se diferenciar da Teoria da Relatividade Geral, que generaliza a teoria especial com leis que são invariantes sob transformações gerais de coordenadas.

Página manuscrita de Einstein sobre a Teoria da Relatividade Geral, publicada em Annalen der Physik in 1916.

A Teoria da Relatividade Geral (TRG) é uma generalização da TRE. Na primeira Einstein estudou a invariância das leis da mecânica sob todas as transformações entre referenciais inerciais, o que significa dizer que elas tem a mesma forma para todos os observadores inerciais. Na TRG ele levou adiante esse princípio para valer para todos os observadores, inerciais ou acelerados. O resultado dessa busca terminou por exigir um formalismo matemático já proposto pelo matemático Bernhard Riemann. A geometria Rimannaniana é uma generalização de espaços que não necessariamente satisfazem os postulados de Euclides.

A TRG leva a diversas conclusões surpreendentes como a de que relógios próximos de grandes massas batem mais devagar pois ali e espaço-tempo é curvo. Ela é a melhor descrição conhecida para a interação gravitacional, que é uma consequência da curvatura do espaço-tempo, causada pela matéria.

Como a gravitação é a força predominante em largas escalas, a TRG é o fundamento da Cosmologia Moderna. Ela também é importante na descrição da evoluções das estrelas e da formação de buracos negros.

 

    Equações de campo da Teoria da Relatividade Geral

Relatividade de Galileu

Relatividade de Galileu


O ponto de partida para a descrição matemática de uma lei da natureza é a definição de um sistema de referencial e de coordenadas. Na mecânica os referenciais inerciais são particularmente importantes pois neles as equações do movimento tomam sua forma mais simples. Referenciais inerciais são aqueles em que os observadores não estão sujeitos à ação de forças externas e, portanto, estão em repouso ou se deslocam em movimento retilíneo uniforme.

Pode parecer irrelevante incluir a coordenada tempo, t, nessa transformação, uma vez que ela fica inalterada em qualquer referencial. Não será esse o caso quando considerarmos a relatividade.

Estabeleceremos um sistema de coordenadas em um destes referenciais marcando cada “ponto”, que chamaremos de evento, com os números \((t, \hspace{0.25em} x, \hspace{0.25em} y, \hspace{0.25em} z)\) descrevendo quando e onde o evento ocorreu.

Suponha que um observador no referencial \(S\) associa a um evento as coordenadas \((t, \hspace{0.25em} x, \hspace{0.25em} y, \hspace{0.25em} z)\) enquanto outro, no referencial \(S \acute{}\) associa a um evento as coordenadas \((t^{\prime}, \hspace{0.25em} x^{\prime}, \hspace{0.25em} y^{\prime}, \hspace{0.25em} z^{\prime})\). Se o referencial \(S \acute{}\) se move em relação a \(S\) com velocidade \(v\) constante, por exemplo na direção do eixo \(x\), então os dois sistemas de coordenadas se relacionam da seguinte forma:

$$
\left\{ \begin{array}{cl}
t^{\prime} = & t\\
x^{\prime} = & x – vt\\
y^{\prime} = & y\\
z^{\prime} = & z.
\end{array} \right.
$$

No caso mais geral do referencial \(S^{\prime}\) com velocidade \(v = \left( v_x, \hspace{0.25em} v_y, \hspace{0.25em} v_z \right)\) em relação a \(S\) a regra de transformação de coordenadas e sua inversa são dadas respectivamente por
$$
\left\{ \begin{array}{cl}
t^{\prime} = & t\\
x^{\prime} = & x – v_x t\\
y^{\prime} = & y – v_y t\\
z^{\prime} = & z – v_z t.
\end{array} \right. \hspace{0.75em} \hspace{0.75em} \text{ e } \hspace{0.75em} \left\{
\begin{array}{cl}
t = & t^{\prime}\\
x = & x^{\prime} + v_x t\\
y = & y^{\prime} + v_y t\\
z = & z^{\prime} + v_z t.
\end{array} \right.
$$

Espaço-tempo clássico

Uma nota sobre o espaço onde a mecânica clássica atua pode ser interessante como uma preparação para o estudo da relatividade. Suponhamos que dois eventos \(P\) e \(P^{\prime}\) ocorrem respectivamente sob as coordenadas
$$
P = (t,\;x,\;y,\;z)\hspace{2.0em} \text{e}\hspace{2.0em} P^{\prime} = (t^{\prime},\;x^{\prime}, \;y^{\prime}, \;z^{\prime}).
$$

Podemos calcular as distâncias
$$
\begin{array}{cl}
\Delta t = & t^{\prime} – t\\
& \\
\Delta s = & \sqrt{\left( x^{\prime} – x \right)^2 + \left( y^{\prime} –
y \right)^2 + \left( z^{\prime} – z \right)^2}
\end{array}
$$

que são as mesmas para qualquer observador que as observe. Na mecânica de Newton tempo é universal e independe do movimento do observador. O afastamento espacial entre os eventos, \(\Delta s\), é um objeto geométrico, invariante para qualquer sistema de coordenada que possamos usar. Dizemos que esta distância é invariante sob reparametrizações do espaço. Podemos escrever sob forma matricial
$$
\Delta s^2 = \Delta x^2 + \Delta y^2 + \Delta z^2 = \left( \Delta x
\hspace{0.75em} \Delta y \hspace{0.75em} \Delta z \right) \left(
\begin{array}{ccc}
1 & 0 & 0\\
0 & 1 & 0\\
0 & 0 & 1
\end{array} \right) \left( \begin{array}{c}
\Delta x\\
\Delta y\\
\Delta z
\end{array} \right)
$$

ou, alternativamente \(\Delta s^2 = \sum_{i, j} \Delta x^i \Delta x^j \delta_{ij} = \Delta x^i \Delta x^j \delta_{ij}\), onde \(\delta_{ij}\) são os componentes da métrica de Euclides,
$$
\delta_{ij} = \left( \begin{array}{ccc}
1 & 0 & 0\\
0 & 1 & 0\\
0 & 0 & 1
\end{array} \right) \hspace{4pt}\text{ ou } \hspace{4pt} \delta_{ij} = \left\{
\begin{array}{cl}
1 & \hspace{4pt}\text{ se } \hspace{4pt} i = j\\
0 & \hspace{4pt}\text{ se } \hspace{4pt} i \neq j
\end{array} \right.
$$

e a convenção de Einstein foi usada para indicar a soma sobre as quantidades com índices repetidos. Isto mostra que o espaço onde ocorrem os fenômenos clássicos é o produto cartesiano de \(I \hspace{-4pt} R^3\), um espaço euclidiano de três dimensões mais uma dimensão temporal.

Uma revisão adicional pode tornar mais fácil o estudo a seguir. Sendo \(I \hspace{-4pt} R^3\) um espaço vetorial escolhemos nele a base ortonormal canônica
$$
\left\{ \mathbf{\hat{e}}_i \right\} = \left\{ \hat{\imath}, \hat{\jmath}, \hat{k} \right\}.
$$

Qualquer vetor de \(I \hspace{-4pt} R^3\) pode ser escrito como uma combinação linear dos vetores da base
$$
\vec{v} = \sum^3_{i = 1} v^i \mathbf{\hat{e}}_i = v^i \mathbf{\hat{e}}_i.
$$

Neste espaço definimos o produto interno ou produto escalar, uma aplicação bilinear, simétrica e positiva definida, com o seguinte efeito sobre os vetores da base ortonormal,
$$
\left\langle \mathbf{\hat{e}}_i, \mathbf{\hat{e}}_j \right\rangle = \delta_{ij}.
$$

Então, se \(\vec{u} = u^i \mathbf{\hat{e}}_i\) é outro vetor temos
$$
\left\langle \vec{u}, \vec{v} \right\rangle = \left\langle u^i
\mathbf{\hat{e}}_i, v^j \mathbf{\hat{e}}_j \right\rangle = u^i v^j
\left\langle \mathbf{\hat{e}}_i, \mathbf{\hat{e}}_j \right\rangle = u^i v^j
\delta_{ij},
$$

que é o produto escalar usual \(\left\langle \vec{u}, \vec{v} \right\rangle = u^1 v^1 + u^2 v^2 + u^3 v^3\). A norma ou comprimento de um vetor é
$$
\left| \vec{u} \right| = \sqrt{\left\langle \vec{u}, \vec{u} \right\rangle}
= \sqrt{\left( u^1 \right)^2 + \left( u^2 \right)^2 + \left( u^3 \right)^2}.
$$

As equações do movimento

Vamos denotar por \(\vec{r} = \left( x, y, z \right)\) o vetor posição de um ponto em \(I \hspace{-4pt} R^3\). Uma trajetória neste espaço, percorrida por uma partícula, pode ser representada por uma curva parametrizada sob a forma
$$
\vec{r} \left( t \right) = \left( x \left( t \right), y \left( t \right), z \left( t \right) \right),
$$

sendo que o parâmetro \(t\) é o tempo. Sua velocidade é definida como a variação instantânea da posição com o tempo, ou seja
$$
\vec{v} (t) = \frac{d}{dt} \vec{r} \left( t \right) = \left( \dot{x}
\left( t \right), \dot{y} \left( t \right), \dot{z} \left( t \right) \right)
$$

onde a notação \(\mathbf{\dot{x}}\) foi introduzida para indicar a derivada com relação ao tempo. A aceleração de uma partícula é a derivada segunda
$$
\vec{a} (t) = \frac{d^2}{dt^2} \vec{r} \left( t \right) = \left( \ddot{x}
\left( t \right), \ddot{y} \left( t \right), \ddot{z} \left( t \right) \right).
$$

A equação de Newton uma equação diferencial
$$
\vec{F} = m \vec{a} (t),
$$

cuja solução é a trajetória da partícula.

Exemplo: Na teoria de Newton as trajetórias de partículas livres, i.e., não submetidas a nenhuma força, são retas de \(I \hspace{-4pt} R^3\). Temos
$$
\vec{F} = 0 \Rightarrow \vec{a} = 0,
$$

o que representa três equações diferenciais
$$
\ddot{x} \left( t \right) = 0, \hspace{0.75em} \ddot{y} \left( t \right) = 0, \hspace{0.75em} \ddot{z} \left( t \right) = 0,
$$

com soluções
$$
x \left( t \right) = at + b, \hspace{0.75em} y \left( t \right) = ct + d, \hspace{0.75em} z \left( t \right) = et + f,
$$

onde \(a, \hspace{0.3em} b, \hspace{0.3em}c, \hspace{0.3em}d, \hspace{0.3em}e, \hspace{0.3em}f \)
são constantes que podem ser determinadas pelas condições iniciais. Observe que
$$
\vec{r} \left( 0 \right) = \vec{r}_0 = \left( b, \hspace{0.25em} d,
\hspace{0.25em} f \right) \hspace{0.8em} \text{e} \hspace{0.8em} \vec{v} \left( 0 \right) = \vec{v}_0 =
\left( a, \hspace{0.25em} c, \hspace{0.25em} e \right)
$$

são, respectivamente, a posição e a velocidade inicial da partícula.

Para calcular a distância percorrida podemos usar a fórmula do comprimento de arco \(s\), obtida da seguinte forma: para variações infinitesimais do parâmetro \(t\) o arco tem o comprimento infinitesimal
$$
ds^2 = dx^2 + dy^2 + dz^2 = \left[ \left( \frac{dx}{dt} \right)^2 + \left(
\frac{dy}{dt} \right)^2 + \left( \frac{dy}{dt} \right)^2 \right] dt^2
$$

pois cada função coordenada é função de \(t\) apenas e \(dx = \left( dx / dt \right) dt\) , e análogos para \(y\) e \(z\). Para uma varição finita do parâmetro encontramos o comprimento de arco por meio da integral definida
$$
s = \int_{t_1}^{t_2} \sqrt{\dot{x}^2 + \dot{y}^2 + \dot{z}^2} dt,
$$

que é a distância total percorrida pela partícula.

A energia cinética de uma partícula é um escalar, definido como
$$
T = \frac{1}{2} mv^2
$$

onde \(v = \left| \vec{v} \right| = \sqrt{\dot{x}^2 + \dot{y}^2 + \dot{z}^2}\) , enquanto o momento linear de uma partícula é o vetor
$$
\vec{p} = m \vec{v} \mathbf{=} m \left( \dot{x}, \dot{y}, \dot{z} \right) .
$$

Podemos portanto escrever a equação de movimento de Newton como
$$
\vec{F} = \frac{d \vec{p}}{dt},
$$

válida mesmo que a massa não seja uma constante. Para uma partícula de massa constante temos uma relação entre a energia cinética e o
momento que será útil futuramente. Lembrando que \(v^2 =\) \(\vec{v} \mathbf{.} \vec{v} \mathbf{}\) temos que a taxa de variação de \(T\) com o tempo é

$$
\frac{dT}{dt} = \frac{1}{2} m \frac{d}{dt} \left( \vec{v} \mathbf{.}
\vec{v} \right) = m \vec{v} \mathbf{.} \frac{d \vec{v}}{dt} = \vec{v} .
\vec{F} . \label{energiacinetica}
$$
Para um sistema de \(N\) partículas temos que a energia cinética e o momento são as somas
$$
T = \sum_{i = 1}^N \frac{1}{2} m_i v_i^2, \vec{p} = \sum_{i = 1}^N m_i
\vec{v}_i .
$$

Estas definições de energia e momento são motivadas pelo fato experimental de que a soma das energias, cinética e potencial, e o momento são quantidades que se conservam durante a trajetória de uma partícula ou de um sistema de partículas.

Exercícios

  • Faça um esboço da trajetória em \(I \hspace{-4pt} R^2\) descrita em forma paramétrica por
    $$
    \mathbf{x} \left( t \right) = \left( R \cos \omega t, R \textit{sen} \omega t \right)
    $$
    Mostre que a aceleração, neste caso, é sempre perpendicular á velocidade.
  • Faça um esboço da trajetória em \(I \hspace{-4pt} R^3\) descrita em forma paramétrica por
    $$
    \mathbf{x} \left( t \right) = \left( \cos \omega t, \textit{sen} \omega t,
    t \right) .
    $$
  • Encontre o comprimento da trajetória acima de \(t = 0\) até \(t = 1\).

 

Consequências da invariância da velocidade da luz

Teoria da Relatividade Especial

Einstein andando de bicicleta em Santa Barbara, CA, quando estava visitando o EUA. Nessa época Hitler chegou ao poder e Einstein não retornou à Alemanha.

A Teoria da Relatividade de Einstein, tanto em sua versão Especial como Geral, revolucionou a física no início do século XX. Embora boa parte do formalismo matemático necessário já estivessem pronto, a comunidade científica da época não percebeu o significado do trabalho feito por Michelson e Morley, Lorentz, Poincaré e outros.

A teoria não foi imediatamente aceita na comunidade. Por violar diversos conceitos considerados essenciais à teoria clássica ela foi rejeitada, inclusive na própria Alemanha, onde nasceu Einstein, sendo atacada como física judaica. Hoje a teoria é essencial para quase todos as áreas da física, principalmente na pesquisa de ponta que integra a relatividade com a física quântica.


“Após dez anos de reflexões tal princípio emergiu de um paradoxo que eu já tinha antevisto quando tinha 16 anos: se eu perseguir um feixe de luz com a mesma velocidade que uma frente de onda (a velocidade da luz no vácuo) então eu deveria observar este feixe como um campo eletromagnético constante e periódico no espaço. No entanto tal coisa não parece existir, nem com base na experimentação nem de acordo com as equações de Maxwell…” Einstein (1951)“Daqui por diante o espaço e o tempo estão fadados a desaparecer como meras sombras e apenas um tipo de união entre os dois terá preservada sua realidade independente” Minkowski, 1908.“As coisas mais maravilhosas que podemos experimentar são as misteriosas. Elas são a origem de toda verdadeira arte e ciência. Aquele para quem essa sensação é um estranho, aquele que não mais consegue parar para admirar e extasiar-se em veneração, é como se estivesse morto: seus olhos estão fechados.”

Introdução

(1) O Cálculo foi desenvolvido simultâneamente e de forma independente por Leibniz. Muitos outros matemáticos contribuíram para o aperfeiçoamente desta disciplina.

A Mecânica é o ramo da física que estuda a ação das forças sobre os corpos e o comportamento dos sistemas materiais sujeitos à atuação dessas forças. Seus fundamentos foram lançados por Issac Newton no século XVII, apoiado sobre as contribuições de Galileu, Copérnico e Kepler. Para descrever com precisão a teoria recém elaborada Newton desenvolveu o formalismo matemático do Cálculo Diferencial e Integral(1).A mecânica de Newton é baseada em três axiomas fundamentais:

  • A lei da inércia, esboçada previamente por Galileu: um corpo não submetido à ação de forças externas conserva seu estado de repouso ou movimento.
  • Um corpo de massa \(m\) submetido à ação de uma força externa \(\vec{F}\) modifica estado de movimento de acordo com a relação$$\vec{F} = m \vec{a} \mathbf{,} $$onde \(\vec{a}\) é o vetor aceleração deste corpo. A massa é uma constante de proporcionalidade que exprime a relação entre a força aplicada e a aceleração obtida.
  • A lei de ação e reação: todo corpo A, submetido a uma força aplicada por outro corpo B, aplicará sobre o último uma força de mesma intensidade e sentido contrário.
(2) Esse axioma foi questionado e revisto pela Teoria da Relatividade de Einstein.

Três importantes teoremas de conservação são resultantes destes postulados:

  • Todo sistema físico fechado contém uma quantidade de matéria invariante(2), independentemente dos processos que ali ocorrem.
  • Sistemas com simetria linear em alguma direção exibem conservação do momento linear relativo a esta direção. Sistemas isotrópicos, com simetria por rotações em torno de algum eixo exibem conservação do momento angular relativo a este eixo.
  • A energia total em um sistema fechado é constante.

A mecânica de Newton, ou mecânica clássica, é uma teoria testada com alto grau de precisão para uma ampla faixa de experimentos. Ele descreve com excelente prescisão o movimento de bolas de bilhar, automóveis, satélites artificiais e o movimento planetário. Existe, no entanto, diversos fenômenos observados que não se encaixam dentro do panorama clássico, em particular os fenômenos relativos à átomos e moléculas,bem como às partículas subatômicas, e aqueles que envolvem partículas com velocidades muito altas, comparáveis à velocidade daluz. A primeira classe destes fenômenos foi corretamente descrita no finaldo século XIX e início do século XX por meio da Mecânica Quântica. A segunda foi encontrada por Albert Einstein.

Em 1905 Einstein publicou três artigos que revolucionaram a ciência física e abriram novas frentes em pesquisa fundamental. Um deles tratava do movimento browniano, em outro Einstein apresentava uma solução para o problema do efeito fotoelétrico que representou um impulso na formulação da teoria quântica. No terceiro ele apresentava a solução para uma divergência encontrada há algum tempo entre as teorias do eletromagnetismo de Maxwell e a mecânica de Newton. As duas teorias, embora estivessem ambas bem fundamentadas teórica e experimentalmente, não eram compatíveis entre si. Devido a crença profunda de que a teoria de Newton, capaz de descrever com precisão os movimentos observados na experiência diária, estava correta, a comunidade científica preferia manter inalterada a mecânica clássica e buscar por modificações da teoria eletromagnética.

Einstein e Bohr

Einstein, por outro lado, estivera interessado sobre como veria uma frente de onda luminosa se estivesse viajando com ela, na mesma velocidade. Ele compreendeu que a teoria de Maxwell estava correta e que, para altas velocidades quando comparadas à velocidade da luz, a mecânica deveria ser modificada. Desta forma ele desenvolveu a Teoria da Relatividade Especial, que passaremos a designar simplesmente por TRE.

Esta teoria se baseia em uma afirmação fundamental: a velocidade da luz é a mesma para qualquer observador, independentemente de sua velocidade. As consequências disto são curiosas. Um comprimento ao longo da direção do movimento se torna mais curto e relógios em movimento batem mais devagar. Espaço e tempo são aspectos de um mesmo fenômeno. Outro efeito interessante previsto é o de que a massa de um objeto aumenta, tendendo a infinito quando sua velocidade se aproxima da velocidade da luz. Este fenômeno é observado, por exemplo, dentro de um acelerador de partículas. Einstein mostrou ainda que matéria e energia são dois aspectos de uma mesmo princípio, podendo ser transformadas uma na outra, como ocorre dentro de um reator nuclear, de uma bomba de hidrogênio ou no interior de uma estrela.

A descoberta da teoria da relatividade não implica em que a teoria de Newton está incorreta. Pelo contrário, as equações clássicas do movimento estão contidas nas equações relativísticas como um caso particular, em situações onde as velocidades envolvidas são pequenas quando comparadas à velocidade da luz. Elas descrevem corretamente, ou com excelente aproximação, os fenômenos que ocorrem no cotidiano. Para o movimento em altas velocidades, tais como o que acontece dentro dos aceleradores de partículas, nas partículas cósmicas que atingem a atmosfera da Terra ou no interior de estrelas superquentes torna-se necessário usar a TRE que, sob estas condições, tem sido testada em inúmeros experimentos, com grande grau de precisão.

Fundamentos Históricos da TRE

Linguagem de Scripts para Linux


Introdução ao BASH

Para interagir com o seu sistema operacional (no nosso caso o Linux) você pode usar interfaces gráficas ou GUI (graphic user interfaceem>, as famosas janelas) ou rodar um programa que permite que os comandos sejam inseridos um a um através de linhas de comando (command line interfaces, CLIs). Existem vários destes programas (ou Shells) mas trataremos aqui de bash (Bourne Again SHell, uma versão muito usada e já instalada na maioria das distribuições linux.

Muitas vezes, quando você usa um computador, uma tarefa pode ser realizada mais facilmente através de um comando de linha, escrito em um terminal. Por exemplo, suponha que queremos obter em um texto toda a lista de músicas que se encontram no diretório (ou pasta). Uma forma de fazer isto seria a seguinte:

Abra o terminal e digite

$ cd ~/Musica
$ ls > minhas_musicas.txt

(1) Listas de comandos podem ser encontradas em Site: SS64 ou Linux commands.

Faça suas experiências com os comandos de linha com cuidado. Nunca execute um comando cuja ação você desconhece. Embora seja difícil que um uusário sem permissão de surperusuário ou admnistrador faça grandes estragos no sistema, você pode apagar dados ou corromper programas instalados dentro de sua conta. Não se esqueça: faça sempre cópias de segurança!

Nestes exemplos $ é o prompt de comandos, a indicação de que o computador está pronto para receber instruções. O comando cd troca o foco da execução para o diretório ~/Musica, onde ~ é um atalho para representar a pasta do usuário, (home/usr). A segunda linha faz uma listagem de todos os arquivos usando ls (list screen) e, ao invés de exibí-los na tela, (devido ao sinal > ou pipe, redirecionador) envia esta lista para um arquivo de nome minhas_musicas.txt. Poderíamos ainda filtrar a lista usando ls *.mp3, e apenas os arquivos com extensão mp3 seriam listados1.

Observe agora que a Shell permite comandos encadeados ou seja, a entrada de vários comandos de uma só vez. É possível inclusive passar resultados de um comando para outro em um único passo. Para fazer isto escrevemos os comandos na mesma linha e os separamos por um ponto e vírgula (;):

$ cd ~/Musica; ls > minhas_musicas.txt

Essa linha efetuará o mesmo que as duas linhas do exemplo anterior. Para ver o conteúdo no novo arquivo criado digite gedit minhas_musicas.txt ou clique no arquivo de dentro de um gerenciador de arquivos como o Nautilus ou Thunar. Também é possível listar o arquivo de caracteres usando o comando cat minhas_musicas.txt.

Com esta técnica você pode escrever linhas com até 255 caracteres. Se uma sequência de ações for usada com frequência pode ser útil gravá-la em um arquivo, que depois pode ser executado quando necessário. Para isto use um editor qualquer que possa gravar arquivos como uma sequência simples de caracteres ASCII (isto quer dizer: sem comandos de formatação). O Ubuntu (e várias outras distribuições) traz o gedit ou kate (na distribuição KDE). Você também pode usar o geany, bluefish ou outro qualquer de sua escolha.

Uma lista de comandos gravada em um arquivo executável é chamada de script. Para especificar que se trata de um shell script colocamos na primeira linha a seguinte informação:

#!/bin/bash

O sinal de sustenido (#) em uma linha qualquer (exceto na primeira linha) é usado para indicar um comentário, um trecho que não é executado pela shell. Na primeira linha ele possui um significado especial: #! indica que o arquivo a seguir deverá ser executado pela bash shell fornecendo o caminho onde bash está instalado (normalmente em /bin/bash). Outros comandos, a serem executados na ordem em que se encontram, podem ser inseridos em linhas sucessivas. Você ainda pode usar o ponto e vírgula para separar comandos na mesma linha mas, em um script isto não é necessário nem recomendado. É mais fácil ler e compreender scripts onde cada linha contém um único comando.

O seguinte exemplo ilustra o conceito:

#!/bin/bash
# Esta linha é um comentário e não é executada
# Primeiro faça uma lista de músicas (mp3 e wav)
cd ~/Musica
ls *.mp3 > MusicasMp3
ls *.wav > ArquivosWav
# Faça uma lista de livros no formato pdf, na pasta ~/Livros
cd ~/Livros
ls *.pdf > LivrosEmPdf

Evidentemente estas linhas supõem a existências das pastas ~/Musicas e ~/Livros caso contrário uma mensagem de erro será exibida. Comentários são úteis para tornar mais legíveis os scripts, principalmente para o caso de outro usuário (ou você mesmo, no futuro) utilizar o script. Grave seu script com o nome lista_arquivos em uma pasta /.scripts (ou outro nome de sua preferência). Para executar esse script podemos digitar:

# se você já está na pasta scripts:
$ ./lista_arquivos
# se você não está na pasta scripts:
$ ~/.scripts/lista_arquivos

Alternativamente, para que um script seja encontrado a partir de qualquer outro diretório é necessário informar à shell como encontrá-lo. A shell usa uma “variável de ambiente” ( environment variable) chamada PATH para localizar onde estão os arquivos a serem executados. Para compreender isto melhor abra um terminal e digite:

$ echo $PATH
/usr/local/bin:/usr/bin:/bin

A segunda linha é a resposta (ou output) do comando echo, destinado a exibir informações, indicando que neste computador a shell fará uma busca nos diretórios /usr/local/bin, /usr/bin e /bin quando um comando for emitido. Observe que nossa pasta de scripts não está incluída. Para que o arquivo lista_arquivos seja executado podemos acrescentar a pasta onde ele reside ao PATH:

PATH=$PATH:/.scripts
$ echo $PATH
/usr/local/bin:/usr/bin:/bin: /.scripts

(2) Lembrando:

. Atalho para o diretório atual
cd ~ Para diretório home.
cd .. Volta para o dir pai

Observe que PATH contém agora a pasta /.scriptscode>. Esta alteração, no entanto, permanece válida apenas durante a sessão do terminal, ou dentro do arquivo de script de onde ela foi emitida. Veremos depois como alterar de forma permanente esta variável.

O ponto2, na primeira linha não comentada, é uma referência ao diretório atual, neste caso /.scripts. O til na outra linha, como já vimos, é um atalho para a pasta do usuário, o mesmo que /home/nome_do_usuário.

O último passo consiste em tornar este arquivo um executável. Para isto use o comando chmod (change mode):

$ chmod u+x teste1
# agora você pode executar o arquivo teste1
$ ./teste1

Se você procurar nas pastas ~/Musicas e ~/Livros deverá encontrar os arquivos recentemente gravados com o conteúdo esperado! O sistema de permissões do Linux (diretamente copiado do Unix) constitui uma das grandes vantagens deste sistema operacional. Por causa dele um usuário só pode alterar arquivos de sua propriedade enquanto arquivos de sistema só podem ser alterados pelo superuser ou gerente do sistema. Mesmo em seu próprio computador você não faz (ou pelo menos, não deve fazer) login como superuser.

Para alterar o PATH de modo definitivo você pode usar os seguintes procedimentos: primeiro verifique seu caminho atual usando o comando: $ echo $PATH. Para alterar a variável PATH para todos os usuários do sistema edite o arquivo /etc/profile (como root) e modifique a linha que começa com "PATH =".

sudo gedit /etc/profile
# forneça seu password
# procure a definição de PATH e edite para: PATH = "$PATH: $HOME/.scripts

(3) O ponto (.) como primeiro caracter do nome do arquivo .bash_profile ou indica que este é um arquivo oculto, um arquivo que não aparece normalmente em listagens requisitadas com o comando ls nem dentro do gerenciador de arquivos. Para listar arquivos ocultos use ls -a ou pressione Ctrl-H de dentro do Nautilus ou do Thunar (ou outro gerenciador de arquivos). Diretórios também podem ser ocultos da mesma forma.

(4) Segundo o manual online de bash (man pages) o arquivo .bash_profile é executado quando o usuário faz login em uma shell. Se você já está logado e abre uma janela de terminal (por exemplo) o arquivo .bashrc é executado.

Para alterar o PATH de um único usuário edite o arquivo /home/nome_do_usuario/.bash_profile ou .bashrc(Veja nota4). A especificação para o caminho no /etc/.bash_profile, ou /etc/.bashrc, é análoga ao caso anterior. Agora você não precisa usar sudo pois o arquivo é de sua propriedade e você tem permissão para alterá-lo.

gedit /etc/.bash_profile
# forneça seu password
# procure a definição de PATH e edite para: PATH = "$PATH: $HOME/scripts
export PATH

A linha de comando PATH = "$PATH: $HOME/scripts pega o conteúdo da variável de ambiente PATH já definida para todos os usuários no arquivo /etc/profile, e acrescenta a ela o nome do diretório $HOME/scripts (ou qualquer outro que você queira incluir). O comando export na última linha serve para que a variável fique visível fora do script onde ela foi definida.

Recapitulando: Para escrever um arquivo executável você dever informar em seu cabeçalho quem o executará (#!/bin/bash no caso de bash, #!/bin/env python no caso de um script Python, etc.Depois você deverá informar o caminho completo para a sua execução ou colocar o diretório onde seu script está na variável path. Finalmente você deve torná-lo um executável com chmod.

Para saber um pouco mais sobre as permissões5 de um arquivo vamos executar o comando ls -l, onde -l é uma chave (opção) para exibir permissões:

$ ls -l teste1
 -rwxr-xr-- 1
 usuario_1 grupo_1 227 Jun 8 21:22
teste1

(5) Permissões:

r permissão para leitura(read)
w permissão para escrever (write)
x permissão para executar (execute)
- substitui r, w, x se a permissão é negada

As permissões são listadas por meio de 9 caracteres: o primeiro indica o tipo do arquivo (d, se é um diretório, l para links e para arquivos comuns. Em seguido temos 3 grupos formados por 3 letras r, w, x (veja tabela) que se referem ao dono do arquivo (o usuário que o criou), ao grupo a que este usuário pertence, e aos demais usuários do computador ou rede. No exemplo acima teste1 é um arquivo () pertencente à usuario_1, grupo_1. O dono pode ler, escrever (gravar) e executar (rwx), usuários do grupo podem ler e executar (r-x) mas não modificar este arquivo, e os demais usuários podem apenas ler (r–).

Exibindo valores e resultados

Para exibir o valor da variável PATH, uma variável do sistema estabelecida durante o boot, usamos o comando echo $PATH. Também podemos usar echo para exibir mensagens de textos:

$ echo Uma mensagem para seu usuario ...
 Uma mensagem para seu usuario ...
$ echo # pula uma linha
$ echo "Um texto pode ser delimitado por aspas duplas ou simples"
Um texto pode ser delimitado por aspas duplas ou simples
$ echo ou ate mesmo aparecer sem nenhuma aspas ou ate mesmo aparecer sem nenhuma aspas

Observe que não é obrigatório o uso de aspas embora, para alguns usuários, pode ser mais claro ler programas onde as strings estejam delimitadas. Mensagens são úteis em um script, por exemplo, para passar informações sobre o funcionamento ou requisitar a digitação de algum dado.

echo "Os seguintes usuarios estao logados no sistema:"
who

O comando who exibe todos os usuários logados no momento. Para exibir uma informação sem trocar de linha usamos o parâmetro -n.

echo -n "Hoje e: " 	date
# O script acima exibe algo como: 	Hoje e: Wed Jun 22 11:29:23 BRT 2011

Porque estamos falhando no ensino de Matemática?

Neste artigo pretendo analisar os motivos pelos quais o ensino das ciências exatas, em particular a matemática, enfrenta dificuldades, propondo algumas correções e sugerindo o debate em torno do assunto.

Minha afirmação de que há um problema com o ensino destas disciplinas não é o resultado de uma pesquisa aprofundada entre professores e egressos dos bancos escolares. Ela simplesmente vem da experiência em sala de aula e da constatação da dificuldade com que os alunos de cursos superiores, especialmente nos períodos iniciais, enfrentam ao cursar disciplinas tais como matemática e física, e a claríssima falta de formação apresentada por eles. A isto acrescento o argumento de que pessoas adultas, mesmo com curso superior completo em área do conhecimento que não em ciências exatas, muito pouco ou quase nada retém como conhecimento assimilado do conteúdo supostamente ministrado durante as fases de ensino básico e médio. É comum ouvir as pessoas reclamarem de que sofreram muito em seus cursos de matemática e física e, se pouco ficou retido ou acumulado como conhecimento adquirido, resta perguntar: para que todo este sofrimento?

Esta não pretende ser uma crítica aos colegas professores, em suas abordagens particulares do tema em sala de aula, e nem ao aluno que tem dificuldades no aprendizado. Pelo contrário, acredito que existem erros estruturais na abordagem de ensino e que é possível adotar rumos mais eficientes. Defendo que é possível alcançar níveis acadêmicos muito superiores aos atuais e, por isto, proponho um debate sobre como obtê-los. Para tanto separei a discussão em tópicos, consciente de que estes são interligados e se afetam mutuamente.

  • Investimentos insuficientes na educação longo da história do pais.
  • Educação familiar deficiente e excessiva dependência da escola na educação básica das crianças.
  • Escolha infeliz de tópicos na construção de ementas para o ensino básico e médio. Abordagem incompleta da matemática moderna.
  • Gap de gerações, principalmente devido à informatização.

Investimentos na educação insuficientes ao longo da história do pais

Este tópico afeta a educação de forma abrangente e não apenas o ensino de matemática. É evidente que se gasta muito pouco com educação no Brasil. Ensino de boa qualidade custa caro principalmente com remuneração de pessoal qualificado, aquisição de boas instalações e equipamento para laboratórios, computadores, ferramentas auxiliares de exposição e material de apoio. No entanto existe boa convergência entre os analistas de que este gasto é certamente o investimento de melhor retorno que pode fazer uma nação.

Em primeiro lugar há o desestímulo que existe para que uma pessoa abrace a carreira de professor, sabendo que estará submetida a condições de trabalho impróprias e salários defasados em relação as outras profissões. Hoje é bem conhecida a recusa dos jovens em se preparar para o trabalho em sala de aula e consequente falência de inúmeros cursos de licenciatura em ciências exatas nos diversos estados. Cada vez mais os cursos de licenciatura se tornam menos atraentes para os alunos de melhor formação básica. A própria forma de se encarar um curso de licenciatura é sintomática de um problema: alunos que se preparam para o ensino são frequentemente tratados como alunos de segunda classe e recebem apoio e estímulo inferior ao que se dá a seus colegas de bacharelado. Além disso os cursos são de menor duração, sendo realizados em apenas três anos, tempo insuficiente para criar uma base sólida de conhecimento na disciplina específica escolhida e, ao mesmo tempo, em pedagogia. A maioria dos alunos de licenciatura, especialmente nas escolas particulares, frequenta cursos noturnos e trabalha durante o dia, muitas vezes em regime de tempo integral, o que torna impossível para eles uma assimilação mínima do conteúdo. São estes alunos, formados de modo mediano, que compõem o quadro do professorado brasileiro atual, sem mencionar uma grande quantidade de professores sem formação específica nas disciplinas que lecionam.

Como ilustração, considere os níveis mais básicos da escola, oferecidos para as crianças mais jovens. Neste setor do ensino estão os professores com piores remunerações e com formação mais inadequada e insuficiente. As professoras ou “tias” são quase sempre pouco mais que “babás”, à despeito de uma “proposta pedagógica” elegante e bem elaborada que a escola certamente possui e guarda orgulhosa em seus arquivos e que estas professoras desconhecem ou não compreendem. Os estudos mais modernos sobre o desenvolvimento da cognição humana mostram que os anos iniciais de uma criança são marcados por um aprendizado rápido e intenso. Esta é a fase em que toda a base educacional, além do próprio caráter do indivíduo, é construída. Não me parece portanto apropriado entregar às pessoas com menor nível de formação as crianças em sua fase de maior potencialidade.

Reconhecidas as exceções das pessoas mais dedicadas que, por gosto ao ensino ou pela disciplina que ministra, procuram complementar sua formação, pode-se constatar uma formação acadêmica insuficiente nos profissionais do ensino e um apoio à educação continuada muito reduzido. Isto torna difícil uma reformulação de currículos e conteúdos programáticos que é necessária, como pretendo enfatizar.

Muitos outros fatores contribuem para a desestruturação da escola, entre eles a imposição oficial de propostas elegantes e pouco práticas que se alternam e se substituem em ritmo demasiado rápido para que mesmo um professor mais atento se mantenha familiarizado com elas.

Há um aspecto político importante associado a este problema. É muito evidente que o Brasil representa mundialmente apenas um mercado consumidor e que não precisa fazer um grande esforço para se manter atualizado com a rápida evolução científica e tecnológica mundial. O pais produz hoje um número reduzido de artigos e registros de patentes, em comparação com outras nações do mesmo porte. Este conceito, que parece dominar a elite dirigente, infelizmente está incorporado visceralmente pelas famílias e pelos próprios alunos que não assistem de perto à evolução tecnológica e que estão habituados simplesmente a comprar tecnologia pronta, assim como faz o próprio pais. A resistência contra o atingimento ou manutenção de ensino em nível elevado parte também destes alunos que não encontram motivos para se esforçar, tendo em vista um mercado de trabalho que parece valorizar pouco o desempenho acadêmico.
sala de aula

Dentro de um panorama de multi nacionalização irreversível, o esforço para obter bom nível de ensino representa um ato de resistência política, uma luta contra a incorporação de nosso pais que, se envolto pela globalização sem o devido preparo, será engolido e destruído, simplesmente.

Educação familiar deficiente e excessiva dependência da escola na educação básica dos jovens

Outro ponto importante fica explícito na queixa frequente, por parte dos mestres, de que os alunos não recebem uma educação básica em seus núcleos familiares, enquanto os pais exigem muito da escola na reposição desta carência. A “falta de educação” se reflete em relações interpessoais difíceis em sala de aula, com alunos agredindo verbalmente e até fisicamente seus professores que não contam com o apoio da escola, da família ou da própria sociedade e, com toda razão, sentem-se acuados. Esta característica é realimentada pela deficiência técnica dos professores que acabam por não impor respeito a seus alunos por pura e simples falta de boa formação técnica. A comum identificar uma situação em sala de aula onde o professor inseguro de suas respostas prefere adotar a postura de não tratar das perguntas feitas ou respondê-las de forma incorreta. O professor que não tem uma visão ampla do tema que leciona fecha as portas da curiosidade que leva ao aprofundamento e à pesquisa e não engaja o estudante em uma relação de respeito e cordialidade.

Escolha infeliz de tópicos na construção de ementas para o ensino básico e médio. Abordagem incompleta da matemática moderna.

Um ponto que considero ser um entrave para a boa evolução do ensino das ciências exatas está na escolha de tópicos e construção de ementas e grades curriculares. Como professor do ensino superior considero necessária uma reformulação destas ementas. Muitas vezes, em minha experiência em sala de aula, ouvi alunos, pais e até mesmo professores de matemática e pedagogos atribuírem a culpa da queda na qualidade do ensino à adoção da chamada matemática moderna. Estas pessoas costumam afirmar que antigamente os alunos aprendiam a fazer contas e que podiam memorizar com mais eficiência os tópicos elaborados pelo professor. Também é comum ouvir os pais reclamarem que não conhecem esta matemática e, por isto, não podem ajudar seus filhos no processo de aprendizagem.

(1) Entre eles estavam Henry Cartan, Jean Diedonné e André Weyl, no grupo inicial, que se inspirou nos avanços da escola alemã, representada por exemplo, por David Hilbert e Emily Noether. Mais tarde verificamos entre eles a presença de Serge Lang, Laurent Schwartz e vários outros.A história do grupo é fascinante e pode ser lida com algum detalhe no artigo sobre a História do Cálculo, neste site.

Este tema exige uma consideração mais detalhada. A matemática moderna é a designação que se dá a uma reforma do ensino e da própria compreensão da matemática ocorrido na França em torno de 1935 e anos seguintes e que desembarcou no Brasil na década de 1960. Havia naquela época, em toda a Europa, uma carência de professores experientes e com maior titulação, uma vez que muitos haviam morrido durante a primeira guerra mundial. Um grupo de jovens professores se reuniu para criticar os livros didáticos existentes, iniciando pelo livro adotado para o cálculo, e resolveu reescrever textos didáticos imprimindo neles uma maior organização lógica e didática. Os textos eram publicados pelo grupo sob o pseudônimo de Nicholas Bourbaki, um personagem fictício, adotado apenas como brincadeira e para indicar que o resultado era o esforço de um grupo. Mais tarde muitos dos participantes daquela iniciativa mostraram ser grandes matemáticos(1). Estes professores se reuniam e discutiam extensamente todas as contribuições oferecidas e os textos eram reescritos diversas vezes até se encaixarem plenamente dentro da proposta do grupo. Resumidamente o grupo Borbaki considerou que a matemática deveria ser baseada sobre a teoria dos conjuntos e que deveria manter, ao longo do processo de ensino, rigor lógico e simplicidade. Para isto criaram uma nova terminologia e reformularam conceitos ao longo dos tempos.

Congresso Bourbaki em 1939: Simone Weil, Charles Pisot, Andre Weil, Jean Dieudonné, Claude Chabauty, Charles Ehresmann, Jean Delsarte.

Aos poucos a reforma proposta por Bourbaki se instalou na educação francesa e depois se espalhou para todo o mundo. Naquela época era muito comum que matemáticos brasileiros buscassem na França sua titulação mais avançada, de forma que esta reforma logo se instalou no Brasil. O grupo Bourbaki recebeu também muitas críticas, as principais se referindo à ausência de um tratamento mais completo, sob forma de algoritmos, para a solução de problemas e uma supervalorização da álgebra em detrimento do pensamento geométrico. Muito foi dito sobre a ausência de figuras nos textos do grupo.

Embora aceite a afirmação de que não podemos simplesmente copiar uma iniciativa feita há quase um século, defendo aqui que a proposta básica de Bourbaki está correta e que a matemática deve ser inteiramente construída sob a noção básica de conjuntos. Afinal, a matemática é de fato um estudo sobre conjuntos e as relações entre eles. A reforma proposta pelo grupo francês não foi inadequada mas incompleta ou implementada de modo incompleto entre nós. Os alunos modernos deveriam assimilar os conceitos lógicos da matemática e, de posse destes, aprender a resolver problemas, que podem ser de natureza pragmática e aplicada sempre que possível, sem detrimento da formação mais abstrata e teórica. Considerações geométricas podem e devem ser usadas amplamente, assim como a contextualização do conteúdo e aplicação em problemas cotidianos, sempre que aplicável. Além disto, em uma época dos computadores e calculadoras de baixo custo e alta eficiência, não faz sentido sobrecarregar os alunos com operações complicadas e sofridas embora, claro, todos necessitem conhecer os procedimentos ou algorítimos usados para realizar as operação básicas.

Considero que a escolha de tópicos e níveis de abordagens do conteúdo das séries básica e média é inapropriada e ineficaz e necessita de ampla reformulação. A consideração sobre conjuntos deve ser mantida e ampliada. Relações entre conjuntos e membros dos conjuntos devem ser exploradas a cada passo, as operações fundamentais devem ser apresentadas neste contexto. O ensino da matemática em seus níveis mais básicos e fundamentais deve buscar a construção do pensamento lógico, da construção conceitual. Sendo impossível prever quais, entre todos os alunos, buscarão os níveis superiores das ciências exatas, é necessário ter uma cobertura flexível que permita o avanço dos mais inclinados a isto, sem submeter a totalidade dos alunos à exigência da obtenção de competências inatingíveis.

Gap de gerações

A meu ver existe uma dificuldade referente ao ensino que ultrapassa de longe as barreiras nacionais e não é exclusividade de nosso pais. Ela pode ser sentida em sala de aula, quando um professor mal treinado tenta ensinar “informática” para seus alunos pedindo que cliquem em um determinado ícone, ou arrastem, ou copiem e colem textos e imagens. Enquanto o professor termina seu duplo clique os alunos já se conectaram com os amigos em salas de bate papo, já enviaram seus textos repletos de abreviações assassinas da língua portuguesa, já editaram a imagem de uma colega inserindo-a em uma foto sensual e, com um pouco de sorte (ou azar!) algum aluno mais qualificado já invadiu o site de uma grande empresa e deixou lá um recado atrevido.

Existem estudos que mostram que a distância entre gerações pode ser sentida cada vez para diferenças de idade menores. Um aluno jovem hoje se senta para fazer a lição de casa com a televisão ligada, ouvindo música e falando com os amigos em salas de relacionamentos. E ele (ou ela) consegue fazer isto! A informática e a ampliação da disponibilidade da informação por meio da internet estão transformando o mundo de uma forma difícil de assimilar para as gerações com formação consolidada, entre eles pais e professores.

Hoje faz muito pouco sentido, ou talvez nenhum, pedir um trabalho escrito para os alunos, a menos que o professor seja versado em mecanismos de buscas e esteja disposto a passar a madrugada procurando as fontes de onde foram retirados os trabalhos e verificar se eles apresentam alguma criação do aluno ou apenas demostram capacidade de “copiar e colar”. Além de tomar iniciativas primárias (como a de proibir a wikipedia) é necessário aprender a usar a informática a favor da educação. Muitos alunos conseguem adquirir habilidades novas e extraordinárias através da internet, coisas tais como usar um software de edição de imagens ou vídeos ou até mesmo aprender a tocar um instrumento musical.

(2) Por exemplo o uso de softwares algébricos, tais como Mathematica, Maple ou Sage nos cursos de Cálculo não é simples e não foi ainda satisfatoriamente elaborado.Outra escolha interessante é o site Wolfram Alpha.

É claro que o uso do computador, estando em rede ou não, será parte integrante da vida das pessoas no mundo civilizado, e cada vez mais presente. Será preciso então incorporá-lo ao dia a dia das escolas de forma efetiva. Necessário será reconhecer que a plena utilização do computador como ferramenta didática não é plenamente conhecida e muitas iniciativas não apresentaram os resultados esperados(2). Defendo que os alunos devem ter uma informação básica em computação e que deveriam, pelo menos, conhecer os fundamentos da programação. O uso de uma máquina complicada, seja o computador ou outra qualquer, sem a menor noção de seu funcionamento favorece a formação de uma visão obscurantista da sociedade em que vivemos.

Gráfico gerado pelo software algébrico Sage

Nos dias atuais um indivíduo chega em casa e acende uma lâmpada cujo funcionamento só pode ser razoavelmente compreendido em termos de física quântica. Ele uso relógios e telefones onde os elétrons tunelam (atravessam) barreiras clássicas e, se ficar doente, pode fazer uso de um PET (positron emission technology), um aparelho que usa antimatéria (no caso o pósitron ou anti-elétron) para fazer um mapeamento minucioso e em camadas de seu corpo e órgãos internos.

É evidente que não se pode esperar que todos conheçam todos os ramos do conhecimento, mas é desejável que todos tenham uma boa noção sobre o funcionamento dos aparelhos e tecnologias que usam. Caso contrário estaremos usando caixas pretas ou “mágica” no sentido proposto pela terceira lei de Clarke-Asimov: “Qualquer tecnologia suficientemente avançada é indistinguível da magia”.

Aliás, vivemos já em um momento estranho da história da civilização, em que ciência e tecnologia avançada convivem com a miséria e a ignorância. É claro que este problema tem como causa maior a desigualdade na divisão de recursos em todo o planeta, que gera bolsões de extrema pobreza e ignorância. Mas mesmo entre as pessoas e sociedades mais favorecidas persiste e até floresce o obscurantismo sob forma de conservadorismo, de religiões fundamentalistas e outras mazelas do espírito humano desinformado, e de superstição pura e simples. Já há alguns séculos na história humana é impossível que uma pessoa domine todas as áreas do conhecimento. Isto torna ainda mais relevante a escolha de tópicos essenciais que devem prevalecer no esforço educacional. Caso contrário teremos um novo período de trevas em que poucos cientistas e técnicos, geralmente sob o jugo forte do poder econômico, ditarão a forma de vida dos cidadãos comuns, meros consumidores e espectadores do progresso e da evolução.

Para que serve a Matemática?


Os professores de matemática hoje se deparam com uma tarefa difícil: a motivação de seus alunos para os tópicos mais áridos desta ciência. Este problema tem diversas causas que vão desde os problemas com a qualidade geral do ensino até, por exemplo, a crença de que “está tudo pronto”, de que nada mais resta a desenvolver ou a descobrir. É comum ouvir reclamações de que um determinado cálculo pode ser realizado rapidamente em um computador e que, portanto, não seria necessário aprender a utilizar aquela técnica. No entanto sabemos que a tecnologia progride a passos rápidos e que o volume de artigos e novas idéias científicas nunca foi tão grande como hoje. Por isto, procurando contribuir para um melhor entendimento de nosso propósito como professores e estudantes de matemática, me proponho perguntar: por que devemos estudar matemática? Para que serve, afinal, a matemática?


Em primeiro lugar a matemática serve para descrever o mundo de uma forma rigorosa e precisa. Ela é uma linguagem, uma parte essencial na formação de modelos. Um modelo é um conjunto de definições e conceitos que busca descrever de maneira tão completa e fidedigna quanto possível o mundo natural ou uma parte dele, ou ainda processos artificiais criados pela crescente complexidade dos relacionamentos humanos. Esses modelos, além de serem tão completos quanto possível e possuírem coerência lógica, devem ser testados, comparados com o sistema real que ele pretende descrever por meio da observação ou da experimentação. Em caso de disparidades entre a descrição e a observação empírica o modelo deverá ser refeito e aperfeiçoado, ou mesmo abandonado se necessário.

Modelos são representações e não o objeto ou sistema de objetos descritos. Eles podem ser muito simples, como o modelo que representa o conjunto dos números naturais, {1, 2, 3, …}. Estes números foram usados, entre outras coisas, para contar quantas cabeças de gado um homem primitivo tinha e como ele poderia troca-las por alimentos ou outros bens. Nesta contagem ele pode ter usado pedrinhas (daí a palavra cálculo) para representar seus animais, estabelecendo uma relação biunívoca entre animais e pedras. Se possuía menos que uma dezena de bois e vacas, é possível que tenha usado apenas os dedos das mãos (de onde surgiu a palavra dígito). Embora simples este modelo não é trivial. É possível representar com um número natural quantos grãos de areia existem na Terra? (A resposta é sim!) E, principalmente, este modelo é incompleto.

Se pretendermos que nossas negociações incluam dívidas (e, como consequência, o calote!) teremos que expandir o modelo de forma a abarcar os números negativos e o zero, resultando no conjunto dos inteiros. O conjunto dos inteiros é ainda menos óbvio e mais abstrato que o dos naturais pois não temos conhecimento de alguma coisa concreta que exista em quantidades negativas! E mesmo este novo conjunto não é completo e não suficiente. Se quisermos oferecer como parte dos negócios uma fração de um terreno ou um pedaço de um queijo gigante teremos que ampliar o conjunto dos inteiros para outro conjunto que contenha frações, o conjunto dos racionais.


Esse parece agora ser um conjunto bem bonito e completo, o conjunto dos racionais, não tivessem os gregos descoberto que alguns números importantes não se encaixam dentro deles. A diagonal de um quadrado cujos lados medem um (em qualquer sistema de unidades) não é um racional e nem a razão entre a circunferência e o raio de um círculo (igual a 2 pi) não são números racionais. A experiência e a necessidade de descrever coisas pedem um modelo mais amplo. Por isto surgiram os irracionais, os números que não podem ser postos sob forma de uma fração. Racionais e irracionais, juntos, formam o conjunto dos números reais.

Estamos agora, a esta altura do desenvolvimento dos modelos matemáticos, muito longe dos conceitos intuitivos e primários. O conjunto dos números reais possui propriedades intrigantes e muito pouco óbvias. Entre dois números reais quaisquer existe uma infinidade de outros reais. Sua representação gráfica, a reta real, é infinita em ambas as direções e os pontos se empacotam de forma perfeita sem deixar nenhum furo ou imperfeição. O conceito é extremamente poderoso, possui coerência lógica e serve como modelo para a descrição de grande quantidade de objetos do mundo real. No entanto, não é tão claro se existe qualquer objeto no universo real que seja um bom representante desse modelo. Ele é útil para fazer descrições aproximadas de objetos que existem: se medirmos a distância entre duas cidades ou o comprimento de um fio estaremos ignorando, de forma totalmente apropriada e válida, as imperfeições do fio e da estrada que certamente não são contínuos como a reta real. Se ampliarmos com um potente microscópio uma seção do fio, veremos que ele, sendo de metal, é feito de granulações bem organizadas apresentando grandes vãos entre os átomos de sua estrutura. Isto não nos impedirá, no entanto, de usar réguas comuns para medir seu comprimento.

Observamos aqui uma tendência. O conjunto dos reais engloba os racionais, que por sua vez engloba os inteiros, que contém os naturais. O progresso do conhecimento se dá na direção da ampliação dos conceitos e na quebra das antigas barreiras. E, diferente do que se costuma pensar, os conceitos antigos, desde que bem estabelecidos, não são revogados como se revoga uma lei caduca e sim ampliados no que diz respeito a seu domínio de aplicação. Uma observação importante deve ser acrescentada aqui. Neste ponto do desenvolvimento da matemática (e mesmo antes disto, na verdade!), e da civilização humana como um todo, já teremos a necessidade de escolas. Precisaremos tirar as crianças de seus brinquedos e colocá-las em salas de aulas para garantir que o conhecimento acumulado por gerações de estudiosos, teóricos ou pessoas pragmáticas e engenhosas, seja repassado para as novas gerações. E, na medida em que cresce o domínio da ciência e as exigências das aplicações, mais tempo as pessoas deverão se dedicar ao estudo e a preparação para seu desempenho na vida e no ambiente de trabalho. Este é o preço que pagamos por termos descido das árvores e começado a usar ossos como ferramentas, modelar pedras para servir como instrumentos e armas, aprendido a domesticar o fogo.

Os modelos, é claro, passaram a representar objetos de complexidade crescente. Na planilha do engenheiro um prédio é um modelo de equilíbrio de forças onde a matemática permite que os pesos, as tensões no concreto e nos ferros se equilibrem para deixar estável a construção. Podemos descrever como se comporta uma mola mergulhada em um meio viscoso e sujeita a impactos externos, exatamente como existe no sistema de molas e amortecedores de um automóvel. O sistema é simples mas sua descrição completa exige um tópico matemático sofisticado, o das equações diferenciais. Queremos saber como uma corrente de elétrons se move dentro de materiais semicondutores. Para isto precisamos de um modelo bastante elaborado da física, a mecânica quântica. Com ela construímos relógios digitais, computadores e discos rígidos, entre outras máquinas diversas.

Grande parte das pessoas hoje, exceto aqueles excluídos da modernidade pela pobreza, usa direta ou indiretamente um satélite artificial para telecomunicações colocado em órbita geo-estacionária. Esses satélites giram em torno de nosso planeta com uma velocidade tal que parecerá, para um observador fixo na terra ou para a antena de seu receptor de TV, como estacionário em pleno ar. Para colocar um artefato desses em órbita é necessário usar o modelo da gravitação universal criado por Newton e, em alguns casos, será até mesmo necessário fazer correções usando o modelo da relatividade de Albert Einstein. Muita matemática está envolvida e provavelmente computadores sofisticados serão empregados nessas operações.

Exemplos de modelos mais prosaicos, mas igualmente úteis, podem ser encontrados na economia, no estudo das variações de preços dos produtos oferecidos ao consumidor, da inflação, do valor de um depósito feito meses atrás na caderna de poupança ou outra aplicação mais rentável. Modelos análogos serão usados para compreender a disseminação de uma doença, o contágio por um vírus ou a divulgação de um boato. Um modelo pode ser simples, como aquele que descreve os valores disponíveis em uma aplicação bancária com rendimento fixo, ou complicado e extenso como seria o modelo, ainda não desenvolvido, que descreve as oscilações nas bolsas de valores.

Tais modelos são úteis no presente, essenciais para a manutenção da vida moderna, complexa como ela se tornou. Mas eles têm uma habilidade extra: nos permitem prever o futuro. Um bom modelo descreve o que existe hoje e aponta para o que existirá amanhã, mesmo que esta previsão só possa ocorrer em termos probabilísticos, em alguns casos.

Um astrônomo poderá ver hoje em seu telescópio uma grande pedra varrendo o espaço em grande velocidade e decidir, usando os modelos matemáticos à sua disposição, se esta pedra colidirá ou não com nosso planeta. Como exemplo, a colisão do asteróide Shoemaker-Levi com o planeta Júpiter foi prevista com grande antecedência. Um bom modelo estelar será hábil para dizer, supondo conhecidas as condições atuais da estrela, em que estágio de sua evolução ela se encontra e por que etapas passará no futuro. Podemos, é claro, optar por uma visão poética dessa mesma estrela e isto será, sem dúvida, muito bom de se fazer. Mas, teremos perdido a habilidade de descobrir que essa estrela terá um dia esgotado seu combustível nuclear, que explodirá e poderá se tornar um buraco negro.

Finalmente chegamos àquela que considero ser a utilidade mais fina e essencial da matemática. Supridas as necessidades básicas do ser humano, garantida sua sobrevivência, seu anseio pela procriação e preservação da espécie e seu nível mínimo de conforto, a mente se volta para o conhecimento pelo conhecimento. Em um nível mais refinado não tem sentido perguntar para que serve a matemática. Por um lado um teorema serve porque é correto, porque é uma verdade. Por outro lado inúmeras teorias matemáticas foram desenvolvidas de forma puramente acadêmica, ou filosóficas, e muito mais tarde foram usadas em aplicações espetaculares.

Chegamos hoje a um estado de desenvolvimento da civilização onde a diversidade parece ser essencial. Precisamos de técnicos, de mão-de-obra braçal, de teóricos e de filósofos para enfrentar os desafios múltiplos e prementes por que passamos hoje. Um exemplo simples pode ser dado para corroborar esta afirmação: um pouco de ética bastaria para resolver grande parte das mazelas em nosso pais e conflitos pelo mundo afora e, neste sentido, precisamos de cidadãos filósofos. A experiência da história mostra que os povos que fizeram uso puramente pragmático da matemática entraram, ou já estavam, em declínio, enquanto os tempos áureos de qualquer povo, como na Grécia clássica, foram sempre pontuados pela livre investigação em todas as áreas a eles acessíveis, particularmente na matemática.

Vivemos em um período extraordinário da história da civilização. Temos hoje a habilidade para construir modelos científicos que descrevem o universo globalmente, que lançam perguntas sobre sua origem e destino e apontam para suas respostas. Estamos desvendando o código primário da existência humana através do projeto Genoma. Por outro lado, possuímos armas de destruição em massa e o poder para alterar de forma radical o clima no planeta. Os meios de transporte e as telecomunicações estão destruindo as barreiras nacionais e este processo não é suave ou indolor, particularmente para as nações mais pobres e com desenvolvimento tecnológico pouco consolidado.

A inserção em um mundo sem fronteiras exige profissionais de primeira linha, com formação simultaneamente profunda e ampla. Refletir sobre o avanço da ciência e da tecnologia, sobre os problemas que ela resolve e outros que ela causa, e participar deste progresso é essencial para que a sociedade brasileira possa se inserir na cidadania global em nível de igual participação e oportunidade.

O Efeito Placebo

Suponha que você tome um comprimido grande e amargo para uma dor de cabeça, uma depressão ou um problema na pele e verifica que o remédio se mostra eficiente e resolve o seu problema. Mais tarde você descobre que tomou apenas uma pílula inerte, sem nenhum medicamento, composta de farinha ou lactose e algum elemento para dar um gosto amargo. Pronto, você acaba de encontrar o “efeito placebo”.

* Não estou afirmando que a acunpuntura seja apenas um placebo. Simplesmente não tenho essa informação.

A experiência clínica indica, que quanto maior o comprimido e quanto mais amargo, maior será seu efeito. Comprimidos grandes, triangulares ou de cores intensas funcionam melhor que pílulas pequenas, de formato comum e sem cor. Tratamentos complexos, envolvendo máquinas, correntes elétricas ou aparatos tecnológicos funcionam melhor do que uma simples massagem, a menos que o paciente atribua ao massagista ou terapeuta algum dom ou virtude extraordinária. Placebos podem ser aplicados sob a forma de pílulas, cremes, inalantes, choques elétricos e até aparelhos de ultra som. A acunpuntura*, com agulhas aplicadas em pontos aleatórios, e eletrodos supostamente (mas não de fato) implantados no cérebro também demonstraram ser placebos eficientes. Placebos são importantes até mesmo em relação à substâncias comprovadamente eficazes, sendo que a reação do paciente consciente de que está recebendo uma droga é diferente da reação daquele que recebe a mesma droga sem o saber.

Placebo. Fórmula: farinha de mandioca, açúcar de beterraba e jiló

Uma ampla discussão sobre o uso deliberado do placebo para fins terapéuticos tem ocorrido ao longo dos anos sendo a crítica mais importante baseada na ética questionável da ilusão e engano do paciente. Por outro lado é difícil negar que muitas práticas terapéuticas antigas e outras não tão antigas, hoje consideradas ineficazes, resultaram em benefício de quem procura um médico ou curador.

A expressão “efeito placebo” foi usada originalmente para descrever um engano ou uma ilusão quanto ao uso de medicamentos ou tratamentos médicos diversos. Hoje, e cada vez mais, ela adquire um significado novo e importante, que não pode ser desprezado. O placebo cura e este fato precisa ser estudado e explorado em benefício de quem sofre de alguma forma. Claramente o efeito indica a importância do cérebro e sistema nervoso central para a manutenção da saúde e sua restauração, no caso de doenças. Para designar o efeito contrário ao desejado, quando um placebo causa desconforto e piora do paciente, foi inventada a palavra “nocebo”. A existência de nocebos não faz mais que reafirmar a importância do fenômeno.

Placebos são tão importantes que a pesquisa e a industria farmacéutica, ao investigar o funcionamento de uma nova substância, precisa realizar testes comparativos entre a substância estudada e um placebo, inerte. Este é o procedimento denominado “duplo cego randomizado”, onde uma parte dos pacientes recebe placebo e a outra recebe o medicamento. A palavra “randomizado” vem de random (do inglês) que significa aleatório. A expressão duplo cego significa que nem os aplicadores nem os pacientes podem saber que lote contém a substância em teste uma vez que, como já se sabe, este conhecimento (exatamente por conta do efeito placebo) altera o resultado da pesquisa. Os médicos aplicadores acompanham seus pacientes sem saber se eles estavam sob efeito do medicamento ou do placebo e enviam seus resultados para os pesquisadores. A conclusão final deve ser obtida por meio de um rigoroso estudo estatístico. Talvez seja uma surpresa para muitos saber que alguns medicamentos (os antidepressivos, por exemplo!) funcionam muito pouco acima dos placebos contra os quais foram comparados!

A abordagem “duplo cego” é importante em outros contextos além da pesquisa farmacêutica, por exemplo em contextos que envolvem comportamento e reações humanas. É bem conhecido, por exemplo, o efeito de cura obtido por um médico atencioso que dedica algum tempo simplesmente ouvindo seu paciente e o reconfortando, ou do médico otismista em oposição aquele que praticamente desengana seu paciente, mesmo que involuntariamente. Também as “cirurgias simuladas”, independentemente de sua validade ética, demonstram fazer efeitos sobre os pacientes. Pode até mesmo ocorrer que um paciente passe por um processo de cura mesmo sabendo que está recebendo placebos, embora a crença ou confiança na validade do tratamento seja uma parte essencial deste efeito.

Cabe ainda notar que o efeito tem importância diferente para diferentes doenças e que nem todos os médicos e pesquisadores estão completamente confiantes em seu poder. Por outro lado ele oferece uma “explicação” razoável para algumas curas milagrosas, tratamentos paranormais, poder da prece e de fé, entre outros.

A questão do tratamento estatístico é importante e de difícil compreensão para os leigos na área de pesquisa. Muito pouco adianta uma, duas ou dez pessoas afirmarem que um determinado medicamento é eficaz ou não. A natureza pouco intuitiva de alguns comportamentos estatísticos faz com que seja essencial um tratamento matemático rigoroso.

George Price e o Altruísmo Biológico

O que você faria se, como pesquisador, concluísse que o altruísmo puro e desinteressado não existe embora, por motivo de fé acreditasse e defendesse que ele existe? Até que ponto você levaria seu esforço para ser generoso, mesmo que isto significasse a sua própria derrocada?

Muitas vezes na história da ciência um pensador não recebe em vida o crédito e o reconhecimento merecido. Foi o que ocorreu com o cientista americano George Robert Price. Price foi uma pessoa interessante e controversa, até recentemente pouco conhecida do público em geral. Nascido em 6 de outubro de 1922, se formou em química e trabalhou em áreas diversas, passando pelo Projeto Manhattan, depois pela Bell Labs. Mais tarde trabalhou na IBM onde foi um dos precursores no desenvolvimento de sistemas CAD (computer aided design). Price também contribuiu para o jornalismo científico escrevendo diversos artigos, alguns deles atacando como pseudocientífica a pesquisa em paranormalidade, muito em voga na época. Em torno de 1966 ele foi diagnosticado com câncer na tireoide e passou por uma cirurgia que deixou seu ombro esquerdo parcialmente paralisado e dependente de medicamentos. Price então se mudou para Londres e se envolveu no estudo da genética tentando resolver um problema importante da biologia evolucionária, com consequências importantes para a compreensão do comportamento dos animais e do ser humano. Por que alguns organismos se sacrificam para o benefício de outros organismos?


Anteriormente à descoberta do câncer e a consequente cirurgia, Price sempre fora uma pessoa cética e um ateu convicto. Ele era pouco sensível para com familiares, tendo abandonado esposa e filhas e sua mãe já idosa. Mais tarde, principalmente afetado pela doença e a depressão causada pela tireoide debilitada, ele se converteu ao cristianismo e se dedicou inteiramente a demostrar, por meio do exemplo pessoal, que o altruísmo é possível. De completo cético ele assumiu uma atitude radical fazendo aquilo que acreditava ser a vontade de Deus e supondo que este o proveria com os hormônios necessários. Sua postura de altruísmo radical o levou à pobreza completa que, por sua vez, provocou uma piora no estado de sua doença. Price se suicidou em 6 de janeiro de 1975, totalmente pobre e tomado pela depressão.

Altruísmo biológico

Para compreender o problema que atormentava George Price é necessário saber o que se entende por altruísmo em biologia. O altruísmo ocorre quando qualquer organismo atua de forma a beneficiar outro organismo no que diz respeito à sua saúde ou possibilidade de sobrevivência, em prejuízo para seu próprio bem-estar. Não é necessário que exista intenção, consciente ou não. O altruísmo psicológico, por sua vez, é algo bastante diferente, sendo uma ação que necessariamente involve intenção. Apesar de serem conceitos diversos é cabível discutir se existe conexão entre as duas formas de desprendimento. O cérebro humano, assim como todo o resto de nosso corpo, é o resultado da evolução e da seleção natural. Grande parte de nosso comportamento, atitudes e reações, mesmo aquelas que julgamos serem puramente culturais, são na verdade derivadas de propriedades adquiridas e inseridas ao longo de eras evolutivas em nossas características genéticas.

Pelo processo da seleção natural organismos mais aptos para a sobrevivência, com maior probabilidade, se reproduzirão e gerarão maior número de descendentes. Características biológicas favoráveis para a preservação da espécie incluem a eficiência na obtenção dos recursos para a manutenção da saúde e da vida em si, para escapar de predadores naturais ou superar desafios tais como alterações no meio ambiente e ataques externos de doenças. A habilidade para atrair parceiros do sexo oposto, ou superar competidores neste mesmo processo, também são decisivos para a escolha de quais genes serão replicados ou não. Estas propriedades são passadas adiante para a prole do indivíduo bem sucedido, enquanto características debilitantes levam o indivíduo à morte ou a diminuição de sua capacidade reprodutora. Isto não só seleciona indivíduos dentre os de uma mesma espécie com também estabelece níveis hierárquicos entre espécies diversas. O mecanismo básico de seleção, a “sobrevivência do mais apto”, é uma competição muitas vezes feroz que separa a eficiência da ineficiência.

Apesar da competição predominante na natureza, também são observados atos de altruísmo, de auto-sacrifício de indivíduos ou grupos em relação a outros. Muitos exemplos de altruísmo podem ser observados na natureza: alguns pássaros aceitam chocar ovos que não os seus próprios e indivíduos estéreis ajudam na criação dos filhotes (como ocorre entre abelhas e formigas), abelhas se matam ao ferroar um inimigo para proteger a colônia e pássaros ariscam a própria vida para avisar o bando da aproximação de um falcão. Um caso extremo ocorre com a aranha Stegodyphus cujos filhotes recém nascidos devoram a mãe como estratégia de sobrevivência.

Isto levanta uma questão importante: como pode ter surgido o altruísmo entre seres vivos? Por que alguns organismos se sacrificam em benefício de outros, às vezes até mesmo não-parentes?

Os atos mais comuns e extremos de altruísmo animal são realizados pelos pais, especialmente mães, para com os filhos. Pais e mães criam os filhos em seus ninhos, às vezes em seu próprio corpo, os alimentam com grande custo para si mesmos e se arriscam ao protegê-los dos predadores. Um exemplo disto são as aves que simulam fraqueza para atrair para longe do ninho um predador. Uma ave manca na frente de uma raposa, estendendo uma asa como se estivesse quebrada para atraí-la para longe de seus filhotes, colocando sua própria vida em risco.

Para explorar mais extensamente a natureza do problema do altruísmo, considere uma comunidade onde existem indivíduos altruístas e outros egoístas. Os indivíduos egoístas podem ter sua vida facilitada pelo altruísmo dos demais e ser mais bem sucedidos em sua sobrevivência e reprodução. Com o passar dos tempos a comunidade estará formada principalmente por uma maioria egoísta. Por outro lado, entre dois grupos diferentes, um grupo de altruístas pode ser mais eficiente na estratégia de sobrevivência por estarem em cooperação mútua, enquanto o grupo de egoístas pode dificultar sua própria sobrevivência por meio da competição exacerbada. Este é um caso de conflito em diferentes hierarquias biológicas, coberto pela equação proposta por Price.

Do ponto de vista do gene, de acordo com Haldane, compreender o altruísmo não é tão complicado. Um indivíduo pode perfeitamente sacrificar sua vida para salvar um filho ou um parente, de forma a que este sacrifício represente a perpetuação dos genes que ambos partilham. Neste caso houve um sacrifício para que o gene se beneficiasse.

Nos humanos o altruísmo tem suas raízes no sentimento de empatia que surge quando observamos pessoas em situações de angústia ou emergência. Esta capacidade nos humanos (e mamíferos em geral) está relacionada ao aleitamento pelas mulheres de sua prole. Isso explica porque as mulheres mostram ser, em geral, mais empáticas que os homens. A empatia é estimulada pela oxitocina, um hormônio envolvido no parto e aleitamento. Em experimentos de laboratório humanos de ambos os sexos exibem um aumento em suas respostas empáticas quando se aplica a oxitocina em suas narinas.A oxitocina é produzida pelo hipotálamo e tem a função de promover as contrações musculares uterinas durante o parto e a ejeção do leite na amamentação. Ela é responsável por um aumento no sentimento de empatia, de reconhecimento social, na ligação entre casais, supressão da ansiedade e ampliação do sentimento de uma mãe para com seu filho. Ela também causa a sensação de prazer que uma mãe tem ao dar a luz o seu bebê, quando um pai segura o filho nos braços ou simplesmente quando as pessoas ligadas por afeto se abraçam. Como ocorre com a prolactina, a concentração de oxitocina aumenta depois de uma relação sexual. Por outro lado a carência da oxitocina no organismo está associada à sociopatias e psicopatias.

Após descobrir sua doença e ser operado sem grande sucesso George Price se mudou para Londres e enviou uma carta para William Hamilton, considerado um dos estudiosos da teoria da evolução mas importantes desde Darwin. Nele ele pedia uma cópia de um artigo e informava que estava interessado na questão do altruísmo, se propondo a resolver o problema em aberto. Hamilton, que estava de saída para uma expedição de estudos no Brasil, enviou o artigo requisitado sem dar maior atenção ao pedido uma vez que Price não tinha nenhuma formação em biologia e era um desconhecido na área. No entanto, ao voltar alguns meses depois ele encontrou um texto de Price onde estava apresentada a equação, hoje conhecida como Equação de Price. Esta equação descreve a dinâmica da seleção natural, útil para a compreensão de sistemas de organismos onde existem conflitos entre interesses do gene e do indivíduo ou entre interesses do indivíduo e do grupo. O altruísmo consiste em um exemplo clássico deste conflito.

Quando Price encontrou sua equação ele foi imediatamente se consultar com os biólogos da UCL perguntando se aquilo era uma novidade ou algo já conhecido. E lá descobriu que a equação representava uma novidade e um grande avanço na área. Por isto foi quase imediatamente admitido como professor naquela Universidade, obtendo um local de trabalho e uma bolsa de pesquisa. Ele passou a trabalhar em cooperação com William Hamilton e John Maynard Smith, dois dos maiores teóricos ingleses da biologia evolucionária naquele tempo.

Durante o período em que colaborou com os pesquisadores em biologia ele fez três contribuições importantes: encontrou novo desenvolvimento para o trabalho de W. Hamilton sobre a seleção de parentesco, o que resultou em sua Equação de Price, introduziu com John Maynard Smith o conceito de estratégia evolucionária estável (um conceito central para a teoria dos jogos) e formalizou o Teorema Fundamental de Fischer para a Seleção Natural.


Embora bem sucedido em sua busca e tendo seus artigos mais importantes publicados, Price se afastou do pensamento científico e assumiu uma vida de ascetismo cristão. Obcecado por coincidências numéricas, ele fazia operações matemáticas usando dados de sua própria vida, como datas e números de documentos pessoais, e concluiu dos resultados obtidos que não poderia haver coincidência naqueles números. Em seu entendimento ele estava recebendo uma ordem de Deus para realizar alguma tarefa. Muitos de seus colegas relataram perceber nele, neste período, um comportamento autista e antissocial.

Ao explorar as consequências da equação por ele mesmo desenvolvida Price ficou profundamente impressionado com o fato de que o altruísmo sempre envolvia algum tipo de ganho para o indivíduo ou sua espécie. Parecia não existir altruísmo puro e incondicional. Desapontado, ele resolver mostrar por meio do exemplo pessoal que a teoria poderia ser suplantada pelo esforço e boa vontade humana. Por isso saiu percorrendo as ruas de Londres procurando por pessoas desvalidas, alcoólatras, moradores de rua ou qualquer um que precisasse de apoio, decidido a iniciar um programa radical de interferência altruísta na vida destas pessoas. Ele cedia seu dinheiro, comprava comida e oferecia ajuda para qualquer tipo de problema que aquelas pessoas pudessem ter, ajudando-as inclusive com seus problemas legais ou com a polícia. Com o passar do tempo, Price passou a abrigar os sem-teto em casa sendo obrigado a dormir no laboratório quando sua casa se tornou cheia demais. Esta situação perdurou até que seus próprios recursos se esgotaram e ele se tornou mais um dos destituídos, tendo que morar nas ruas junto com as mesmas pessoas que pretendeu ajudar. Aos poucos ele entrou em um processo de degeneração, desenvolvendo mais uma vez uma forte depressão, em parte causada pela impossibilidade de adquirir os medicamentos necessários. Sua degeneração foi atribuída à interrupção no uso dos medicamentos e à decepção frente à incapacidade de transcender as forças biológicas a atingir o auto-sacrifício e o altruísmo.


George Price morreu completamente pobre e abandonado. Poucas pessoas compareceram a seu enterro, dentre elas alguns companheiros de vida nas ruas, gente que o adorava por ter recebido dele ajuda em momentos de dificuldades. Em meio ao grupo que compareceu ao funeral estavam William Hamilton e John Maynard Smith, em reconhecimento pela sua genialidade. Seu corpo foi enterrado em um túmulo não identificado, no cemitério de St. Pancras em Londres, onde permanece até o presente. Mais tarde suas filhas providenciaram a instalação de uma lápide onde se lê: “Pai, altruísta, amigo. Um cientista brilhante responsável pela equação de Price para a evolução”.

A comunidade científica demorou a perceber o alcance das contribuições de Price, que era uma novidade no campo da abordagem matemática para as questões biológicas. Apesar da importância da fórmula por ele proposta, “a fórmula de covariância aplicada à seleção de grupos”, o próprio Price nunca buscou reconhecimento ou procurou atrair a atenção da comunidade para sua obra. Nas palavras de Hamilton, um pouco antes de morrer “É como se você houvesse descoberto o cálculo e o atirasse em um de seus artigos obscuros sem nunca explicar para as pessoas como ele é útil”. Em 1975 Hamilton escreveu um artigo onde tentava popularizar o tratamento de Price, mas o artigo recebeu pouca atenção e a contribuição original de Price continuou desconhecida. Apenas mais recentemente seu trabalho foi notado e até hoje recebe reconhecimento e atenção.

Referências:

Discussão: George Price e o Altruísmo Biológico

Dimas enviou em 06/09/2013:
Li todo o artigo e conclui que: Parece muito com a politica Brasileira, “politicos “egoístas” se aproveitando do “Povo altruísta”…

Guilherme enviou em 06/09/2013
Dimas, acredito existir uma patologia, algo como a falta de empatia entre pessoas que julgam poder se apropriar de recursos da comunidade. Assim como as escolas atraem pedófilos o setor público, por onde circula o dinheiro, atrai psicopatas desonestos.Eu trocaria a expressão “povo altruísta” por povo desinformado e apático.

Samuel S. Ferreira enviou em 16/10/2013
Olá. Li o teu comentário, compreendo porem discordo. Os politicos não se aprovietam de um povo autruista mais sim ignorante, acomodado e manipulável.

Fátima Bezerra enviou em 16/03/2013
Olá,
Minha curiosidade sobre Jeorge Price despertou quando assisti um filme na TV Futura, comentando sobre a sua vida e as suas pesquisas no campo da biologia. Então pus-me a busca de algo a mais consistente sobre essa figura tão peculiar. Sua vida conturbada, sua inteligência, suas contribuição a ciência faz-nos pensar se estamos aqui para contribuir com nossos genes para melhora e perpetuação da raça humana (altruismo genético) ou se realmente fazemos algo por intenção racional(altruismo psicológico). Pois se tudo estiver em nossas células, somos máquinas maravilhosas e perfeitas, mas sem dúvidas existirão aqueles que com seu egoísmo exacerbado se aproveitarão para impor sua supremacia.

Será que neste caso, a biologia suplantará a sociologia? Um abraço. Fátima Bezerra.

Guilherme enviou em 06/09/2013
Fátima,
me parece que a pergunta mais correta seria: podemos suplantar as tendências biológicas inerentes à condição humana?As forças biológicas, até agora, sempre ou quase sempre suplantaram todas as nossas outras tendências e inclinações. Acho importante reconhecermos que somos bichos e agimos como tais.

Acredito, no entanto, que temos a capacidade para refletir e suplantar algumas destas forças puramente animais. Um exemplo disto está no uso do controle da natalidade, prática hoje amplamente difundida em quase todos os grupos e níveis sociais.

GuilhermeRodinely Sousa enviou em 08/08/2013
Um dos poucos artigos encontrados na internet em língua portuguesa sobre a vida desse homem fantástico chamado George R. Price, que alternou de forma singular entre a genialidade e a mais profunda loucura. Parabéns e muito obrigado.

Samuel de S Ferreira em 16/10/2013

Ola.
Passei a ter interesse pela obra de George R. Price após ver um documentario de tv no Discovery Chanel, assim como vc, e como conclusão me fiz a mesma pergunta será que neste caso, a biologia suplantará a sociologia? Que situação não? A resposta que tenho até o presente momento é para mim desanimadora, é bem mais facil e comum ser bem sucedido ao adotar comportamentos egoistas, não é preciso muita força para isto notar, basta ter espelho.

George R. Price, que figura facinante!

Rafael enviou em 06/11/2013
O Sr. Price era um ateu que se achava um Deus de uma matemática a qual nem ele acreditava.

Guilherme: George Price era inicialmente ateu. Mais tarde, aos 48 anos ele julgou ter passado por uma experiência religiosa e se tornou um fervoroso defensor e estudioso do Novo Testamento. Esta experiência, de acordo com seus biógrafos, se derivou de ele julgar que em sua vida ocorriam um número muito grande de coincidências.

Alessandro enviou em 28/11/2013
para mim é claro que George Price buscou a religião como uma fuga de seu estado doentio e depressivo.

É curioso como, ao perceber que na natureza não existe generosidade (ou se existe é muito rara) ele tenha perdido o controle sobre seus atos. É claro que seus atos de altruísmo foram excessivos e o levaram à falência e, finalmente, à morte.

É possível que a pressão originada em seu estado doentio tenha contribuído para esta busca de conforto na religião. Mais um exemplo de como a religião pode ser nociva na vida de uma pessoa!

Hana enviou em 10/01/2014
Gostaria de ler mais artigos assim,você teria mais? Se não, poderia postar?

Guilherme enviou em 17/01/2014
Hana,
a proposta aqui é ir incluindo artigos que despertem a vontade de pensar e dabater. Sempre que posso acrescento alguma coisa portanto sugiro que você dê uma olhada de vez em quando. Você já conferiu os outros artigos deste site? Há alguma tema em particular sobre o qual você está interessada?

Programação com R

Esta é uma seção mais técnica que pode ser lida por último. Nesse caso pule para a seção Aquisição de Dados.

Esta seção apresenta uma formalização um pouco mais rigorosa dos conceitos do R como linguagem de programação. Em uma primeira leitura, para aqueles que ainda estão se familiarizando com a linguagem, ela pode ser pulada e lida mais tarde. Ela contém um pouco de repetição do material já visto, para fins de completeza.

Objetos

R é uma linguagem de programação de array, funcional e orientada a objeto. Todos os elementos de R, variáveis de dados e funções, são objetos. Não se pode acessar locais da memória diretamente e todos os objetos usados na execução de um programa são armazenados em memória RAM. Isso acaba tendo um peso importante quando se processa um grande volume de dados.

Linguagens de programação de arrays (também chamadas de linguagens vetoriais ou multidimensionais) são linguagens onde operações sobre objetos multidimensionais (vetores, matrizes, etc.) generalizam as operações sobre escalares de forma transparente. Elas permitem um código mais conciso e legível.

Todos os objetos possuem atributos que são meta-dados descrevendo suas características. Estes atributos podem ser listados com a função attributes() e definidos com a função attr(). Um desses atributos, bastante importante, é a classe de um objeto pois as funções de R usam essa informação para determinar como o objeto deve ser manipulado. A classe de um objeto pode ser lida ou alterada com a função class().

Existem os seguintes tipos de dados: Lógico ou booleano (logic), numérico (numeric), inteiro (integer), complexo (complex), caracter (character) e Raw.

Estes dados podem ser agrupados em estruturas de dados. Existem dois tipos fundamentais de estruturas: vetores atômicos e vetores genéricos. Vetores atômicos são matrizes de qualquer dimensão contendo um único tipo de dados. Vetores genéricos são também chamados de listas e são compostas por vetores atômicos. Listas são recursivas, no sentido de que podem conter outras listas.

Uma variável não precisa ser inicializada nem seu tipo declarado, sendo determinado implicitamente a partir do conteúdo do objeto. Seu tamanho é alterado dinamicamente.

Não existe o tipo “escalar” em R. Um escalar é simplesmente um vetor com um único elemento. Portanto a atribuição u <- 1 é apenas um atalho para u <- c(1).

Uma matriz é um vetor atômico acrescentado de um atributo dim com dois elementos (o número de linhas e de colunas). No exemplo seguinte, um vetor é transformado em uma matriz e depois recuperado como vetor:

> v <- 1:12
> print(v)
 [1]  1  2  3  4  5  6  7  8  9 10 11 12
> class(v)
[1] "integer"
> x <- c(1,2,3,4,5,6,7,8)
> class(x)
[1] "numeric"
> attr(v, "dim") <- c(2,6)
> print(v)
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    3    5    7    9   11
[2,]    2    4    6    8   10   12
> class(v)
[1] "matrix"
> # Um atributo arbitrário pode ser incluído
> attr(v, "nome") <- "minha matriz"

> attributes(v)
$dim
[1] 2 6
$nome
[1] "minha matriz"

> attr(v, "nome") <- NULL   # o atributo é removido
> attributes(v)
$dim
[1] 2 6
> # Um atributo pode ser alterado
> dim(v) <- c(3,4)
> print(v)
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12
> # Removido o atributo "dim" v volta a ser um vetor
> attr(v, "dim") <- NULL
> v
 [1]  1  2  3  4  5  6  7  8  9 10 11 12

A atribuição v <- 1:4 é idêntica à v <- c(1:4) e análoga, mas não idêntica à v <- c(1, 2, 3, 4). Nos dois primeiros casos o resultado é um vetor de inteiros. No terceiro temos um vetor numérico (de ponto flutuante).

Existem funções para a marcação de atributos: dim(), dimnames(), names(), row.names(), class() e tsp() (usado para a criação de séries temporais). Estas funções são preferíveis à simplesmente usar attr(vetor, "atributo") porque fazem um tratamento e análise dos parâmetros usados, emitindo notificações de erros mais detalhadas.

A igualdade entre objetos atômicos pode ser testada com o uso do operador ==, que verifica recursivamente a identidade de cada um dos elementos dos objetos comparados, ou da função identical(), que verifica a igualdade completa entre os dois objetos.

> a <- c(1,3,5); b <- c(1,3,5); c <- c(1,2,5)
> a==b
[1] TRUE TRUE TRUE
> a==c
[1]  TRUE FALSE  TRUE
> identical(a,b)
[1] TRUE
> identical(a,c)
[1] FALSE

Listas e Data Frames

As listas são coleções de vetores atômicos, não necessariamente de mesmo tipo. Elas são recursivas no sentido de que podem ter outras listas como seus elementos. Data frames são listas onde todos os vetores possuem o mesmo comprimento. Muitas funções recebem listas como argumentos ou retornam listas.

Para exemplificar vamos usar uma lista contendo as 5 primeiras observações do data frame warpbreaks, com 3 variáveis.

> quebras <- head(warpbreaks, n=5)
> quebras
  breaks wool tension
1     26    A       L
2     30    A       L
3     54    A       L
4     25    A       L
5     70    A       L

> # Usamos unclass() para ver seus componentes
> unclass(quebras)
$breaks
[1] 26 30 54 25 70

$wool
[1] A A A A A
Levels: A B

$tension
[1] L L L L L
Levels: L M H

attr(,"row.names")
[1] 1 2 3 4 5

> # Usamos attributes() para ver seus atributos
> attributes(quebras)
$names
[1] "breaks"  "wool"    "tension"

$row.names
[1] 1 2 3 4 5

$class
[1] "data.frame"

A igualdade entre objetos não atômicos não é implementado com o operador ==. Neste caso é necessário usar a função identical(), que verifica a igualdade completa entre os dois objetos.

> u <- list(v1=1,v2=2); v <- u
> v==u
Error in v == u : comparison of these types is not implemented
> identical(u,v)
[1] TRUE

> # identical testa a identidade entre quaisquer dois objetos:
> f <- function(x,y) x+y; g <- function(x,y) x+y
> identical(f,g)
[1] TRUE

A função unclass() retorna uma cópia de seu argumento sem seus atributos de classe. attributes() retorna uma lista com os atributos de seu argumento.

Selecionar partes de uma lista é uma operação importante em R. Para ilustrar algumas operações vamos usar o data frame iris que é uma lista contendo 5 vetores atômicos. Ela contém os campos (ou observações) Sepal.Length, Sepal.Width, Petal.Length, Petal.Width e Species. Relembrando, a função unclass(iris) exibe todos os valores em cada campo e seus atributos, separadamente. A função attributes(iris) exibe apenas os atributos. No exemplo abaixo aplicamos o agrupamento K-means usando a função kmeans(). Em seguida exploramos o objeto retornado que é uma lista.

> head(iris, n=2)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa

> # Para selecionar apenas os 4 primeiros campos usamos iris[1:4]

> kGrupo <- kmeans(iris[1:4],3)
> typeof(kGrupo)    # para ver de que tipo é o objeto
[1] "list"
> length(kGrupo)    # kGrupo é uma lista com 9 elementos
[1] 9
> print(kGrupo)     # para listar todos os elementos do objeto
K-means clustering with 3 clusters of sizes 50, 38, 62

Cluster means:
  Sepal.Length Sepal.Width Petal.Length Petal.Width
1     5.006000    3.428000     1.462000    0.246000
2     6.850000    3.073684     5.742105    2.071053
3     5.901613    2.748387     4.393548    1.433871

Clustering vector:
  [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 [31] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 2 3 3 3 3 3 3 3
 [61] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3
 [91] 3 3 3 3 3 3 3 3 3 3 2 3 2 2 2 2 3 2 2 2 2 2 2 3 3 2 2 2 2 3
[121] 2 3 2 3 2 2 3 3 2 2 2 2 2 3 2 2 2 2 3 2 2 2 3 2 2 2 3 2 2 3

Within cluster sum of squares by cluster:
[1] 15.15100 23.87947 39.82097
 (between_SS / total_SS =  88.4 %)

Available components:

[1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss" "betweenss"
[7] "size"         "iter"         "ifault"

> str(kGrupo)
List of 9
 $ cluster     : int [1:150] 1 1 1 1 1 1 1 1 1 1 ...
 $ centers     : num [1:3, 1:4] 5.01 6.85 5.9 3.43 3.07 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:3] "1" "2" "3"
  .. ..$ : chr [1:4] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width"
 $ totss       : num 681
 $ withinss    : num [1:3] 15.2 23.9 39.8
 $ tot.withinss: num 78.9
 $ betweenss   : num 603
 $ size        : int [1:3] 50 38 62
 $ iter        : int 2
 $ ifault      : int 0
 - attr(*, "class")= chr "kmeans"

> # A lista contém os seguintes atributos
> attributes(kGrupo)
$names
[1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
[6] "betweenss"    "size"         "iter"         "ifault"

$class
[1] "kmeans"

> # sapply(objeto, class) exibe a classe de cada elemento na lista
> # A função sapply é tratada com maiores detalhes na próxima seção

> sapply(kGrupo, class)
     cluster      centers        totss     withinss tot.withinss    betweenss
   "integer"     "matrix"    "numeric"    "numeric"    "numeric"    "numeric"
        size         iter       ifault
   "integer"    "integer"    "integer"

> # Podemos visualizar simultaneamente o segundo elemento, "centers"
> # que fornece uma matriz com os valores do centro de cada agrupamento
> e size, 7º elemento, com o número de pontos em cada grupo

> kGrupo[c(2,7)]
$centers
  Sepal.Length Sepal.Width Petal.Length Petal.Width
1     5.006000    3.428000     1.462000    0.246000
2     6.850000    3.073684     5.742105    2.071053
3     5.901613    2.748387     4.393548    1.433871

$size
[1] 50 38 62

> # Para visualizar o segundo componente da lista kGrupo,
> # que é uma matriz, usamos
> kGrupo[2]
$centers
  Sepal.Length Sepal.Width Petal.Length Petal.Width
1     5.006000    3.428000     1.462000    0.246000
2     6.850000    3.073684     5.742105    2.071053
3     5.901613    2.748387     4.393548    1.433871

> # Para ver apenas os componentes desta matriz:
> kGrupo[[2]]
  Sepal.Length Sepal.Width Petal.Length Petal.Width
1     5.006000    3.428000     1.462000    0.246000
2     6.850000    3.073684     5.742105    2.071053
3     5.901613    2.748387     4.393548    1.433871

> # O mesmo resultado seria obtido por kGrupo$centers
> # Para listar a primeira linha da matriz
> kGrupo[[2]][,1]
       1        2        3
5.006000 6.850000 5.901613
> # Para listar a primeira coluna da matriz
> kGrupo[[2]][1,]
Sepal.Length  Sepal.Width Petal.Length  Petal.Width
       5.006        3.428        1.462        0.246
> # Para listar o primeiro elemento da primeira linha
> kGrupo[[2]][1,1]
[1] 5.006
> # que é o mesmo que kGrupo$centers[1,1]

Funções em R

Quase tudo em R é uma função. Até os operadores comuns são funções. A declaração 2 + 3 é, na verdade, uma forma sintética para "+"(2, 3).

> '+'(2,3)
[1] 5
> "*"(13, 9)
[1] 117

Em funções, parâmetros são passados por valor e não por referência. Isso significa que um objeto passado como parâmetro é copiado e a cópia passada para a função. O objeto original não é alterado. Além disso variáveis definidas no corpo de funções são locais e não podem ser usadas fora dela. Para tornar globa uma variável usada dentro de uma função podemos usar o operador de "super atribuição" <<-. Considere, por exemplo, o código abaixo.

> f <- function(x) x <- x^2
> u <- c(1,2,3)
> v <- f(u)
> v
[1] 1 4 9
> u
[1] 1 2 3

> #  x é local à função
> print(x)
Error: object 'x' not found

> # Se necessário tornar x global fazemos

> f <- function(x) x <<- x^2
> v <- f(x)
> x
[1] 1 4 9

Funções podem ser usadas recursivamente (ou sejam, podem fazer chamadas a si mesmas). Dois exemplos são mostrados abaixo: o primeiro calcula o fatorial de um inteiro, o segundo exibe a sequência de Fibonacci com n elementos.

> fatorial <- function(x) {
     if (x == 0) return (1)
     else return (x * fatorial(x-1))
 }
> fatorial(0)
[1] 1
> fatorial(6)
[1] 720

> # Obs.: a mesma função poderia ser definida em forma mais compacta como
> fatorial <- function(x) ifelse (x == 0, 1, x * fatorial(x-1))

> # A sequência de Fibonacci:
> fibonacci <- function(n) {
     if(n <= 0)  return("Nada")
     fib <- function(m) ifelse(m <= 1, m, fib(m-1) + fib(m-2))
     seq <- c(0)
     if (n>1) { for(i in 1:(n-1)) seq[i+1] <- fib(i) }
     print("Sequência de Fibonacci:")
     print(seq)
 }
 > fibonacci(9)
[1] "Sequência de Fibonacci:"
[1]  0  1  1  2  3  5  8  13  21

Funções apply(), lapply(), sapply(), tapply()

A função apply() recebe como argumentos uma coleção de objetos (data frame, lista, vetor, etc.), o parâmetro MARGIN (que informa onde será aplicada a função) e uma função (qualquer função pode ser usada). Ela serve para executar alguma operação sobre essa coleção. Seu objetivo é principalmente o de evitar o uso de laços ou loops. Ela tem a seguinte estrutura:

apply(X, MARGIN, FUN)
onde:
    x: uma matriz ou array
    MARGIN=n :  onde n = 1 ou 2, definindo onde a função será aplicada:
        se n=1: a função será aplicada nas linhas
        se n=2: função aplicada nas colunas
        se n=c(1,2): função aplicada nas linhas e colunas
    FUN: define função a ser usada.
         Podem ser funções internas (mean, median, sum, min, max, ...)
         ou definidas pelo usuário
> # Usando a matriz v, já definida:
> print(v)
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12
> # A média das colunas
> apply(v,2,mean)
[1]  2  5  8 11
> # A soma das colunas
> apply(v,2,sum)
[1]  6 15 24 33
> minimosNasLinhas <- apply(v, 1, min)
> print(minimosNasLinhas)
[1] 1 2 3

A função lapply() recebe como argumentos uma coleção de objetos (data frame, lista, etc.) e uma função. Ela executa a função sobre todos os elementos da coleçao e retorna um objeto do tipo lista:

lapply(X, FUN)
onde:
    X: vetor, lista, data frame, ...
    FUN: Função a ser aplicada a cada elemento de X
         Podem ser funções internas ou definidas pelo usuário

Para exemplificar aplicaremos a função tolower() para reduzir a letras minúsculas todas as palavras de um vetor de caracteres:

> partes <- c("RODAS","MOTOR","CARBURADOR","PNEUS")
> partesMinuscula <- lapply(partes, tolower)
> print(partesMinuscula)
[[1]]
[1] "rodas"
[[2]]
[1] "motor"
[[3]]
[1] "carburador"
[[4]]
[1] "pneus"

> # Esta lista pode ser convertida em um vetor usando-se unlist:
> partesMinuscula <- unlist(partesMinuscula)
> print(partesMinuscula)
[1] "rodas"      "motor"      "carburador" "pneus"

A função sapply() recebe como argumentos uma coleção de objetos (data frame, lista, etc.) e uma função. Ela age da mesma forma que lapply() mas retorna um vetor ou uma matriz:

sapply(X, FUN)
onde:
    X: vetor, lista, data frame, ...
    FUN: Função a ser aplicada a cada elemento de X
         Podem ser funções internas ou definidas pelo usuário

Usaremos a função sapply() com o data frame cars que traz uma coleção de observações sobre velocidades e distâncias percorridas até repouso em cada velocidade em automóveis (em 1920) para encontrar os valores mínimos em cada coluna:

> # para ver a estrutura do data frame:
> str(cars)
 'data.frame':	50 obs. of  2 variables:
  $ speed: num  4 4 7 7 8 9 10 10 10 11 ...
  $ dist : num  2 10 4 22 16 10 18 26 34 17 ...
> lMinimos <- lapply(cars, max)
> sMinimos <- sapply(cars, max)
> print(lMinimos)
$speed
[1] 25
$dist
[1] 120

> print(sMinimos)
speed  dist
   25   120

O exemplo abaixo mostra o uso de lapply() e sapply() junto com uma função do usuário. Ela retorna os valores do data frame que estão abaixo da média em cada coluna. Neste caso elas retornam valores iguais, como se pode ver com o uso de identical():

> abaixoDaMedia <- function(x) {
                   media <- mean(x)
                   return(x[x < media])
                   }
> abaixoDaMedia(c(1,2,3,40,50))
 [1] 1 2 3
> minSapply <- sapply(cars, abaixoDaMedia)
> minLapply <- lapply(cars, abaixoDaMedia)
[1] TRUE
> minSapply
$speed
 [1]  4  4  7  7  8  9 10 10 10 11 11 12 12 12 12 13 13 13 13 14 14 14 14 15
[25] 15 15
$dist
 [1]  2 10  4 22 16 10 18 26 34 17 28 14 20 24 28 26 34 34 26 36 20 26 32 40
[25] 32 40 42 36 32

> # Os valores retornados são iguais (embora em objetos distintos):
> identical(minSapply, minLapply)
 [1] TRUE

A função tapply() calcula um valor usando uma função (mean, median, min, max, ...) sobre os dados de um objeto agrupados para cada valor de uma variável de fator dada.

tapply(X, INDEX, FUN = NULL)
onde:
    X: um objeto, geralmente um vetor
    INDEX: uma lista contendo fatores
    FUN: a função a ser aplicada sobre os elementos de X

Para ilustrar o uso desta função vamos usar o data frame irisCalculamos primeiro a média dos comprimentos de sépalas para todas as espécies. Depois calculamos as médias para cada espécie em separado, setosa, versicolor, virginica.

Em seguida usamos o data frame mtcars para calcular o consumo médio dos carros, agrupados por número de cilindros (cyl = 4, 6, 8) e tipos de transmissão, am = 0 (automático), 1 = (manual).

> attach(iris)
> # O comprimento médio de todas as sépalas é
> mean(Sepal.Length)
[1] 5.843333
> # O comprimento médio das sépalas agrupadas por espécie:
> tapply(Sepal.Length, Species, mean)
    setosa versicolor  virginica
     5.006      5.936      6.588
> detach(iris)
> # Usando mtcars:
> attach(mtcars)
> # O consumo médio para todos os carros é
> mean(mtcars$mpg)
[1] 20.09062
> # O consumo médio dos carros, agrupados por cilindros e tipo de transmissão
> tapply(mpg, list(cyl, am), mean)
       0        1
4 22.900 28.07500
6 19.125 20.56667
8 15.050 15.40000

> # Para efeito de conferência, calculamos a media de mpg para am=0 e cyl=8
> L <- mtcars[cyl==8 & am==0,]
> # L contém apenas carros com  am=0 e cyl=8
> mean(L$mpg)
[1] 15.05
> detach(mtcars)

Lembramos que em R os índices começam em 1 e não 0, como em muitas outras linguagens.

Ambientes (environments) e escopo

R armazena seus objetos em memória RAM dentro de ambientes ou environments. Um environment fica definido por uma lista que associa os nomes dos objetos nele carregados com seus valores. Eles existem principalmente para organizar estes objetos e a forma como R os encontra. Cada ambiente está ligado a um pai (um parent environment) fazendo com que os ambientes formem uma estrutura de árvore que termina no ambiente de nível mais alto que se chama R_EmptyEnv. Quando se inicia uma sessão o R se encontra no ambiente global, global environment, denominado R_GlobalEnv, também chamado de área de trabalho do usuário. Quando o nome de um objeto é invocado em código o interpretador de R busca na lista do ambiente atual, que pode ser visto com a função environment(). Se não encontrado o nome é procurado no ambiente pai, e assim sucessivamente, até que o último é alcançado.

Um novo ambiente pode ser criado com a função new.env() e objetos dentro deste ambiente com a função assign(). Estes objetos podem ser recuperados através da função get() ou da notação ambiente$variavel. A função exists("variavel", envir = ambiente) verifica a existência de variavel no ambiente, enquanto os objetos em um ambiente são listados com ls(ambiente), como se ilustra abaixo:

> environment()                            # exibe ambiente atual
<environment: R_GlobalEnv>
> var <- "este objeto está em Global Env"  # cria objeto em Global_Env
> novoEnv <- new.env()
> assign(var, "novo objeto em novoEnv", env=novoEnv)
> ls()
 [1] "novoEnv" "var"
> var
[1] "este objeto está em Global Env"
> get(var, env=novoEnv)
[1] "novo objeto em novoEnv"

> # A notação de "$" pode ser usada:
> novoEnv$var <- " outro valor para objeto em novoEnv"
> var
[1] " este objeto está em Global_env"
> novoEnv$var
[1] " outro valor para objeto em novoEnv"

> cat("var em global_env -->", var, "\nvar em novoEnv -->", novoEnv$var)
var em global_env --> este objeto está em Global Env
var em novoEnv --> novo objeto em novoEnv

> # Para ver o ambiente pai de novoEnv
> parent.env(novoEnv)
<environment: R_GlobalEnv>
> novoEnv$x <- 1   $ insere nova variável no ambiente
> ls(envir=novoEnv)
[1] "var" "x"
> exists("x", envir = novoEnv)
[1] TRUE

> # Um ambiente pode ser criado como filho de qualquer outro ambiente
> e2 <- new.env(parent = outroEnv)
> parent.env(e2)

> # Uma variável será criada em e2
> e2$teste <- 123
> # e2 é filho de novoEnv que está em R_GlobalEnv
> # A variável teste não será encontrada em R_GlobalEnv (pois reside em um nível abaixo)
> teste
Error: object 'teste' not found
> # O objeto está no ambiente e2
> e2$teste
[1] 123
> # Para testar se um objeto é um ambiente
> is.environment(e2)
[1] TRUE

> # Observe que a variável que contém o ambiente global é .GlobalEnv
> is.environment(.GlobalEnv)
[1] TRUE

> # Seu atributo name é "R_GlobalEnv"
> environmentName(environment())
[1] "R_GlobalEnv"

A função abaixo percorre os ambientes de modo hierárquico à partir de R_GlobalEnv subindo para os pais até o último ambiente, R_EmptyEnv que é o último ambiente, sem pai. A função search() exibe os ambientes na ordem hierárquica, a mesma ordem usada para a procura de um objeto.

> exibirArvore <- function() {
      a <- environment()
      repeat {        
          print(environmentName(a))
          if (environmentName(a) == "R_EmptyEnv") break
          a <- parent.env(a)
     }
 }
> exibirArvore()
[1] ""
[1] "R_GlobalEnv"
[1] "tools:rstudio"
[1] "package:stats"
[1] "package:graphics"
[1] "package:grDevices"
[1] "package:utils"
[1] "package:datasets"
[1] "package:methods"
[1] "Autoloads"
[1] "base"
[1] "R_EmptyEnv"

> # A função environment() permite descobrir em que
> # ambiente está uma função:
> environment(exibirArvore)
<environment: R_GlobalEnv>

> search()
 [1] ".GlobalEnv"        "tools:rstudio"     "package:stats"     "package:graphics" 
 [5] "package:grDevices" "package:utils"     "package:datasets"  "package:methods"  
 [9] "Autoloads"         "package:base" 	

Observe que a primeira chamada à função environmentName(a) retorna um string vazio, que é o nome do ambiente interno à função. Quando uma função é criada ela gera a criação de um ambiente próprio onde ficam as variáveis definidas em seu corpo. Para exemplificar a existência deste ambiente dedicado à definição da função criamos abaixo a função minhaFuncao(x) que retorna outra função que soma x ao seu argumento. O valor de x passado na definição da função não é alterado com uma definição de seu valor fora do corpo da função.

> f <- function() {
          x <- 1
          print(environment())
          print(parent.env(environment()))
 }
> f()
<environment: 0xd31ee80>
<environment: R_GlobalEnv>

> minhaFuncao <- function(x) { function(y) x+y }
> h <- minhaFuncao(100)
> h(10)
[1] 110
> x <- 3
> h(2)
[1] 102
> # Internamente ao ambiente de h, x = 100
> # h vive no ambiente environment(h).
> # Neste ambiente existe apenas a variável:
> ls(environment(h))
[1] "x"

No caso acima o R criou o ambiente "0xd31ee80" que é filho de R_GlobalEnv. A variável x só existe dentro do ambiente da função.

Uma função (e seu ambiente) podem ser colocados em qualquer outro ambiente usando-se a função environment(funcao ) <- outroAmbiente. No exemplo abaixo a variável anos é definida em .GlobalEnv e dentro do corpo da função quantosAnos. Três outras funções são definidas dentro desta primeira: anosLocal (que usa a variável local, a=10), anosGlobal (que usa a variável em globalEnv, a=10). Na execução da função semBusca a variável está localmente definida, a=1 e nenhuma busca é necessária para a sua execução.

> anos <- 100
> quantosAnos <- function() { 
      anos <- 10
      anosLocal <- function() { print( anos + 5 ) } 
      anosGlobal <- function() { print( anos + 5 ) } 
      semBusca <-  function() { anos <- 1; print( anos + 5 ) } 
      environment( anosGlobal ) <- .GlobalEnv 
      anosLocal() 
      anosGlobal()
      semBusca() 
  }
> quantosAnos()
[1] 15
[1] 105
[1] 6

O exemplo abaixo mostra que quando a função f1 é gerada seu ambiente foi armazenado junto com ela. Nele estão as variáveis a=2, b=3. Este ambiente fica inalterado mesmo depois que a variável global a foi alterado.

> funcaoSoma <- function(a, b) {
     f <- function(x) return( x + a + b )
     return( f )
 }
> a <- 2; b <- 3
> f1 <- funcaoSoma(a, b)
> f1(3)
[1] 8
> a <- 4
> f2 <- criarFuncao(a, b)
> f2(3)
[1] 10
> f1(3)
[1] 8
> # Para forçar a permanência de uma variável após
> # a conclusão da função usamos a atribuição "<<-"
> f <- function(){w<-13}
> f()  # não há retorno
> w
Error: object 'w' not found
> f <- function(){w<<-13}
> f()
> w
[1] 13

Para alocar explicitamente variáveis para um determinado ambiente, além da notação de "$" pode ser usado:

> ls(outroEnv) # o ambiente está vazio
character(0)
> with(outroEnv, {a <- 1; txt <- "texto" })
> ls(outroEnv)
[1] "a"   "txt"
> with(outroEnv, {print(a); print(txt)})
[1] 1
[1] "texto"
> # Alternativamente,
> outroEnv$a; outroEnv$txt
[1] 1
[1] "texto"

Se o nome da biblioteca onde está uma função é previamente conhecido é possível evitar a busca pela definição de uma função usando o operador ::. O mesmo procedimento pode ser usado para forçar o uso de uma função específica quando existem outras de mesmo nome definidas. Se o pacote não está carregado o operador ::: pode ser usado.

> x <- c(123, 234, 345, 242, 34, 100)
> stats::sd(x)
[1] 113.9731

> Wilks
Error: object 'Wilks' not found
> stats:::Wilks
> # ... A definição da função é exibida

> # Para verificar o que significa o operador :::
> `:::`
function (pkg, name) 
{
    pkg <- as.character(substitute(pkg))
    name <- as.character(substitute(name))
    get(name, envir = asNamespace(pkg), inherits = FALSE)
}


Decorre do que foi dito que o escopo de uma variável em R é o seguinte: a variável deve estar definida no ambiente local em que é usada ou em algum ambiente pai. Se variáveis com o mesmo nome estão definidas dentro da hierarquia de ambientes será usada aquela que for encontrada primeiro, ou seja, no ambiente de menor posição.

Muitas linguagens de programação não permitem (ou dsencorajam) o uso de variáveis globais pois elas podem tornar tornar o código mais frágil, sujeito a erros. No R elas podem ser usadas e funções podem acessar variáveis em ambientes acima delas. Mas essa não é sempre uma boa prática. Para projetos com algum nível de complexidade é recomendado que se passe todas as variáveis necessárias na definição da função ou se faça uma verificação rigorosa de escopos, oferecendo alternativas para o caso em que essas variáveios estão ausentes ou tenham tipos não apropriados. Caso as variáveis globais sejam usadas é uma boa prática dar a elas nomes identificadores tais como global.var para evitar que conflituem com outras definidas localmente.

Otimização e Pesquisa de Erros (debugging)

É possível pré-compilar uma função usando a biblioteca compiler (e sua função cmpfun()) que gera uma versão em byte-code. Nas linhas abaixo, fizemos uma medida dos tempos gastos nas funções f e sua versão pré-compilada g.

Algumas práticas podem ser aplicadas se um código estiver demorando muito para ser executado. Uma delas consiste em envolver o código a ser verificado com os comandos Rprof() e Rprof(NULL) e depois executar a função summaryRprof() para ver um resumo dos tempos gastos na execução de cada funcão.

> library(compiler)
> f <- function(n, x) { for (i in 1:n) x <- x + (1 + x)^(-1)}
> g <- cmpfun(f)
> medirTempos <- function() {
      Rprof()
      inicio <- Sys.time()
      f(10000000,1)
      duracao1 <- Sys.time() - inicio
      print(duracao1)
      inicio <- Sys.time()
      g(10000000,1)
      duracao2 <- Sys.time() - inicio
      print(duracao2)
      print(duracao1 - duracao2)
      Rprof(NULL)
      summaryRprof()
  }

> # Executamos a função para medir os tempos gastos  
> medirTempos()
Time difference of 1.003972 secs
Time difference of 0.9667881 secs
Time difference of 0.03718424 secs
$by.self
    self.time self.pct total.time total.pct
"f"      1.00    51.02       1.00     51.02
"g"      0.96    48.98       0.96     48.98

$by.total
              total.time total.pct self.time self.pct
"medirTempos"       1.96    100.00      0.00     0.00
"f"                 1.00     51.02      1.00    51.02
"g"                 0.96     48.98      0.96    48.98

$sample.interval
[1] 0.02

$sampling.time
[1] 1.96

A função compilada g é um pouco mais rápida que sua original. Em blocos maiores e mais demorados de código a diferença pode ser significativa.

Quando dados são importados para uma sessão de R sempre é uma boa prática ler apenas os campos necessários. Por exemplo, suponha que se deseje importar dados de uma tabela contido em um arquivo de texto arquivo.txt que contém 5 variáveis, a primeira de caracter e as 4 demais numéricas, mas apenas as duas primeiras serão usadas. A importação seletiva pode ser obtida usando-se o parâmetro colClasses. Colunas associadas com NULL serão ignoradas:

> # Para importar todos os dados usamos:
> dfLeitura <- read.table(arquivo.txt, header=TRUE, sep=',')
> # Seria mais eficiente e rápido selecionar apenas os campos desejados:
> dfLeitura <- read.table(arquivo.txt, header=TRUE, sep=',',
               colClasses=c("character", "numeric", NULL, NULL, NULL))

A execução de uma operação vetorializada é mais ágil do que percorrer um laço sobre os elementos de um vetor ou matriz. Isso é obtido com o uso de funções projetadas para lidar com vetores de forma otimizada. Alguns exemplo na instalação básica são as funções colSums(), colMeans(), rowSums(),
e rowMeans()
. O pacote matrixStats, plyr, dplyr, reshape2, data.table também incluem diversas funções otimizadas para esse tipo de operação.

Para mostrar isso usamos, desta vez, a função system.time(operação) que mede o tempo de execução da operação.

> partes <- 1:100000000
> soma1 <- function(x) print(sum(x))
> soma2 <- function(x) {
     s <- 0
     for (u in x) s <- s + u
     print(s)
 }

> system.time(soma1(partes))
[1] 5e+15
   user  system elapsed 
      0       0       0 
> system.time(soma2(partes))
[1] 5e+15
   user  system elapsed 
  4.775   0.000   4.775 

Em outro exemplo fazemos a soma dos elementos de uma matriz com 1000 colunas e 1000 linhas (portanto com 1 milhão de elementos).

> set.seed(1234)
> # Cria uma matriz 10000 x 10000
> matriz <- matrix(rnorm(100000000), ncol=10000)
> # Cria função para somar elementos de cada coluna
> somar <- function(x) {
           somando <- numeric(ncol(x))
           for (i in 1:ncol(x)) {
               for (k in 1:nrow(x)) {
                   somando[i] <- somando[i] + x[k,i]
               }
           }
  }
> # Executa a função e mede o tempo gasto
> system.time(somar(matriz))
   user  system elapsed 
 17.231   0.000  17.230
> # mede o tempo de execução de colSums  
> system.time(colSums(matriz))
   user  system elapsed 
  0.108   0.000   0.107 

Como vimos o cálculo é realizado aproximadamente 160 vezes mais rapidamente pela função vetorializada. Essa diferença pode ser muito maior, dependendo da situação analisada.

Sempre é mais eficiente inicializar um objeto em seu tamanho final e depois preenchê-lo de que partir de um objeto vazio e ajustar seu tamanho progressivamente.

> set.seed(1234)
> u <- rnorm(1000000)
> uQuadrado <- 0
> system.time(for (i in 1:length(u)) uQuadrado[i] <- u[i]^2)
   user  system elapsed 
  0.361   0.000   0.361

> # Tempo de execução para a mesma operação com
> # a variável inicializada em seu tamenho final   
> rm(uQuadrado)
> uQuadrado <- numeric(length=1000000)
> system.time(for (i in 1:length(u)) uQuadrado[i] <- u[i]^2)
   user  system elapsed 
   0.11    0.00    0.11

> # Usando a função vetorializada
> uQuadrado <- numeric(length=1000000)
> system.time(uQuadrado <- u^2)
   user  system elapsed 
  0.002   0.000   0.001     

A operação é muito mais rápida quando se usa a função vetorializada. Além da exponenciação, as funções adição, multiplicação e outras operações binárias do tipo são todas vetorializadas.

Gerenciamento de memória

Como já mencionado, R mantém em memória RAM todos os seus objetos em uso, o que pode introduzir lentidão ou mesmo a impossibilidade de realizar alguma operação. Mensagens de erro sobre a insuficiência de espaço de memória indicam que o limite foi excedido. Este limite depende, é claro, do hardware usado, do sistema operacional e da compilação de R (a versão de 64 bits é mais eficiente). Para grandes volumes de dados é preciso procurar escrever um código eficiente para acelerar a execução com o eventual armazenando dados em meio externo para diminuir a sobrecarga na memória RAM e através do uso de rotinas estatísticas especializadas, escritas para maximar a eficiência no manipulação de dados.

Para uma programação mais eficiente é recomendável aplicar operações sobre vetores sempre que possível. As funções internas para manipulação vetores, matrizes e listas (tais como ifelse, colMeans e rowSums) são mais eficientes que loops (for e while). Matrizes usam menos recursos que data frames. No uso de read.table() para carregar dados externos para um data frame especifique as opções colClasses e nrows explicitamente, defina comment.char = "" e marque como NULL as colunas não necessárias. Ao ler dados externos para uma matriz, use a função scan().

Como mencionado, sempre que possível crie objetos com seu tamanho final ao invés de aumentar seu tamanho gradualmente, inserindo valores. Teste seu código usando uma amostra de dados menor para otimizá-lo e remover erros. Exclua objetos temporários ou desnecessários usando rm(objeto). Após a remoção use gc() para iniciar a coleta de lixo. Use a função .ls.objects() para listar objetos no espaço de trabalho e encontrar o que ocupa mais memória e o que pode ser removido.

Use as funções Rprof(), summaryRprof() e system.time() para cronometrar o tempo e gasto em cada função e descobrir qual delas você deveria procurar otimizar. Rotinas externas compiladas podem ajudar a acelerar a execução do programa. Com o pacote Rcpp você pode transferir objetos de R para funções C++ e voltar quando são necessárias sub-rotinas otimizadas.

Para volumes de dados for muito grandes existem bibliotecas que incluem a funcionalidade de descarregar dados em bancos de dados externos ou arquivos binários simples e acessar parte deles. Alguns exemplos são:

Biblioteca Descrição
bigmemory grava e acessa matrizes em arquivos no disco.
ff fornece estruturas de dados que podem ser grabadas em disco, agindo como se permanecessem em RAM.
filehash implementa uma base de dados simples tipo chave-valor gravada em disco
ncdf, ncdf4 fornece interface para arquivos Unidata netCDF
RODBC, RMySQL, ROracle, RPostgreSQL, RSQLite acesso aos respectivos DBMS externos.

No que se refere à análise dos dados em grandes volumes estão disponíveis:

Pacotes biglm e speedglm: ajuste de modelos lineares lineares e generalizados para grandes conjuntos de dados de uma maneira eficiente em termos de memória. Incluem as funções lm() e glm() para lidar com grandes conjuntos de dados.

Diversos pacotes oferecem funções para operações sobre grandes matrizes produzidas pelo pacote bigmemory. biganalytics oferece agrupamento k-means, estatísticas de coluna e um wrapper para biglm. O pacote bigrf pode ser usado para se adequar às florestas de classificação e regressão. bigtabulate fornece funcionalidade table(), split() e tapply(). O pacote bigalgebra inclui funções avançadas da álgebra linear.

biglars oferece cálculo de regressão para conjuntos grande, usado juntamente com o pacote ff.

O pacote data.table introduz uma versão melhorada de um data frame, com métodos mais rápidos e eficientes para: agregação de dados; junções de intervalo; adição, modificação e exclusão de colunas por referência (sem cópias). Um data.table pode ser usado em qualquer função que receba um data frame como argumento.

Depuração de Erros (debugging)

Qualquer projeto de programação com algum grau de complexidade está sujeito a erros. Depuração de erros ou debugging é o processo de se encontrar e resolver as falhas no código. Por mais interessante que seja escrever um bloco de código para resolver algum problema, encontrar erros pode ser tedioso e demorado. Existem erros que impedem a execução do código causando a emissão de mensagens de erros. Estes são, em geral, os mais fáceis de se encontrar. Mas também existem situações em que o código roda perfeitamente mas produz resultados inesperados e incorretos.

As táticas de debugging envolvem rodar as linhas de código interativamente verificando o valor das variáveis, testar o efeito sobre um conjunto de dados que produzem resultados conhecidos, análise do fluxo do código e do estado da memória a cada instante da execução.

Na programação em R erros são geralmente causados por digitação incorreta do nome de variáveis ou funções e chamadas à funções com parâmetros de tipo incorretos, inclusive quando objetos importados de fontes externas contém partes que são NULL, NaN ou NA e são passados como parâmetros para funções que não fazem a verificação para a existência desses valores.

Função Efeito
debug() Marca uma função para debugging.
undebug() Desmarca uma função para debugging.
browser() Permite percorrer o código de execução de uma função passo a passo.
trace() Modifica a função para permite a inserção temporária de de código auxiliar.
untrace() Cancela a função anterior e remove o código temporário.
traceback() Imprime a sequência de chamadas a funções que produziram o último erro não capturado.

Durante a depuração com o uso de browser() a tecla executa a linha sob o cursor e passa o foco para a próxima linha. Teclar força a execução até o final da função sem pausas. Digitar exible a pilha de execução (call stack) e interrompe a execução e desloca o foco para o nível imediatamente superior. Também é possível usar comandos como ls(), print() e atribuições no prompt do depurador.

Atualizando R e suas Bibliotecas

A atualização de R pode ser um pouco trabalhosa. Seguem algumas sugestões para usuários de Windows e Linux.

No Windows

Uma forma possível e prática para atualizar a instalação do R no Windows consiste em usar a biblioteca installr. Para isso a bliblioteca deve ser instalada e executada de dentro do próprio console (ou do Rstudio, ou outra IDE).

Como eu não utilizo o Windows esta opção está mencionada aqui como uma sugestão, que eu não experimentei. Ela foi extraída da página R-statistics blog.
> # instalando e carregando a biblioteca
> install.packages("installr")
> require(installr)
> updateR()

A função updateR() iniciará o processo de atualização, verificando se novas versões estão disponíveis. Se a versão instalada for a mais recente a função termina e retorna FALSE. Caso contrário será perguntado se o usuário deseja prosseguir, após a exibição de um sumário das novidades na versão.

Será oferecida ao usuário a opção de copiar as bibliotecas instaladas para a nova versão e, em seguida, a de atualizar estas bibliotecas.

Mac e Linux

A atualização pode ser feita manualmente usando pacotes no website da CRAN.

$ sudo apt-key adv --keyserver keyserver.ubuntu.com
                   --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9
$ sudo add-apt-repository
       'deb https://cloud.r-project.org/bin/linux/ubuntu bionic-cran35/'
$ sudo apt update
$ sudo apt install r-base

As linhas acima, para cada entrada no prompt, não devem ser quebradas.

Mais informações sobre instalações no Debian, Red Hat, SUSE e Ubuntu no site See CRAN-R Linux.

Para compilar à partir do código fonte consulte a página CRAN-R Installation and Administration.

Atualizando as bibliotecas

Tanto no Windows quanto no Linux para atualizar apenas as bibliotecas que foram instaladas com install.packages() basta usar, no console a função update.packages(). A função perguntará quais as bibliotecas você deseja atualizar. Para executar a atualização de todas elas, sem o prompt de consulta digite update.packages(ask = FALSE).

Além de update.packages() existem as funções old.packages() que informa quais as bibliotecas possuem versões mais atuais nos repositórios versões aplicáveis e new.packages() que procura por novas bibliotecas disponíveis e ainda não instaladas, oferecendo a opção de instalá-las.

Obs.: Pacotes instalados por devtools::install_github() não são atualizados pelos procedimento descritos. No Windows eles podem ser atualizados por installr.

No RStudio

Para atualizar o RStudio use o item de Menu: Help > Check for Updates. Para atualizar as bibliotecas use Menu: Tools > Check for Packages updates.


Aquisição de Dados