Bastão de Asclépio & Símbolo de Integral

Bastão de Asclépio & Símbolo de Integral

invisible(Sys.setlocale("LC_CTYPE", "pt_BR.UTF-8"))
invisible(Sys.setlocale("LC_ALL","pt_BR.UTF-8"))

options(warn=-1)
suppressMessages(library(ggplot2, warn.conflicts=FALSE))
suppressMessages(library(gMOIP, warn.conflicts=FALSE))
suppressMessages(library(kableExtra, warn.conflicts=FALSE))
suppressMessages(library(knitr, warn.conflicts=FALSE))
suppressMessages(library(latex2exp, warn.conflicts=FALSE))
suppressMessages(library(lpSolve, warn.conflicts=FALSE))
suppressMessages(library(ompr, warn.conflicts=FALSE))
suppressMessages(library(ompr.roi, warn.conflicts=FALSE))
suppressMessages(library(RConics, warn.conflicts=FALSE))
suppressMessages(library(readxl, warn.conflicts=FALSE))
suppressMessages(library(REAT, warn.conflicts=FALSE))
suppressMessages(library(reticulate, warn.conflicts=FALSE))
suppressMessages(library(ROI, warn.conflicts=FALSE))
suppressMessages(library(ROI.plugin.glpk, warn.conflicts=FALSE))
suppressMessages(library(stringr, warn.conflicts=FALSE))
options(warn=0)

# Abra o Terminal (Prompt de Comando (CMD) do Windows)
# python.exe -m pip install --upgrade pip
# Digite: pip install pacote
import numpy
import scipy
import pulp # pip install glpk

Material

Pensamento

“Não é paradoxo dizer que nos nossos momentos de inspiração mais teórica podemos estar o mais próximo possível de nossas aplicações mais práticas.”

WHITEHEAD, AN apud BOYER, CB (1974) História da matemática. São Paulo: Blücher/Edusp, p. 419.

Conteúdo

  1. Número real (Capítulo 1)

2. Função e relação (Capítulo 3)

  1. Funções potência, periódica, exponencial e logarítmica (Capítulos 4, 5 e 6)
  2. Método gráfico (Capítulo 7)
  3. Série e limite (Capítulo 8)
  4. Derivada e integral (Capítulos 9 e 10)
  5. Equação diferencial ordinária (ODE) (Capítulo 11)
  6. Função de duas ou mais variáveis independentes (Capítulo 12)
  7. Probabilidade (Capítulo 13)
  8. Matriz, vetor e número complexo (Capítulos 14 e 15)

Introdução

Nas ciências da vida, nem todas as relações são de natureza quantitativa.

Embora os futuros cientistas possam entender células, vírus, genes, anticorpos etc. em termos de moléculas, suas estruturas são tão complexas que uma descrição será mais ou menos qualitativa. O estudo das interconexões entre as células, seja por troca química ou elétrica, exige ferramentas matemáticas que não sejam simplesmente fórmulas.

Como um órgão funciona, sua resposta a um estímulo ou como um indivíduo se comporta dificilmente podem ser expressos apenas por números. Portanto, neste capítulo damos definições que são amplas o suficiente para incluir propriedades qualitativas e quantitativas.

Usando a teoria dos conjuntos, daremos uma definição matemática do que geralmente é chamado de relação. A noção de função aparecerá como um caso especial. O capítulo terminará com uma revisão da função linear.

A função é um conceito basilar em cálculo e análise. O capítulo constrói e operacionaliza o conceito de função.

Plano cartesiano

O par ordenado de números reais é denotado por \((x,y)\), sendo que suas coordenadas reais x e y são chamadas respectivamente de abscissa e ordenada. Note que as coordenadas são adimensionais, isto é, não possuem unidade de medida.

Dois pares ordenados são iguais se e somente se suas respectivas coordenadas são iguais, isto é, \((x_1,y_1)=(x_2,y_2)\iff(x_1=x_2~\text{e}~y_1=y_2)\). Dessa forma, o par ordenado não tem a propriedade comutativa, isto é, se \(x \ne y\), então \((x,y)\ne(y,x)\).

O conjunto dos pares ordenados é denominado \(\mathbb{R^{2}}\) ou \(\mathbb{R \times R}\) e tem uma quantidade infinita não enumerável de elementos.

O conjunto de números reais, \(\mathbb{R}\), é representável graficamente pela reta euclidiana ou real. A reta real horizontal representa o eixo das abscissas e a reta real vertical e ortogonal à reta anterior representa o eixo das ordenadas. As duas retas reais se cruzam no par ordenado \((0,0)\) chamado de origem. Essa representação gráfica do plano euclidiano ou real é denominado sistema de eixos cartesianos ortogonais ou simplesmente plano cartesiano. Cada ponto do plano cartesiano é representado por um par ordenado real.

listplot (1,2) axes labels "x" "y"

Produto cartesiano

O produto cartesiano entre o subconjunto das abscissas \(A\) e o subconjunto das ordenadas \(B\) denotado por \(A\times B\) é o conjunto dos pares ordenados \((x,y)\) tais que \(x\in A\) e \(y \in B\).

Por exemplo:

  1. se \(A=\{1\}\) e \(B=\{2\}\), então \(A \times B=\{(1,2)\}\);
  2. se \(A=[-1,1]\) e \(B=\{1\}\), então \(A \times B=\{(x,1)|x \in [-1,1]\}\);
  3. se \(A=\{1\}\) e \(B=[-1,1]\), então \(A \times B=\{(1,y)|y \in [-1,1]\}\);
  4. se \(A=\mathbb{R}\) e \(B=\{2\}\), então \(A \times B=\{(x,2)|x \in \mathbb{R} \}\);

plot y=1, x=-1 to 1, axes labels "x" "y"

Os pares ordenados não são ordenáveis e o produto cartesiano não tem a propriedade comutativa, pois, se \(A \ne B\), então \(A\times B \ne B\times A\).

Relação

O conjunto de pares ordenados é chamado de relação plana ou gráfico da relação, isto é, a relação plana é qualquer subconjunto de \(\mathbb{R^{2}}\).

E.g.:

  1. \(S=\{(x,y)| \; 2x>y\}\) é o conjunto dos pares ordenados de um semi-plano;

  2. \(S=\{(x,y)| \; x^2+y^2<1\}\) é o conjunto dos pares ordenados do interior do círculo centrado na origem e de raio unitário;

  3. \(S=\{(x,y)| \; xy=1\}\) é o conjunto dos pares ordenados da hipérbole equilátera;

  4. \(S=\{(x,y)| \; y \le x^2+1\}\) é o conjunto dos pares ordenados da parábola e de seu exterior;

  5. \(S=\{(x,y)| \; 2x+y-1=0\}\) é o conjunto dos pares ordenados da reta.

region plot x^2 + 3y^2 = 21

Uma solução em R, usando “força bruta”:

demo_elipse.R

Warning in sqrt(C - A * (x^2)): NaNs produzidos

region plot y>x

demo_region01.R

region plot x^2 + y^2 < 1

demo_region02.R

Warning in sqrt(1 - x^2): NaNs produzidos

RegionPlot[y<=x^2-1,{x, -1, 3}, {y, -1, 5}]

Uma solução em R:

demo_region03.R

region plot xy=1

demo_region04.R

RegionPlot 2x+y-1=0

demo_region05.R

Função

A relação plana \(f\) é chamada de função se e somente se para cada valor da abscissa há apenas um valor da ordenada, i.e., se \((x_1,y_1 )\in f\), \((x_2,y_2 )\in f\) e \(x_1=x_2\), então \(y_1=y_2\).

As seguintes relações planas, por exemplo, são funções:

  1. \(\{(x,1)|\;x\in[-1,1]\}\)
  2. \(\{(x,y)|\;xy=1\}\)
  3. \(\{(x,y)|\;2x+y-1=0\}\)

