11.4 Gráficos de Funções com fplot
| Finalidade | Sintaxe | Objeto Retornado | Exemplo |
|---|---|---|---|
| Plotar f(x) | fplot(f, [xmin, xmax]) | FunctionLine | fplot(@(x)x.^2, [-1, 1]) |
| Plotar Equações Paramétricas | fplot(xt, yt, [tmin, tmax]) | ParameterizedFunctionLine | fplot(@cos, @sin, [0, 2*pi]) |
| Personalizar Estilo | fplot(..., 'Nome', Valor, ...) | Mesmo que acima | fplot(@sin, 'LineWidth', 2) |
Conceitos Fundamentais: Diferenças entre fplot e plot
O comando plot exige que você forneça um conjunto discreto de pontos de dados (x, y), que então são conectados por linhas. Ele plota os dados que você forneceu. Por outro lado, fplot requer apenas um identificador de função. Ele realiza uma amostragem inteligente dentro de um intervalo especificado e desenha uma curva suave da própria função.
A principal vantagem do fplot é seu algoritmo de amostragem adaptativa. Ele aumenta a densidade de pontos em regiões onde a função muda rapidamente e a reduz onde a função é suave, produzindo um gráfico preciso com menos pontos.
Plotando uma Única Função Anônima f(x)
Este é o uso mais comum do fplot, passando diretamente um identificador de função de x.
Sintaxe:
fplot(f)
fplot(f, [xmin, xmax])
h = fplot(...) % Retorna o identificador do objeto gráfico
Parâmetros:
f: Identificador de função, normalmente uma função anônima como@(x) sin(x) ./ x.[xmin, xmax]: Opcional. Especifica o intervalo do eixo x para o gráfico. O padrão é[-5, 5].
Exemplo Prático:
% Definir uma função anônima
funçãoDeTeste = @(x) sin(x) .* exp(-x/4);
% Plotar no intervalo padrão [-5, 5]
figure;
fplot(funçãoDeTeste);
title('Gráfico no Intervalo Padrão');
% Plotar no intervalo especificado [0, 10]
figure;
fplot(funçãoDeTeste, [0, 10]);
title('Gráfico no Intervalo [0, 10]');
grid on;
Lidando com Avisos de Vetorização
O aviso mais comum ao usar fplot é:
Warning: Function behaves unexpectedly on array inputs. To improve performance, properly vectorize your function to return an array with the same size as the input.
Causa: Para eficiência, fplot tenta enviar um vetor de valores x para sua função de uma só vez. Se sua função usar operadores que não lidam com vetores (como ^ em vez de .^), esse aviso será acionado.
Solução: Sempre use operadores orientados a arrays (.*, ./, .^) em funções anônimas para fplot.
% Escrita incorreta (gera aviso)
funçãoIncorreta = @(x) x^3; % Usa potência de matriz ^
fplot(funçãoIncorreta, [-2, 2]);
% Escrita correta (vetorizada)
funçãoCorreta = @(x) x.^3; % Usa potência de array .^
fplot(funçãoCorreta, [-2, 2]);
Plotando Equações Paramétricas
fplot também pode plotar curvas definidas por equações paramétricas, como círculos ou hélices.
Sintaxe:
fplot(paramX, paramY)
fplot(paramX, paramY, [tMin, tMax])
h = fplot(...)
Exemplo (Espiral):
% Definir uma espiral
paramX = @(t) t .* cos(t);
paramY = @(t) t .* sin(t);
% Plotar a espiral
figure;
fplot(paramX, paramY, [0, 6*pi]);
title('Espiral');
axis equal;
grid on;
Parâmetros Nome-Valor para Personalização
Semelhante a plot, fplot suporta parâmetros nome-valor para estilizar a linha.
| Nome do Parâmetro | Descrição | Valor de Exemplo |
|---|---|---|
| Color | Cor da linha | 'r', 'blue', [0.2 0.6 0.8] |
| LineStyle | Estilo da linha | '--', ':', '-.' |
| LineWidth | Largura da linha | 1.5, 2 |
| MeshDensity | Número de pontos de amostragem | 50 (padrão), 100 |
Exemplo:
g = @(x) exp(-x.^2/2);
fplot(g, [-3, 3], 'LineWidth', 2.5, 'Color', [0.1 0.7 0.2], 'LineStyle', '--');
title('Curva Gaussiana Personalizada');
grid on;
O Objeto Gráfico Retornado por fplot
Uma diferença crucial: fplot retorna um objeto especializado, como FunctionLine ou ParameterizedFunctionLine. Esses objetos contêm o identificador da função usada para o plot. Isso permite modificar a função subjacente do gráfico dinamicamente.
% Plotar sin(x)
h_obj = fplot(@sin, [-2*pi, 2*pi]);
title('Função Original: sin(x)');
pause(1.5);
% Alterar a função no objeto, o gráfico é atualizado automaticamente!
h_obj.Function = @(x) cos(x);
title('Função Modificada para: cos(x)');
Conhecimentos Adicionais
Comparação com ezplot (desatualizado): A função ezplot é a predecessora de fplot. fplot é superior em desempenho, precisão e na qualidade do objeto gráfico retornado. Deve ser a escolha padrão para novos projetos.
Plotando Múltiplas Funções:
figure;
hold on;
fplot(@exp, [-2, 2], 'b-');
fplot(@(x) log(x), [0.1, 5], 'r--');
legend('e^x', 'ln(x)', 'Location', 'northwest');
title('Comparação de Funções');
grid on;
Funções Implícitas com fimplicit: Para equações da forma f(x,y) = 0, use fimplicit.
fimplicit(@(x,y) x.^2/4 + y.^2 - 1); % Elipse
axis equal;
title('Elipse (Função Implícita)');
11.5 Gráficos com Dois Eixos Y (yyaxis)
| Comando | Função | Escopo de Atuação |
|---|---|---|
| yyaxis left | Ativa o eixo Y esquerdo | Todos os comandos de plotagem e ylabel subsequentes afetam apenas este eixo. |
| yyaxis right | Ativa o eixo Y direito | Todos os comandos de plotagem e ylabel subsequentes afetam apenas este eixo. |
| xlabel / title | Define rótulo do eixo X / título | Global. Afeta toda a área de plotagem, independentemente do eixo Y ativo. |
Concieto: A Necessidade de Dois Eixos Y
Em um gráfico com um único eixo Y, todos os dados compartilham a mesma escala. Se você deseja plotar dois conjuntos de dados com escalas e unidades muito diferentes (ex.: Temperatura em °C vs. Volume em milhões de unidades) no mesmo gráfico, um eixo duplo é essencial. Ele permite que ambos os conjuntos de dados sejam visualizados claramente, cada um com sua própria escala e rótulo.
Funcionamento do yyaxis
A filosofia do yyaxis é baseada em "ativar" um lado do eixo Y. Todos os comandos subsequentes de plotagem e configuração (como ylabel) se aplicarão apenas a esse lado.
Fluxo de Trabalho Típico:
- Ative o lado esquerdo com
yyaxis left. - Plote os dados para o lado esquerdo e defina seu rótulo (
ylabel). - Ative o lado direito com
yyaxis right. - Plote os dados para o lado direito e defina seu rótulo.
- Por fim, defina o rótulo do eixo X (
xlabel) e o título (title).
Exemplo Prático: Desempenho de Vendas e Marketing
% Dados de exemplo
trimestres = 1:4;
receita = [1.2, 1.5, 1.8, 2.1]; % Em milhões
gastoMarketing = [300, 450, 400, 550]; % Em milhares
figure;
% Ativar eixo Y esquerdo para Receita
yyaxis left;
bar(trimestres, receita, 0.4, 'FaceColor', [0.2 0.6 0.9]);
ylabel('Receita (Milhões R$)', 'Color', [0.2 0.6 0.9]);
set(gca, 'YColor', [0.2 0.6 0.9]);
% Ativar eixo Y direito para Gasto com Marketing
yyaxis right;
plot(trimestres, gastoMarketing, 'o-', 'LineWidth', 2, 'Color', [0.9 0.2 0.2]);
ylabel('Gasto Marketing (Mil R$)', 'Color', [0.9 0.2 0.2]);
set(gca, 'YColor', [0.9 0.2 0.2]);
% Elementos globais
xlabel('Trimestres');
title('Receita vs. Gasto com Marketing');
xticks(trimestres);
xticklabels({'Q1','Q2','Q3','Q4'});
grid on;
legend('Receita', 'Gasto Marketing', 'Location', 'northwest');
Conhecimentos Adicionais
Acessando Propriedades dos Eixos Y: Você pode acessar as propriedades de cada eixo Y através da propriedade YAxis do objeto de eixos (axes).
ax = gca;
% Acessar o objeto do eixo Y esquerdo (índice 1)
objEixoEsq = ax.YAxis(1);
% Definir um formato de notação científica para os ticks do lado direito
ax.YAxis(2).TickLabelFormat = '%.1e';
Tratamento Inteligente da Legenda: Ao usar legend após plotar em ambos os lados, o MATLAB automaticamente coleta e exibe as legendas de todas as séries plotadas, independentemente do lado em que foram criadas.
11.6 Gráficos com Escalas Logarítmicas
| Função | Escala do Eixo X | Escala do Eixo Y | Aplicação Típica |
|---|---|---|---|
| semilogx | Logarítmica | Linear | Resposta em frequência, análise espectral |
| semilogy | Linear | Logarítmica | Crescimento/Decaimento exponencial |
| loglog | Logarítmica | Logarítmica | Leis de potência, relações de escala |
Por que Usar Escalas Logarítmicas?
Gráficos lineares padrão podem falhar ao representar dados com faixas dinâmicas muito amplas (ex.: de 0.001 a 1.000.000). Valores pequenos ficam espremidos e variações importantes se tornam invisíveis, enquanto valores grandes dominam a maior parte do gráfico.
Escalas logarítmicas resolvem isso transformando o eixo em uma escala de potências de 10 (ex.: 10⁻³, 10⁻², 10⁻¹, 10⁰, 10¹). Isso permite visualizar claramente variações relativas (porcentagens) em vez de absolutas, e é essencial para identificar relações exponenciais ou de lei de potência.
Exemplo: Análise de Resposta de Filtro Passa-Alta (semilogx)
% Definir parâmetros do filtro
frequencia = logspace(0, 6, 300); % De 1 Hz a 1 MHz
fc = 1000; % Frequência de corte
% Calcular a magnitude da resposta (função de transferência de 1ª ordem)
magnitud = (frequencia / fc) ./ sqrt(1 + (frequencia / fc).^2);
% Plotar com escala logarítmica no eixo X
figure;
semilogx(frequencia, magnitud, 'LineWidth', 1.5);
title('Resposta em Frequência - Filtro Passa-Alta');
xlabel('Frequência (Hz) - Escala Log');
ylabel('Magnitude |H(f)| - Escala Linear');
grid on;
% Marcar a frequência de corte
hold on;
semilogx([fc fc], [0 1/sqrt(2)], 'r--', 'LineWidth', 1.5);
text(fc*1.2, 0.55, sprintf('fc = %d Hz', fc));
hold off;
Exemplo: Decaimento Radioativo (semilogy)
% Dados de decaimento
tempo = 0:0.5:10; % Em anos
quantidadeInicial = 1000; % mg
constanteDecaimento = 0.3; % por ano
quantidade = quantidadeInicial * exp(-constanteDecaimento * tempo);
% Plotar com escala logarítmica no eixo Y
figure;
semilogy(tempo, quantidade, 's-', 'LineWidth', 2, 'MarkerSize', 6, 'MarkerFaceColor', 'k');
title('Modelo de Decaimento Radioativo');
xlabel('Tempo (anos)');
ylabel('Quantidade Restante (mg) - Escala Log');
grid on;
% Uma relação exponencial aparece como uma linha reta em um gráfico semilogy.
Exemplo: Relação de Lei de Potência (loglog)
% Gerar dados que seguem uma lei de potência: y = C * x^alpha
expoente = -2.5;
constante = 3;
x = logspace(-1, 3, 50); % de 0.1 a 1000
y = constante * x.^expoente;
% Adicionar um pouco de ruído para simular dados reais
yComRuido = y .* (1 + 0.1*randn(size(y)));
% Plotar na escala log-log
figure;
loglog(x, yComRuido, 'ro', 'MarkerFaceColor', 'r');
hold on;
loglog(x, y, 'k-', 'LineWidth', 2); % Curva teórica
hold off;
title('Relação de Lei de Potência');
xlabel('Variável X - Escala Log');
ylabel('Variável Y - Escala Log');
grid on;
legend('Dados Simulados', 'Modelo Teórico: y = 3x^{-2.5}');
% Em loglog, uma lei de potência y ∝ x^alpha é uma linha reta com inclinação 'alpha'.
Conhecimentos Adicionais
Usando plot + set: Você pode pirmeiro plotar com plot e depois alterar a escala dos eixos.
plot(x, y);
set(gca, 'XScale', 'log'); % Converte o eixo X para logarítmico
set(gca, 'YScale', 'log'); % Converte o eixo Y para logarítmico
% Pode ser revertido com: set(gca, 'YScale', 'linear');
O Problema com Valores Negativos ou Zero: O logaritmo não é definido para números não positivos. Se seus dados contiverem zeros ou valores negativos, o MATLAB ignorará esses pontos e emitirá um aviso. Soluções comuns incluem: garantir que os dados sejam positivos, adicionar um pequeno deslocamento constante, ou usar escalas especializadas como "symlog" (disponível em bibliotecas de terceiros).
Personalizando Rótulos dos Ticks: Em uma escala logarítmica, os ticks são potências de 10. Você pode alterar seu formato de exibição.
ax = gca;
% Mostrar os valores reais (100, 1000, ...) em vez de (10^2, 10^3, ...)
ax.YAxis.TickLabelFormat = '%.0f';