As seguintes relações planas, por exemplo, não são funções:

  1. \(\{(1,y)|\;y\in[-1,1]\}\)
  2. \(\{(x,y)|\;2x>y\}\)
  3. \(\{(x,y)|\;x^2+y^2<1\}\)
  4. \(\{(x,y)|\;y≤x^2+1\}\)

e qualquer relação com desigualdade.

Se a relação plana \(f\) é uma função real de variável real, então existe uma lei matemática \(f\) que associa cada valor da abscissa a apenas um valor da ordenada denotada por \(y=f(x)\) ou \(f:x\mapsto y\). A variável que representa o valor da abscissa \(x\) é chamada de variável independente de \(f\). A variável que representa o valor da ordenada \(y\) é chamada de variável dependente de \(f\). Note que a função relaciona a variável independente à dependente por meio de uma igualdade. Dessa forma, toda reta paralela à ordenada \(y\) encontra o gráfico da função em, no máximo, um ponto e vice-versa.

Fig. 3.8. O domínio e a imagem de uma função.

Fig. 3.8. O domínio e a imagem de uma função.

O conjunto de números reais da variável independente para o qual a função produz um número real é chamado de domínio e é denotado por \(D(f)\), isto é, \(x\in D(f)\) se \(f(x)\in \mathbb{R}\). O conjunto de números reais da variável independente, isto é, números reais resultantes da aplicação da função, é chamado de imagem e é denotado por \(Im(f)\).

Por exemplo, os conjuntos domínio e imagem da função \(f(x)=1-2x\), \(x\in \mathbb{R}\), são, respectivamente, \(D(f)=\mathbb{R}\) e \(Im(f)=\mathbb{R}\). Note que \(x\in \mathbb{R}\) faz parte da definição da função impondo uma restrição ao domínio.

A função e sua restrição de domínio podem ser expressas integradamente da seguinte maneira:

  • \(f(x)\), \(x\in A \iff f(x)×I_{x\in A}\), sendo que \(I_{x\in A}=1\) se \(x\in A\) e \(I_{x\in A}=0\) se \(x\notin A\), \(A\subseteq R\).

Por exemplo, a função \(f(x)=1-2x\), \(x\in\mathbb{R}_{+}\), é equivalente a \(f(x)=(1-2x) I_{x\in\mathbb{R}_{+}}\).

Gráfico

O gráfico da função \(f\) é o conjunto dos pares ordenados \((x,f(x))\), sendo denotado por \(G(f) = \{(x,f(x))|\;x\in D(f)\}\).

plot 1-2x

demo_plot01.R

Composta

A função \(f\) da função \(g\) é chamada de função composta \(f \circ g\) ou \(f(g)\).

Por exemplo, se \(f(x)=x+1\) e \(g(x)=x^{2}\):

  1. \(f(g(x))=g(x)+1=x^{2}+1\)
  2. \(g(f(x))=(f(x))^{2}=(x+1)^{2}\)

f(g(x)) where f(x) = x + 1, g(x) = x^2

demo_plot02.R

g(f(x)) where f(x) = x + 1, g(x) = x^2

demo_plot02b.R

O exemplo anterior mostra que função composta não é comutativa.

Bijetora

A função \(f\) é chamada de bijetora ou um-a-um se e somente \(x_{1}\in D(f)\), \(x_{2}\in D(f)\) e \(x_{1}\ne x_{2}\), então \(f(x_{1})\ne f(x_{2})\).

Se a função \(f\) é bijetora no domínio \(D(f)\), então ela é bijetora num subconjunto desse domínio. Em outras palavras cada abscissa do domínio corresponde a apenas uma ordenada da imagem e vice-versa ou ainda cada abscissa e cada ordenada podem fazer parte de apenas um par ordenado.

E.g.:

  1. Bijetora: \(f(x)=x^{2}\), \(x\in\mathbb{R}_{+}\)
  2. Não bijetora: \(f(x)=x^{2}\), \(x\in\mathbb{R}\)

plot x^2, x:0 to 5

plot x^2, x:-5 to 5

Inversa

Se a função \(f\) é bijetora, então tem função bijetora denominada inversa e denotada por \(f^{-1}=\{(y,x)|\;(x,y)\in f\}\), sendo que \(D(f^{-1})=Im(f)\) e \(Im(f^{-1})=D(f)\).

Por exemplo, a função bijetora \(f(x)=x^{2}\), \(x\in\mathbb{R}_{+}\), tem a função inversa \(f^{-1}(x)=\pm\sqrt[2]{x}\), \(x\in\mathbb{R}_{+}\).

inverse x^2

inverse ln(x)

inverse 1/x

A função inversa de função composta \(f(g(x))^{-1}=(f\circ g)^{-1}(x)\) é igual a \(g^{-1}(f^{-1}(x)))=(g^{-1}\circ f^{-1})(x)\).

Constante

A função constante ou polinomial de grau 0 é definida como \(f(x)=k\), \(x\in\mathbb{R}\) e \(k\in\mathbb{R}\).

A função constante tem \(D(f)=\mathbb{R}\) e \(Im(f)=\{k\}\).Portanto, esta função não é bijetora.

plot y=2

Linear

A função linear ou polinomial de grau 1 é definida como \(f(x)=ax+b\), \(x\in\mathbb{R}\), \(b\in\mathbb{R}\) e \(a\in\mathbb{R^{*}}\).

A função linear tem \(D(f)=\mathbb{R}\) e \(Im(f)=\mathbb{R}\). Portanto, esta função é bijetora.

  • \(a=\dfrac{y_{1}-y_{0}}{x_{1}-x_{0}},\; x_{1}\ne x_{0}\)

  • \(b=y_{0}-ax_{0}\)

Fig. 3.14. Construção da reta da equação y = ax + b usando o gráfico de y = ax.

Fig. 3.14. Construção da reta da equação y = ax + b usando o gráfico de y = ax.

Fig. 3.15. Os incrementos &Delta;x e &Delta;y para uma função linear.

Fig. 3.15. Os incrementos Δx e Δy para uma função linear.

plot y=5x-1

plot y=x

Fig. 3.13. A pressão arterial medida de duas maneiras diferentes. Sejam x e y as medidas no mesmo indivíduo. Sem erros de medidas teríamos y = x. O gráfico é uma linha reta com &alpha; = 45° como ângulo de inclinação.

Fig. 3.13. A pressão arterial medida de duas maneiras diferentes. Sejam x e y as medidas no mesmo indivíduo. Sem erros de medidas teríamos y = x. O gráfico é uma linha reta com α = 45° como ângulo de inclinação.

Elasticidade: análise de sensibilidade relativa da função

Elasticity of a function: Wikipedia

A elasticidade a sensibilidade relativa da função \(f(x)\) a mudanças de 1% em \(x\).

Elasticidade instantânea da função \(f(x)=ax+b\) no ponto \((x,f(x))\) é expressa matematicamente por:

\[ \eta(x)=\left|\dfrac{ax}{f(x)}\right| \]

A variação de 1% de \(x\) causa a variação de \(\eta(x)\)% de \(f(x)\).

A elasticidade no ponto \((x,f(x))\) é:

  1. Elástica se o valor absoluto da elasticidade é maior que 1, isto é, \(\eta(x)>1\);
  2. Inelástica se o valor absoluto da elasticidade é menor que 1, ou seja, \(\eta(x)<1\);
  3. Isoelástica se o valor absoluto da elasticidade é igual a 1, isto é, \(\eta(x)=1\);
  4. Totalmente inelástica se a elasticidade é nula, isto é, \(\eta(x)=0\);
  5. Totalmente elástica se ela é infinita, isto é, \(\eta(x)=\infty\).

Exemplo: Estatatura e massa corporal total de estudante de Medicina da USP

Os dados biométricos de 277 estudantes do sexo masculino do curso de Medicina da USP de três turmas foram usados para estimar a reta de regressão da relação entre estatatura (\(E\) em cm) e massa corporal total (\(M\) em kg):

\[\widehat{M} = 0.9133 - 89.465\times E\]

dados <- as.data.frame(readxl::read_excel("Biometria_qst.xls", 
                                          col_type=c("text", "text",
                                                     "numeric", "numeric")))
dados$sexo <- factor(dados$sexo)
dados <- subset(dados, sexo=="M")
print(head(dados[-1]))
   sexo peso altura
2     M   68    173
3     M   82    175
7     M   73    175
8     M   73    175
9     M   60    173
10    M   75    182
print(tail(dados[-1]))
    sexo peso altura
537    M   65    170
538    M   95    190
541    M   63    177
542    M   70    188
548    M   70    175
549    M   67    171
print(summary(dados[-1]))
 sexo         peso           altura     
 F:  0   Min.   : 43.0   Min.   :155.0  
 M:277   1st Qu.: 62.0   1st Qu.:171.0  
         Median : 70.0   Median :175.0  
         Mean   : 70.7   Mean   :175.4  
         3rd Qu.: 77.0   3rd Qu.:180.0  
         Max.   :125.0   Max.   :195.0  
         NA's   :4       NA's   :4      
modelo <- lm(peso~altura, data=na.omit(dados))
sunflowerplot(peso~altura, data=na.omit(dados),
              xlab="Estatura(cm)", ylab="Massa(kg)",
              main="Estudante Medicina Masculino")
abline(reg=modelo)

reg <- summary(modelo)
print(reg)

Call:
lm(formula = peso ~ altura, data = na.omit(dados))

Residuals:
    Min      1Q  Median      3Q     Max 
-24.622  -6.929  -0.582   4.898  53.725 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) -89.46495   15.07636  -5.934    9e-09 ***
altura        0.91330    0.08589  10.633   <2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 10.27 on 271 degrees of freedom
Multiple R-squared:  0.2944,    Adjusted R-squared:  0.2918 
F-statistic: 113.1 on 1 and 271 DF,  p-value: < 2.2e-16
min.altura <- min(dados$altura,na.rm=TRUE)
max.altura <- max(dados$altura,na.rm=TRUE)
a <- reg$coefficients[1,1]
b <- reg$coefficients[2,1]
ve <- seq(min.altura,max.altura,length.out=10000)
vd <- a + b*ve
elasticidade <- b*ve/vd
plot(ve,
     elasticidade,
     main="Estudante Medicina Masculino
     e = 0.9133*x/(-89.465 + 0.9133*x)",
     xlab="Estatura(cm)", ylab="Elasticidade(%)",
     lwd=2,type="l")
curve(b*x/(a + b*x), min.altura, max.altura, 
      add=TRUE, col="blue")
grid()

# elasticidade no centroide
m.ve <- mean(dados$altura,na.rm=TRUE)
m.vd <- mean(dados$peso,na.rm=TRUE)
m.elasticidade <- b*m.ve/m.vd
cat("Elasticidade:\n")
Elasticidade:
cat("\tminima:",round(min(elasticidade,na.rm=TRUE),2),"\n")
    minima: 2.01 
cat("\tmaxima:",round(max(elasticidade,na.rm=TRUE),2),"\n")
    maxima: 2.72 
cat("\tcentróide:",round(m.elasticidade,2),"\n")
    centróide: 2.27 
cat("\nElasticidade(170) =", round(b*170/(a + b*170),2))

Elasticidade(170) = 2.36

Exemplo 3.6.2. Reação fotoquímica em Typha latifolia (taboa de folha larga)

O 2,6-diclorofenolindofenol (DCPIP, DCIP ou DPIP) pode ser usado para medir a taxa de fotossíntese. Ele faz parte da família de reagentes de Hill. Em um estudo sobre a redução do DCPI pela luz, McNaughton (1967) relata que a reação fotoquímica em Typha latifolia (taboa de folha larga) é tanto mais eficiente quanto maior a altitude em que as plantas dessa espécie crescem. Mais precisamente, McNaughton descobriu que a chamada atividade de Hill é uma função quase linear do período sem geada no local onde as plantas vivem.

Fig. 3.17. Typha latifolia crescendo em locais com um período sem geadas mais curto mostra uma maior atividade Hill do que em locais com um período sem geadas mais longo.

Fig. 3.17. Typha latifolia crescendo em locais com um período sem geadas mais curto mostra uma maior atividade Hill do que em locais com um período sem geadas mais longo.

A Fig. 3.17 é um diagrama da reta ajustada aos dados. Vamos primeiro determinar a equação. Denotamos o período livre de gelo por \(x\) (em dias) e a atividade de Hill por \(y\) (em unidades Hill = μMoles de 2,6-diclorofenolindofenol por mg de clorofila por minuto). Na linha reta decrescente, escolhemos dois pontos que não estão próximos, digamos

\(x_{0}\) = 100 dias; \(y_{0}\) = 42 unidades Hill

\(x_{1}\) = 300 dias; \(y_{1}\) = 21 unidades Hill

  • \(a = \dfrac{y_{1}-y_{0}}{x_{1}-x_{0}} = \dfrac{21-42}{300-100} =-0.105\)

  • \(b=y_{0}-ax_{0}=42-(-0.105)\times 100=52.5\)

\[ y = -0.105x + 52.5 \]

plot y = -0.105 x + 52.5 , x:0 to 500, axes labels "dia" "Hill"

eta = abs(250 (-0.105)/(-0.105 250 + 52.5))

A função de atividade de Hill varia 1% se ocorrer a variação de 1% no dia 250. Portanto, a função é isoelástica neste ponto.

eta = abs(125 (-0.105)/(-0.105 125 + 52.5))

A função de atividade de Hill varia \(0.\bar{3}\)% se ocorrer a variação de 1% no dia 125. Portanto, a função é inelástica neste ponto.

eta = abs(375 (-0.105)/(-0.105 375 + 52.5))

A função de atividade de Hill varia 3% se ocorrer a variação de 1% no dia 375. Portanto, a função é elástica neste ponto.

O gráfico da elasticidade é:

plot eta = abs(x ( -0.105)/(-0.105 x + 52.5)), x:0 to 400, axes labels "x", "eta"

Limitada

A função é limitada se uma das extremidades da imagem é um número real. Por exemplo, a função modular \(f(x)=|x|\) tem \(D(f)=\mathbb{R}\) e \(I(f)=\mathbb{R}_{+}=[0,+\infty[\).

Dessa forma, a função modular é limitada inferiormente pelo 0 e não é limitada superiormente; a função sinal é limitada inferiormente e superiormente por -1 e 1, respectivamente; a função linear não é limitada inferiormente e superiormente.

f(x)=|x|

Máximo e mínimo

A função limitada tem valor máximo e/ou mínimo.

Por exemplo, o mínimo da função modular é 0 e não tem máximo; o máximo e o mínimo da função sinal são 1 e -1, respectivamente; a função linear não tem máximo e mínimo.

|x|

min |x|

max |x|

sgn(x)

min sgn(x)

max sgn(x)

Crescente & decrescente

A função \(f\) é crescente num intervalo do domínio \([x_{1},x_{2}]\subset D(f)\), \(x_{2}>x_{1}\), se \(x^{"}>x^{\prime}\) implica \(f(x^{"})\ge f(x^{\prime})\), para todos \(x^{\prime} \in [x_{1},x_{2}]\) e \(x^{"} \in [x_{1},x_{2}]\).

A função \(f\) é estritamente crescente num intervalo do domínio \([x_{1},x_{2}]\subset D(f)\), \(x_{2}>x_{1}\), se \(x^{"}>x^{\prime}\) implica \(f(x^{"})> f(x^{\prime})\), para todos \(x^{\prime} \in [x_{1},x_{2}]\) e \(x^{"} \in [x_{1},x_{2}]\).

Por exemplo, a função linear com coeficiente angular positivo, isto é, \(f(x)=ax+b\), \(a>0\), é estritamente crescente em qualquer intervalo de seu domínio.

A função \(f\) é decrescente num intervalo do domínio \([x_{1},x_{2}]\subset D(f)\), \(x_{2}>x_{1}\), se \(x^{"}>x^{\prime}\) implica \(f(x^{"})\le f(x^{\prime})\), para todos \(x^{\prime} \in [x_{1},x_{2}]\) e \(x^{"} \in [x_{1},x_{2}]\).

A função \(f\) é estritamente decrescente num intervalo do domínio \([x_{1},x_{2}]\subset D(f)\), \(x_{2}>x_{1}\), se \(x^{"}>x^{\prime}\) implica \(f(x^{"})< f(x^{\prime})\), para todos \(x^{\prime} \in [x_{1},x_{2}]\) e \(x^{"} \in [x_{1},x_{2}]\).

Por exemplo, a função linear com coeficiente angular negativo, isto é, \(f(x)=ax+b\), \(a<0\), é estritamente decrescente em qualquer intervalo de seu domínio.

A função é monotonicamente crescente em seu domínio se não é decrescente em nenhum intervalo.

A função é monotonicamente decrescente em seu domínio se não é crescente em nenhum intervalo.

Toda função monótona é inversível e vice-versa.

Fig. 6.5. Exemplos de funções monótonas.

Fig. 6.5. Exemplos de funções monótonas.

Fig. 6.4. Gráfico de uma função que não é monótona. Portanto, a função inversa não existe. A um dado y correspondem vários valores de x.

Fig. 6.4. Gráfico de uma função que não é monótona. Portanto, a função inversa não existe. A um dado y correspondem vários valores de x.

where is 1/x increasing?

where is x^2 increasing?

where is 2^(-x) increasing?

Raiz

A raiz da função é o número real \(x\) que a anula, isto é, o número real \(x\) tal que \(f(x)=0\) é chamado de raiz da função \(f\).

Por exemplo, \(0\) é raiz da função modular, pois \(f(0)=|0|=0\).

roots |x|

roots x^2 - 1

Contínua

A função é contínua no par ordenado \((x,f(x))\), se o ponto de seu gráfico não provoca um salto.

Por exemplo:

  • a função linear é contínua em todos os pontos de seu gráfico;

  • a função sinal é descontínua em \((0,0)\).

discontinuities sgn x

discontinuities 1/x

Is f(x)=log(x) continuous over the reals?

Is f(x)=abs(x) continuous over the reals?

Lisa

A função é lisa no par ordenado \((x,f(x))\) se ele não provoca uma cúspide no gráfico.

Por exemplo:

  • a função linear é lisa em todos os pontos;

  • a função modular tem uma cúspide em \((0,0)\).

Homogênea

A função \(f\) é homogênea se \(f(hx)=hf(x)\).

Por exemplo:

  • a função linear \(f(x)=ax+b\) não é homogênea, pois \(f(hx)=a(hx)+b=hax+b\ne hf(x)=hax+hb\);

  • a função potência \(f(x)=x^{a}\) é homogênea, pois \(f(hx)=(hx)^{a}=h^{a}x^{a}=h^{a}f(x)\).

Côncava e convexa

Função convexa

Função convexa

A função \(f\) é côncava para cima ou convexa no intervalo \([x_{1},x_{2}]\subset D(f)\), \(x_{2}>x_{1}\), se e somente se \(f(x)\le t\; f(x^{\prime})+(1-t)f(x^{"})\), \(t\in [0,1]\), para todos \(x^{\prime} \in [x_{1},x_{2}]\) e \(x^{"} \in [x_{1},x_{2}]\), sendo que \(x=t x^{\prime}+(1-t)x^{"}\).

A soma de duas funções convexas é função convexa.

A função \(f\) é estritamente côncava para cima ou convexa no intervalo \([x_{1},x_{2}]\subset D(f)\), \(x_{2}>x_{1}\), se e somente se \(f(x)< t\; f(x^{\prime})+(1-t)f(x^{"})\), \(t\in [0,1]\), para todos \(x^{\prime} \in [x_{1},x_{2}]\) e \(x^{"} \in [x_{1},x_{2}]\), sendo que \(x=t x^{\prime}+(1-t)x^{"}\).

Por exemplo:

  • A função linear é convexa, mas não é estritamente convexa; dessa forma, a função linear é côncava e convexa, mas não é estritamente côncava e nem estritamente convexa;

  • a função polinomial quadrática com o coeficiente do monômio de maior potência positivo é côncava em seu domínio, isto é, \(f(x)=ax^{2}+bx+c\), \(a>0\).

A função \(f\) é côncava para baixo ou côncava no intervalo \([x_{1},x_{2}]\subset D(f)\), \(x_{2}>x_{1}\), se e somente se \(f(x)\ge t\; f(x^{\prime})+(1-t)f(x^{"})\), \(t\in [0,1]\), para todos \(x^{\prime} \in [x_{1},x_{2}]\) e \(x^{"} \in [x_{1},x_{2}]\), sendo que \(x=t x^{\prime}+(1-t)x^{"}\).

A soma de duas funções côncavas é função côncava.

A função \(f\) é estritamente côncava para baixo ou côncava no intervalo \([x_{1},x_{2}]\subset D(f)\), \(x_{2}>x_{1}\), se e somente se \(f(x)> t\; f(x^{\prime})+(1-t)f(x^{"})\), \(t\in [0,1]\), para todos \(x^{\prime} \in [x_{1},x_{2}]\) e \(x^{"} \in [x_{1},x_{2}]\), sendo que \(x=t x^{\prime}+(1-t)x^{"}\).

Por exemplo:

  • a função linear é côncava, mas não é estritamente côncava;

  • a função polinomial quadrática com o coeficiente do monômio de maior potência negativo é côncava em seu domínio, isto é, \(f(x)=ax^{2}+bx+c\), \(a<0\).

Inflexão

A função tem inflexão em seu gráfico se há mudança de concavidade.

Por exemplo:

  • a função polinomial quadrática não tem inflexão;

  • a função polinomial cúbica tem uma inflexão.

x^3

inflection points x^3

Assíntota

A assíntota da função é uma relação ou função para a qual o gráfico da função tende.

Por exemplo:

  • o eixo das abscissas (função linear) e o eixo das ordenadas (relação) são assíntotas da função recíproca \(f(x) = 1/x\).

asymptotes 1/x

asymptote (1/2)^x

asymptote 1/x^2

asymptote x/(1-x^2)

asymptotes (x^2+1)/(x-1)

asymptote log(x)

asymptote sin(x)

asymptote (1+x^2+x^3)/x

Ajuste de curva

No contexto puramente matemático, o ajuste de curva envolve encontrar uma função que passe tão próximo quanto possível de um conjunto de pontos dados, minimizando algum tipo de discrepância entre a curva e os pontos. Diferentemente da abordagem estatística, que frequentemente envolve inferência sobre os erros ou a variabilidade dos dados, o ajuste de curva matemático pode se concentrar simplesmente na minimização de um erro ou numa discrepância geométrica sem atribuir interpretações estatísticas a esse erro.

  • Exemplo: Exercício 7.2.9

A atividade enzimática da catalase é perdida durante a exposição à luz solar na presença de oxigênio. Seja y a concentração de catalase (em µg/10 ml) como função do tempo t (em minutos). Qual é a função mais adequada para representar graficamente os seguintes dados (de Mitchell e Anderson, 1965)?

t (minuto) y (µg/10 ml)
0 121
10 74
30 30
50 12
60 6.7
70 3.7
80 2.0

t <- c(0.1, 10, 30, 50, 60, 70, 80)
y <- c(121, 74, 30, 12, 6.7, 3.7, 2.0)
plot(t,y)

round(cor(t,y, method="pearson"), 4)
[1] -0.922
round(cor(t,y, method="spearman"), 4)
[1] -1
print(REAT::curvefit(t, y, print.results=FALSE)$models_comp, digits=3)

                 a       b Std. Error a Std. Error b t value a t value b
Linear       94.65 -1.3767       13.252      0.25848      7.14     -5.33
Power        64.65 -0.5137        0.271      0.17284      6.67     -2.97
Exponential 128.86 -0.0504        0.071      0.00139     68.39    -36.36
Logistic     -3.79  0.1095        1.332      0.02597     -2.84      4.22
            Pr(>|t|) a Pr(>|t|) b R squared Adj. R squared F value   Pr(>F)
Linear        8.36e-04   3.12e-03     0.850          0.820   28.37 3.12e-03
Power         1.14e-03   3.11e-02     0.639          0.566    8.83 3.11e-02
Exponential   1.27e-08   2.96e-07     0.996          0.995 1322.15 2.96e-07
Logistic      3.61e-02   8.37e-03     0.780          0.736   17.77 8.37e-03

Entre os modelos testados com dois parâmetros, o melhor modelo é o exponencial, pois tem o maior \(R^2\).

No WolframAlpha, se a quantidade de pontos observados é pequena, pode ser usado, por exemplo, o comando linear fit {{,},{,},...}.

linear fit {{0,121},{10,74},{30,30},{50,12},{60,6.7},{70,3.7},{80,2.0}}

exponential fit {{0,121},{10,74},{30,30},{50,12},{60,6.7},{70,3.7},{80,2.0}}

best fit {{0,121},{10,74},{30,30},{50,12},{60,6.7},{70,3.7},{80,2.0}}

Equação

Sabe-se que 100 g de soja seca contém 35 g de proteína e 100 g de lentilha seca contém 26 g de proteína. Homens de tamanho médio que vivem em um clima moderado precisam de 70 g de proteína em sua alimentação diária.

Suponha que um homem deseja consumir esses 70 g de proteína diariamente comendo soja e/ou lentilhas.

Seja \(x\) a quantidade de soja e \(y\) a quantidade diária de lentilhas (\(x\) e \(y\) medidos em unidades de 100 g).

Qual é a relação entre \(x\) e \(y\)?

A proteína ingerida com soja é \(35x\) e com lentilhas \(26y\) por dia (ambas medidos em g). A quantidade diária total de proteína é de 70 g.

Daí obtemos a equação (função implícita):

\[ 35x+26y=70 \]

Reorganizando os termos, podemos expressar \(y\) como uma função explícita de \(x\):

\[ y = - \dfrac{35}{26} x + \dfrac{70}{26} \]

ou

\[ y = (-1.35) x + 2.69 \]

O segmento de reta no primeiro quadrante representa todas as combinações possíveis de lentilha e soja que fornecem 70 g/dia de proteína.

plot y = -(35/26) x + 70/26, x:0 to 2, axes labels "soja (100g)" "lentilha (100g)"

eta = abs(1 (-(35/26))/(-(35/26) 1 + 70/26))

A função da quantidade de lentilhas varia 1% se ocorrer a variação de 1% na quantidade de 100 g de soja. Portanto, a função é isoelástica neste ponto.

eta = abs(0.5 (-(35/26))/(-(35/26) 0.5 + 70/26))

A função da quantidade de lentilhas varia \(0.\bar{3}\)% se ocorrer a variação de 1% na quantidade de 50 g de soja. Portanto, a função é inelástica neste ponto.

eta = abs(1.5 (-(35/26))/(-(35/26) 1.5 + 70/26))

A função da quantidade de lentilhas varia 3% se ocorrer a variação de 1% na quantidade de 150 g de soja. Portanto, a função é elástica neste ponto.

A função de elasticidade é:

eta = abs(x (-(35/26))/(-(35/26) x + 70/26)), x:0 to 2

\[\Diamond\]

Generalizando este exemplo consideramos a equação linear

\[ Ax+By+C=0 \]

que é equivalente à fórmula explícita

\[ y = - \dfrac{A}{B} x - \dfrac{C}{B} \]

ou

\[ y = ax + b \]

desde que \(B\ne 0\). Se \(B = 0\), \(y\) não pode ser uma função de \(x\).

solve A x+B y+C=0 for y

Inequação

Vamos agora generalizar um pouco o exemplo anterior.

Suponha que um homem queira comer soja e lentilhas para obter pelo menos 70 g de proteína por dia. Então temos que substituir o sinal de igualdade pelo sinal de “maior que ou igual a”. Assim obtemos a desigualdade implícita (também chamada de inequação implícita)

\[ 35x+26y\ge 70 \]

Desigualdades desse tipo geralmente ocorrem em problemas de “misturar” dois tipos de “oportunidades”, como misturar nutrição, suprimentos, plâncton, culturas de bactérias etc.

A questão é a mesma de antes: Quais são os pares possíveis \((x, y)\) que satisfazem a inequação?

Para encontrar uma maneira prática, primeiro resolva a inequação implícita em relação a \(y\).

A inequação explícita ou relação linear é:

\[ y \ge -1.35 x +2.69 \]

A área acima do segmento de reta no primeiro quadrante representa todas as combinações possíveis de lentilha e soja que fornecem pelo menos 70 g/dia de proteína.

plot y >= -(35/26)x + 70/26, x:0 to 3, y:0 to 3, axes labels "soja (100g)" "lentilha (100g)"

Programação Linear

Costuma-se dizer que o ótimo é inimigo do bom. De fato, do ponto de vista matemático, é mais fácil encontrar uma boa solução do que uma ótima. Os métodos heurísticos buscam soluções suficientemente boas. Porém, o desafio de encontrar a solução ótima de um problema é tratado nesta parte. Uma solução ótima significa que não há outra solução que seja superior à encontrada. De forma concreta, a missão do capítulo desta parte é achar a melhor solução matemática de funções sujeitas às restrições de domínio.

Em problemas de otimização com restrições, busca-se maximizar ou minimizar uma ou mais funções que medem o desempenho do sistema, denominadas funções-objetivo, e estas dependem de variáveis independentes que podem estar relacionadas por meio inequações e ou equações, conhecidas como restrições. Uma função-objetivo pode ser uma função de lucro total, custo total, produção, utilidade, risco, ganho, perda etc. As restrições expressam o conhecimento do analista do problema com relação às limitações dos recursos necessários, das leis e regras envolvidas na situação, dos interesses dos envolvidos no problema e das limitações intrinsecamente matemáticas decorrentes da modelagem do problema etc.

O conceito de otimização é um dos que mais contribuem para uma compreensão mais nítida da estrutura lógica de importantes temas da teoria econômica e de modo geral das ciências sociais aplicadas. É comum estabelecer suposições de otimização ao discutir o comportamento da empresa, do consumidor e de outros agentes econômicos.

A programação matemática é parte integrante e importante dos métodos de otimização. Os problemas de programação matemática são utilizados para alocar recursos escassos para usos alternativos para satisfazer um objetivo.

O programa mais simples consiste em uma estrutura composta por uma função-objetivo a ser maximizada ou minimizada sujeita a um conjunto de restrições em seu domínio por meio de equações e/ou inequações envolvendo as variáveis independentes. As variáveis independentes que são controláveis pelo analista são denominadas variáveis de decisão ou de controle. Uma solução que satisfaz a todas as restrições e maximiza ou minimiza a função-objetivo é chamada solução ótima.

A programação linear mais que uma simples técnica de otimização é uma linguagem pela qual uma miríade de problemas em ciências da vida pode ser expressa, solucionada, e informações importantes são geradas para melhorar qualidade da tomada de decisão.

A programação linear consiste na maximização ou minimização de uma função-objetivo linear sujeita a restrições lineares. Uma função-objetivo linear é composta por uma combinação linear das variáveis de decisão ou de controle.

Os coeficientes da combinação linear em geral são constantes com valores conhecidos. As restrições são combinações lineares das variáveis de decisão ou de controle e seus coeficientes são em geral constantes conhecidas. O problema consiste em determinar os valores das variáveis de decisão que maximizam ou minimizam a função-objetivo e respeitam todas as restrições.

O conjunto de restrições lineares produz uma região poligonal convexa que é chamada de região de pontos viáveis. Como a função-objetivo é linear, então a solução pode ser um vértice ou aresta da região de pontos viáveis. O método que investiga os vértices é chamado de Simplex. George Dantzig em 1947 desenvolveu este algoritmo enquanto trabalhava na Força Aérea dos Estados Unidos, visando otimizar a logística e a alocação de recursos durante a Segunda Guerra Mundial.

Problemas biológicos desse tipo às vezes são mais complexos. Em vez de apenas uma desigualdade, mais delas devem ser satisfeitas. Além disso, algumas propriedades ótimas podem ser necessárias. Problemas desse tipo são hoje tratados sob o título de programação linear. Concluímos esta seção com um exemplo típico.

Exemplo 1: Dois contadores de bactérias

Num laboratório existem dois contadores de bactérias disponíveis. O balcão \(C_{1}\) pode ser operado por um aluno de pós-graduação que ganha 2 dólares por hora. Em média, ele consegue contar seis amostras por hora. O contador \(C_{2}\) é mais rápido, mas também mais sofisticado. Só uma pessoa bem treinada ganhando 5 dólares a hora pode operá-la. Com a mesma precisão do \(C_{1}\), o contador \(C_{2}\) permite dez contagens por hora. Há 1000 amostras a serem contadas dentro de um período de tempo não superior a 80 horas para cada contador. Por quanto tempo cada um dos dois contadores deve ser usado para executar a tarefa com um custo mínimo?

Seja \(x\) o número de horas em que o contador \(C_{1}\) é operado e \(y\) o número correspondente para \(C_{2}\). Obtemos então a seguinte tabela:

Contador Amostras contadas/h Dólar/h Número de horas em operação
\(C_{1}\) 6 2 \(x\)
\(C_{2}\) 10 5 \(y\)

Como a tarefa deve ser realizada em até 80 horas em cada contador, obtemos as inequações

\[ 0\le x \le 80 \\ 0\le y \le 80 \]

\(C_{1}\) conta \(6x\) e \(C_{2}\) conta \(10y\) amostras. Ao todo eles contam

\[ 6x+ 10y = 1000 \]

amostras.

O custo para operar \(C_{1}\) é \(2x\), e para \(C_{2}\) o custo é \(5y\) (ambos valores em dólares). Portanto, o custo total é

\[ f(x,y)=2x+5y \]

e esta é a função-objetivo que deve ser minimizada.

Matematicamente:

Minimizar a função-objetivo \(2x+5y\)

Sujeita às restrições:

  1. \(x\le 80\)
  2. \(y\le 80\)
  3. \(6x+10y=1000\)
  4. \(x\ge 0\)
  5. \(y\ge 0\)

# demo_PL_Exemplo1.R
source("eiras.inequality.plot.R")

expression <- "-(6/10)*x+1000/10"
main <- expression("y = -(6/10) x+1000/10")
shading.areas <- c(FALSE,FALSE,FALSE,FALSE)
fnc.domain <- list(c("x<=80 & x>=0"))
fnc.range <- list(c("y<=80 & y>=0"))
inequality.plot(expression,
                main=main, 
                cex.main=1.5,
                fnc.domain=fnc.domain,
                fnc.range=fnc.range,
                shading.areas=shading.areas)
# A tibble: 583 × 2
       x     y
   <dbl> <dbl>
 1  33.4  80.0
 2  33.5  79.9
 3  33.6  79.9
 4  33.6  79.8
 5  33.7  79.8
 6  33.8  79.7
 7  33.9  79.7
 8  34.0  79.6
 9  34.0  79.6
10  34.1  79.5
# ℹ 573 more rows
curve(-(2/5)*x+420/5, 10, 85, add=TRUE)
abline(v=80,h=52, lty=2)

# demo_PL_Exemplo1_ompr.R
model0 <- ompr::MIPModel() # Initialize an empty model
model0 <- ompr::add_variable(model0, x, type = "continuous", lb = 0)
model0 <- ompr::add_variable(model0, y, type = "continuous", lb = 0)
model0 <- ompr::set_objective(model0, 2*x + 5*y, "min")
model0 <- ompr::add_constraint(model0, x <= 80) 
model0 <- ompr::add_constraint(model0, y <= 80) 
model0 <- ompr::add_constraint(model0, 6*x + 10*y == 1000) 
result0 <- ompr::solve_model(model0, 
                             ompr.roi::with_ROI(solver = "glpk"))
print(result0$solution)
 x  y 
80 52 
print(model0)
Mixed integer linear optimization problem
Variables:
  Continuous: 2 
  Integer: 0 
  Binary: 0 
Model sense: minimize 
Constraints: 3 
print(constr0 <- ompr::extract_constraints(model0))
$matrix
3 x 2 sparse Matrix of class "dgCMatrix"
         
[1,] 1  .
[2,] .  1
[3,] 6 10

$sense
[1] "<=" "<=" "=="

$rhs
[1]   80   80 1000
# Extract the constraints from model
constr00<- cbind(as.matrix(constr0$matrix), # Get matrix of data
                 as.matrix(constr0$sense), # Get inequalities
                 as.matrix(constr0$rhs)) # Get right hand sides
rownames(constr00) <-c ('C1: Teto #hora','C2: Teto #hora','#Amostras')
out <- kableExtra::kbl(constr00, booktabs=TRUE, align='rrcr',
                       caption="Elementos das Restrições",
                       col.names = c('C1', 'C2','Relação','RHS'))
kableExtra::kable_styling(out, latex_options = "hold_position")
Elementos das Restrições
C1 C2 Relação RHS
C1: Teto #hora 1 0 <= 80
C2: Teto #hora 0 1 <= 80
#Amostras 6 10 == 1000
res0 <- cbind(ompr::objective_value(result0),
              ompr::get_solution(result0, x),
              ompr::get_solution(result0, y))
colnames(res0) <- list("$","C1 (h)","C2 (h)")
rownames(res0) <- list("Solução")
tab <- kableExtra::kbl(res0, booktabs = TRUE, 
                       caption = "Exemplo 1: Dois contadores de bactérias")
kableExtra::kable_styling(tab, 
                          latex_options = "hold_position")
Exemplo 1: Dois contadores de bactérias
$ C1 (h) C2 (h)
Solução 420 80 52

import pulp # pip install glpk

# Criando o problema de maximização
myLP = pulp.LpProblem("MyLPProblem", pulp.LpMinimize)

# Definição das variáveis
x = pulp.LpVariable('x', lowBound=0, cat='Continuous')  # x >= 0
y = pulp.LpVariable('y', lowBound=0, cat='Continuous')  # y >= 0

# Função objetivo
myLP += 2 * x + 5 * y, "Z"

# Restrições
myLP += x <= 80, "Constraint_1"
myLP += y <= 80, "Constraint_2"
myLP += 6*x + 10*y == 1000, "Constraint_3"

# Exibir o problema
print(myLP)
MyLPProblem:
MINIMIZE
2*x + 5*y + 0
SUBJECT TO
Constraint_1: x <= 80

Constraint_2: y <= 80

Constraint_3: 6 x + 10 y = 1000

VARIABLES
x Continuous
y Continuous
# myLP.writeLP("LP.lp")

# Resolver o problema
status = myLP.solve(pulp.GLPK_CMD(msg=False))

# Mostrar resultados
print("Status:", pulp.LpStatus[status])
Status: Optimal
print("x =", x.varValue)
x = 80.0
print("y =", y.varValue)
y = 52.0
print("Z* =", pulp.value(myLP.objective))
Z* = 420.0

0<=x<=80, 0<=y<=80, 6x+10y=1000

2x+5y

6x+10y=1000 where y=80

6x+10y=1000 where x=80

2x+5y where x=100/3 and y=80

\[ 2\times \dfrac{100}{3}+5\times 80=\dfrac{1400}{3}\approx 467 \]

2x+5y where x=80 and y=52

\[ 2\times 80+5\times 52=420 \]

minimize 2x+5y for 0<=x<=80, 0<=y<=80, 6x+10y=1000

LinearProgramming[{2,5}, {{1,0}, {0,1}, {6,10}}, {{80,-1}, {80,-1}, {1000,0}}]

Portanto, a despesa é minimizada, 420 dólares, se os contadores \(C_{1}\) e \(C_{2}\) são usados 80 e 52 horas, respectivamente.

Exemplo 2: Dois contadores de bactérias II

Minimizar \(2x+5y\)

Restrições:

  1. \(x\le 80\)
  2. \(y\le 80\)
  3. \(6x+10y\ge 1000\)
  4. \(x\ge 0\)
  5. \(y\ge 0\)

# demo_PL_Exemplo2.R
A <- matrix(c(1, 0, 
              0, 1, 
              -6, -10, 
              -1, 0,
              0, -1), 
            nrow = 5,
            ncol = 2, byrow = TRUE)
b <- c(80, 80, -1000, 0, 0)
obj <- c(2, 5)
print(gMOIP::plotPolytope(A,
                          b,
                          obj,
                          type = rep("c", ncol(A)),
                          crit = "min",
                          faces = rep("c", ncol(A)),
                          plotFaces = TRUE,
                          plotFeasible = TRUE,
                          plotOptimum = TRUE,
                          labels = "coord"))

# demo_PL_Exemplo2_ompr.R
model0 <- ompr::MIPModel() # Initialize an empty model
model0 <- ompr::add_variable(model0, x, type = "continuous", lb = 0)
model0 <- ompr::add_variable(model0, y, type = "continuous", lb = 0)
model0 <- ompr::set_objective(model0, 2*x + 5*y, "min")
model0 <- ompr::add_constraint(model0, x <= 80) 
model0 <- ompr::add_constraint(model0, y <= 80) 
model0 <- ompr::add_constraint(model0, 6*x + 10*y >= 1000) 
result0 <- ompr::solve_model(model0, 
                             ompr.roi::with_ROI(solver = "glpk"))
print(result0$solution)
 x  y 
80 52 
print(model0)
Mixed integer linear optimization problem
Variables:
  Continuous: 2 
  Integer: 0 
  Binary: 0 
Model sense: minimize 
Constraints: 3 
print(constr0 <- ompr::extract_constraints(model0))
$matrix
3 x 2 sparse Matrix of class "dgCMatrix"
         
[1,] 1  .
[2,] .  1
[3,] 6 10

$sense
[1] "<=" "<=" ">="

$rhs
[1]   80   80 1000
# Extract the constraints from model
constr00<- cbind(as.matrix(constr0$matrix), # Get matrix of data
                 as.matrix(constr0$sense), # Get inequalities
                 as.matrix(constr0$rhs)) # Get right hand sides
rownames(constr00) <-c ('C1: Teto #hora','C2: Teto #hora','#Amostras')
out <- kableExtra::kbl(constr00, booktabs=TRUE, align='rrcr',
                       caption="Elementos das Restrições",
                       col.names = c('C1', 'C2','Relação','RHS'))
kableExtra::kable_styling(out, latex_options = "hold_position")
Elementos das Restrições
C1 C2 Relação RHS
C1: Teto #hora 1 0 <= 80
C2: Teto #hora 0 1 <= 80
#Amostras 6 10 >= 1000
res0 <- cbind(ompr::objective_value(result0),
              ompr::get_solution(result0, x),
              ompr::get_solution(result0, y))
colnames(res0) <- list("$","C1 (h)","C2 (h)")
rownames(res0) <- list("Solução")
tab <- kableExtra::kbl(res0, booktabs = TRUE, 
                       caption = "Exemplo 2: Dois contadores de bactérias")
kableExtra::kable_styling(tab, 
                          latex_options = "hold_position")
Exemplo 2: Dois contadores de bactérias
$ C1 (h) C2 (h)
Solução 420 80 52

import pulp # pip install glpk

# Criando o problema de maximização
myLP = pulp.LpProblem("MyLPProblem", pulp.LpMinimize)

# Definição das variáveis
x = pulp.LpVariable('x', lowBound=0, cat='Continuous')  # x >= 0
y = pulp.LpVariable('y', lowBound=0, cat='Continuous')  # y >= 0

# Função objetivo
myLP += 2 * x + 5 * y, "Z"

# Restrições
myLP += x <= 80, "Constraint_1"
myLP += y <= 80, "Constraint_2"
myLP += 6*x + 10*y >= 1000, "Constraint_3"

# Exibir o problema
print(myLP)
MyLPProblem:
MINIMIZE
2*x + 5*y + 0
SUBJECT TO
Constraint_1: x <= 80

Constraint_2: y <= 80

Constraint_3: 6 x + 10 y >= 1000

VARIABLES
x Continuous
y Continuous
# myLP.writeLP("LP.lp")

# Resolver o problema
status = myLP.solve(pulp.GLPK_CMD(msg=False))

# Mostrar resultados
print("Status:", pulp.LpStatus[status])
Status: Optimal
print("x =", x.varValue)
x = 80.0
print("y =", y.varValue)
y = 52.0
print("Z* =", pulp.value(myLP.objective))
Z* = 420.0

0<=x<=80, 0<=y<=80, 6x+10y>=1000

2x+5y

minimize 2x+5y for 0<=x<=80, 0<=y<=80, 6x+10y>=1000

LinearProgramming[{2,5}, {{1,0}, {0,1}, {6,10}}, {{80,-1}, {80,-1}, {1000,1}}]

Portanto, a despesa é minimizada se o contador \(C_{1}\) for usado 80 horas e o contador \(C_{2}\) for usado 52 horas.

Exemplo 3: Máximo bem-estar

  • Fogiel, 1983, p. 1-3

Suponha que você queira decidir entre maneiras alternativas de passar um dia de oito horas, ou seja, deseja alocar seu tempo. Suponha que você ache cinco vezes mais divertido jogar pingue-pongue na sala do que trabalhar, mas também acha que deveria trabalhar pelo menos três vezes mais horas do que joga pingue-pongue. Agora o problema de decisão é quantas horas jogar e quantas trabalhar para maximizar seu objetivo: “Bem-estar”.

\(x\): número de horas gastas trabalhando

\(y\): número de horas gastas jogando

Você quer maximizar seu bem-estar:

\[ f(x,y) = x + 5y \]

Seu tempo total por dia é limitado a oito horas:

\[ x + y < 8 \]

E, finalmente, você deve trabalhar pelo menos três vezes o que você joga:

\[x > 3y\]

Você não pode gastar um número negativo de horas:

\[ x \ge 0 \\ y \ge 0 \]

# demo_PL_Exemplo3.R
A <- matrix(c(1, 1, 
              -1, 3, 
              -1, 0, 
              0, -1), 
            nrow = 4,
            ncol = 2, byrow = TRUE)
b <- c(8, 0, 0, 0)
obj <- c(1, 5)
print(gMOIP::plotPolytope(A,
                          b,
                          obj,
                          type = rep("c", ncol(A)),
                          crit = "max",
                          faces = rep("c", ncol(A)),
                          plotFaces = TRUE,
                          plotFeasible = TRUE,
                          plotOptimum = TRUE,
                          labels = "coord"))
Warning: ggrepel: 8 unlabeled data points (too many overlaps). Consider
increasing max.overlaps

# demo_PL_Exemplo3_ompr.R
model0 <- ompr::MIPModel() # Initialize an empty model
model0 <- ompr::add_variable(model0, x, type = "continuous", lb = 0)
model0 <- ompr::add_variable(model0, y, type = "continuous", lb = 0)
model0 <- ompr::set_objective(model0, x + 5*y, "max")
model0 <- ompr::add_constraint(model0, x + y <= 8) 
model0 <- ompr::add_constraint(model0, x - 3*y >= 0) 
result0 <- ompr::solve_model(model0, 
                             ompr.roi::with_ROI(solver = "glpk"))
print(result0$solution)
x y 
6 2 
print(model0)
Mixed integer linear optimization problem
Variables:
  Continuous: 2 
  Integer: 0 
  Binary: 0 
Model sense: maximize 
Constraints: 2 
print(constr0 <- ompr::extract_constraints(model0))
$matrix
2 x 2 sparse Matrix of class "dgCMatrix"
         
[1,] 1  1
[2,] 1 -3

$sense
[1] "<=" ">="

$rhs
[1] 8 0
# Extract the constraints from model
constr00<- cbind(as.matrix(constr0$matrix), # Get matrix of data
                 as.matrix(constr0$sense), # Get inequalities
                 as.matrix(constr0$rhs)) # Get right hand sides
rownames(constr00) <-c ('Trabalhar+Jogar: Teto', 
                        'Trabalhar mais que Jogar')
out <- kableExtra::kbl(constr00, booktabs=TRUE, align='rrcr',
                       caption="Elementos das Restrições",
                       col.names = c('Trabalhar', 'Jogar','Relação','RHS')) 
kableExtra::kable_styling(out, latex_options = "hold_position")
Elementos das Restrições
Trabalhar Jogar Relação RHS
Trabalhar+Jogar: Teto 1 1 <= 8
Trabalhar mais que Jogar 1 -3 >= 0
res0 <- cbind(ompr::objective_value(result0),
              ompr::get_solution(result0, x),
              ompr::get_solution(result0, y))
colnames(res0) <- list("Bem-estar","Trabalhar (h)","Jogar (h)")
rownames(res0) <- list("Solução")
tab <- kableExtra::kbl(res0, booktabs = TRUE, 
                       caption = "Exemplo 3: Máximo bem-estar")
kableExtra::kable_styling(tab, 
                          latex_options = "hold_position")
Exemplo 3: Máximo bem-estar
Bem-estar Trabalhar (h) Jogar (h)
Solução 16 6 2

x+y<8, -x+3y<0, x>=0, y>=0

x+5y

LinearProgramming[{-1,-5}, {{1,1}, {-1,3}}, {{8,-1}, {0,-1}}]

Portanto, o bem-estar é maximizado, 16, se trabalhar 6 h/dia e jogar pingue-pongue 2 h/dia.

Função matemática em R

x <- c(-1,0,1,exp(1),NA) # exp(1) = 2.718282...
abs(x) # 1.000000 0.000000 1.000000 2.718282       NA
[1] 1.000000 0.000000 1.000000 2.718282       NA
try(sqrt(x)) # NaN 0.000000 1.000000 1.648721       NA
Warning in sqrt(x): NaNs produzidos
[1]      NaN 0.000000 1.000000 1.648721       NA
try(log(x)) # NaN -Inf    0    1   NA
Warning in log(x): NaNs produzidos
[1]  NaN -Inf    0    1   NA
cos(x) # 0.5403023  1.0000000  0.5403023 -0.9117339         NA
[1]  0.5403023  1.0000000  0.5403023 -0.9117339         NA
factorial(4) # 1*2*3*4 = 24
[1] 24
gamma(4) # 1*2*3 = 6
[1] 6
beta(4,3) # 0.01666667
[1] 0.01666667
gamma(4)*gamma(3)/(gamma(4+3)) # 0.01666667
[1] 0.01666667
# https://towardsdatascience.com/overview-of-40-mathematical-functions-in-r-4b4e138685ff
curve(exp(x), from = -10, to = 10, main = "exp(x)")

par(mfrow=c(5,2), mar=c(2,2,2,2))
curve(x+0, from = -10, to = 10, main = "x")
curve(abs(x), from = -10, to = 10, main = "|x|")
curve(x^2, from = -10, to = 10, main = "x^2")
curve(x^3, from = -10, to = 10, main = "x^3")
curve(x^4, from = -10, to = 10, main = "x^4")
curve(x^5, from = -10, to = 10, main = "x^5")
curve(x^(1/2), from = -10, to = 10, main = "x^(1/2)")
curve(x^(1/3), from = -10, to = 10, main = "x^(1/3)")
curve(1/x, from = -10, to = 10, main = "1/x")
curve(1/(x^2), from = -10, to = 10, main = "1/(x^2)")

par(mfrow=c(5,2), mar=c(2,2,2,2))
curve(factorial(x), from = -10, to = 10, main = "x!")
Warning in gamma(x + 1): NaNs produzidos
curve(2^x, from = -10, to = 10, main = "2^x")
curve(1/sqrt(x), from = -10, to = 10, main = "1/x^(1/2)")
Warning in sqrt(x): NaNs produzidos
curve(exp(-x), from = -10, to = 10, main = "e^(-x)")
curve(log(x), from = -10, to = 10, main = "ln(x)")
Warning in log(x): NaNs produzidos
curve(exp(x), from = -10, to = 10, main = "e^x")
curve(log2(x), from = -10, to = 10, main = "log2(x)")
Warning in eval(expr, envir = ll, enclos = parent.frame()): NaNs produzidos
curve(log10(x), from = -10, to = 10, main = "log10(x)")
Warning in eval(expr, envir = ll, enclos = parent.frame()): NaNs produzidos
curve(x*log(x), from = -10, to = 10, main = "x*ln(x)")
Warning in log(x): NaNs produzidos
curve(log(x)^2, from = -10, to = 10, main = "ln(x)^2")
Warning in log(x): NaNs produzidos

par(mfrow=c(5,2), mar=c(2,2,2,2))
curve(1 / (1 + exp(-x)), from = -10, to = 10, main = "sigmoid(x)")
curve(10 / (1 + exp(-x)), from = -10, to = 10, main = "10*sigmoid(x)")
curve(tanh(x), from = -10, to = 10, main = "tanh(x)")
curve(exp(x) / sum(exp(x)), from = -10, to = 10, main = "softmax(x)")
curve(pmax(0, x), from = -10, to = 10, main = "rectifier(x)")
curve(log(1 + exp(x)), from = -10, to = 10, main = "softplus(x)")
curve(sign(x), from = -10, to = 10, main = "sign(x)")
curve(floor(x), from = -10, to = 10, main = "floor(x)")
curve(round(x), from = -10, to = 10, main = "round(x)")
curve(ceiling(x), from = -10, to = 10, main = "ceiling(x)")

par(mfrow=c(5,2), mar=c(2,2,2,2))
curve(sin(x), from = -10, to = 10, main = "sin(x)")
curve(sinpi(x), from = -10, to = 10, main = "sin(pi*x)")
curve(sinh(x), from = -10, to = 10, main = "sinh(x)")
curve(asinh(x), from = -10, to = 10, main = "asinh(x)")
curve(cos(x), from = -10, to = 10, main = "cos(x)")
curve(cospi(x), from = -10, to = 10, main = "cos(pi*x)")
curve(cosh(x), from = -10, to = 10, main = "cosh(x)")
curve(acosh(x), from = -10, to = 10, main = "acosh(x)")
Warning in acosh(x): NaNs produzidos
curve(tan(x), from = -10, to = 10, main = "tan(x)")
curve(tanpi(x), from = -10, to = 10, main = "tan(pi*x)")

# Definir os parâmetros da elipse
center_x <- 0
center_y <- 0
a <- 2  # semi-eixo maior
b <- 1  # semi-eixo menor

# Criar uma sequência de ângulos
theta <- seq(0, 2*pi, length.out = 100)

# Calcular as coordenadas x e y da elipse
x1 <- center_x + a * cos(theta)
x2 <- center_y + b * sin(theta)

# Plotar a elipse
plot(x1, x2, 
     type = "l", asp = 0, 
     xlab = "x1", ylab = "x2",
     xlim=c(-2,2), ylim=c(-2,2))
abline(h=0,v=0, lty=2)

saxes <- c(2,1)
loc <- c(0,0)
theta <- 0
plot(RConics::ellipse(saxes, loc, theta, n=1e3),
     xlab = "x1", ylab = "x2",
     type="l", 
     asp=1)
abline(h=0,v=0, lty=2) 

Referências