Métodos Mathematicos

Davi C. Rodrigues (2014)

Neste minicurso apresento alguns problemas e suas resoluções por meio do Mathematica que comumente encontramos em astrofísica e cosmologia.

Este minicurso pressupõe um contato básico anterior com o Mathematica. Uso de operações básicas, definição de funções simples  etc é pressuposto. 

Os tópicos abaixo refletem o que eu vim a aprender pela necessidade, e não por um estudo sistemático e geral do Mathematica. Muitos dos tópicos abaixo são também tópicos que nosso grupo de cosmologia usa com frequência (com diferentes graus de profundidade). Vários tópicos apresentados podem ser vistos com mais profundidade, para isto ver as referências citadas abaixo. 

Alunos: reproduzam os procedimentos abaixo, façam adaptações para seus problemas e busquem por mais detalhes (o Help do mathematica é um bom ponto de partida).

Dicas gerais:
- Aprendam os atalhos de teclados para fração, potência, raiz quadrada... Pode-se usar (2^(-3))/Pi, mas é mais fácil entender o programa se estiver escrito ((2^(-3))/π).

Alguns dos tópicos abordados neste minicurso

- Um pouco sobre sistema de diretórios e arquivos.

- Importar e exportar  tabelas. 

- interpolação numérica e função numérica aproximada: métodos e estimativa do erro.

- Controle da precisão de cálculos numéricos (WorkingPrecision, PrecisionGoal, AccuracyGoal...)

- Monitorar evolução dos cálculos e exportar/salvar resultados parciais.

- Manipulação de opções: ênfase para apresentação de gráficos

Algumas referências para aprender Mathematica

Dúvidas específicas

- Help do Mathematica

- Google 

	- Mathematica google groups - https://groups.google.com/forum/#!forum/comp.soft-sys.math.mathematica

	- Mathematica Stackexchange http://mathematica.stackexchange.com/


Livros
- Programação, livro: Sal Mangano - Mathematica Cookbook (2010)

- Cálculo numérico, livro: Michael Trott - The mathematica guidebook for numerics (2006)

Talvez alunos gostem de livros voltados para física da graduação, como P. Tam - A Physicist’s guide to Mathematica (2008) ou o livro do Hassani de métodos matemáticos com o Mathematica.

- Diversos livros podem ser encontrados em http://www.wolfram.com/books/

Aula 1 (abra as seções dando clique duplo no símbolo azul, parecido com “ ] ”, à direita)

Importação de dados

Aonde colocar os arquivos de dados?

O Mathematica assume de início uma certa pasta (diretório) de trabalho, e desta pasta ele pode ler qualquer qualquer arquivo que lá esteja.

Directory[]

Opção comumente mais conveniente: coloque os arquivos no mesmo diretório do programa. Neste caso, use o seguinte comando logo no início.

SetDirectory[NotebookDirectory[]]

Directory[]

O diretório acima serve tanto de diretório padrão de leitura de dados, como também de exportação de dados.

O mathematica também procura por arquivos em vários outros diretórios, além do diretório de trabalho.

$Path

Pode-se tanto adicionar algum diretório à $Path dentro de um programa, quanto adicionar um novo diretório nas configurações do mathematica. Em particular, este foi o caso do diretório “/home/davi/Desktop/Works/My Mathematica Library”, que não é padrão. Eu guardo nesse diretório certos programas e rotinas de uso geral.

Coloquei o arquivo “UGC.txt” no diretório deste arquivo que estou usando, assim ele poderá ser importado abaixo.

gas=Import["UGC.txt","Table"];

gas

Row[{ListPlot[gas, ImageSize -> Large], gas // TableForm}]

PrependTo[gas, {0,gas[[1,2]]}]

Modificação de $Path

Opção 1)  Para casos isolados

No meio do programa, usar, por exemplo

$HomeDirectory

AppendTo[$Path, FileNameJoin[{$HomeDirectory, "Desktop", "Works"}]]

$Path

Opção 2) Modificar o valor padrão de $Path

Editar o arquivo de inicialização do Mathematica.

Para isto, busque pelo arquivo init.m em

$UserBaseDirectory

FileNameJoin[{$UserBaseDirectory, "Kernel"}]

O valor padrão de “$UserBaseDirectory” depende do sistema operacional.

Obs.: Há mais de um arquivo init.m que o Mathematica usa, eles têm funções diferentes dependendo do diretório em que estiverem.

Dentro desse arquivo init.m, cujo padrão é conter apenas o comentário “(** User Mathematica initialization file **)”, insira a instrução AppendTo[$Path(...)] apropriada. Na próxima inicialização do Kernel, a $Path estará atualizada.

Interpolação simples

rmin = gas[[1,1]] (*extrai elemento (1,1) da matriz gas*)
rmax = gas[[-1,1]](*extrai o elemento na última linha e primeira coluna da matriz gas*)

σgas1 = Interpolation[gas, InterpolationOrder -> 1];
σgas3 = Interpolation[gas];
σgas10 = Interpolation[gas, InterpolationOrder -> 10];
Row[{Show[ListPlot[gas, PlotRange -> All, PlotMarkers -> Automatic],Plot[{σgas1[x], σgas3[x], σgas10[x]}, {x,rmin,rmax}, PlotStyle -> {{Red, Thick}, {Black, Dashed, Thick}, {Gray, DotDashed, Thick}}], ImageSize -> Large],
Show[ListPlot[gas, PlotMarkers -> Automatic, PlotRange -> {{20,60}, All}],Plot[{σgas1[x], σgas3[x], σgas10[x]}, {x,20,60}, PlotRange -> All,PlotStyle -> {{Red, Thick}, {Black, Dashed, Thick}, {Gray, DotDashed, Thick}}], ImageSize -> Medium]}]

Row[{Plot[σgas1'[x], {x,20,60}, ImageSize-> Medium],
Plot[σgas3'[x], {x,20,60}, ImageSize-> Medium],
Plot[σgas10'[x], {x,20,60}, ImageSize-> Medium]}]
Row[{Plot[σgas1''[x], {x,20,60}, ImageSize-> Medium],
Plot[σgas3''[x], {x,20,60}, ImageSize-> Medium],
Plot[σgas10''[x], {x,20,60}, ImageSize-> Medium]}]
Row[{Plot[σgas1'''[x], {x,20,60}, ImageSize-> Medium],
Plot[σgas3'''[x], {x,20,60}, ImageSize-> Medium],
Plot[σgas10'''[x], {x,20,60}, ImageSize-> Medium]}]

σgas1 = Interpolation[gas, InterpolationOrder -> 1, Method -> Spline];
σgas3 = Interpolation[gas, Method -> Spline];
σgas10 = Interpolation[gas, InterpolationOrder -> 10, Method -> Spline];
Row[{Show[ListPlot[gas, PlotRange -> All, PlotMarkers -> Automatic],Plot[{σgas1[x], σgas3[x], σgas10[x]}, {x,rmin,rmax}, PlotStyle -> {{Red, Thick}, {Black, Dashed, Thick}, {Gray, DotDashed, Thick}}], ImageSize -> Large],
Show[ListPlot[gas, PlotMarkers -> Automatic, PlotRange -> {{20,60}, {0,8}}],Plot[{σgas1[x], σgas3[x], σgas10[x]}, {x,20,60}, PlotRange -> All,PlotStyle -> {{Red, Thick}, {Black, Dashed, Thick}, {Gray, DotDashed, Thick}}], ImageSize -> Medium]}]

Row[{Plot[σgas1'[x], {x,20,60}, ImageSize-> Medium],
Plot[σgas3'[x], {x,20,60}, ImageSize-> Medium],
Plot[σgas10'[x], {x,20,60}, ImageSize-> Medium]}]
Row[{Plot[σgas1''[x], {x,20,60}, ImageSize-> Medium],
Plot[σgas3''[x], {x,20,60}, ImageSize-> Medium],
Plot[σgas10''[x], {x,20,60}, ImageSize-> Medium]}]
Row[{Plot[σgas1'''[x], {x,20,60}, ImageSize-> Medium],
Plot[σgas3'''[x], {x,20,60}, ImageSize-> Medium],
Plot[σgas10'''[x], {x,20,60}, ImageSize-> Medium]}]

Parâmetros de precisão de integração numérica

Considere que estamos interessados em calcular a seguinte função

σgas[R_] = σgas3[R];
Rmax = rmax;

σgas[R_] = σgas3[R];
Rmax = rmax;
Φgas[R_]=- NIntegrate[σgas[Rlinha](((4 EllipticK[((4 R Rlinha)/((R^2)+(Rlinha^2) + 2 R Rlinha))]))/(R+Rlinha)) Rlinha,{Rlinha,0,Rmax} ]

Primeiro problema: usar “Set Delayed” ( := )

Φgas[R_]:=- NIntegrate[σgas[Rlinha](((4 EllipticK[((4 R Rlinha)/((R^2)+(Rlinha^2) + 2 R Rlinha))]))/(R+Rlinha)) Rlinha,{Rlinha,0,Rmax} ]

Φgas[5]

Plot3D[σgas[Rlinha](((4 EllipticK[((4 R Rlinha)/((R^2)+(Rlinha^2) + 2 R Rlinha))]))/(R+Rlinha)) Rlinha, {R,0,Rmax}, {Rlinha,0,Rmax}, AxesLabel -> Automatic, PlotPoints -> 100, MaxRecursion -> 5]

Sobre as definições de WorkingPrecision, PrecisionGoal e AccuracyGoal (extraídas diretamente do Help):

Setting WorkingPrecision -> n causes all internal computations to be done to at most n-digit precision.

Even if internal computations are done to n-digit precision, the final results you get may have much lower precision.

With PrecisionGoal -> p and AccuracyGoal -> a, Mathematica attempts to make the numerical error in a result x be less than (10^(-a))+|x| (10^(-p)).

Se há singularidade ou oscilações em torno de zero no integrando, minhas sugestões (não há resposta geral válida para qualquer problema):

1.  WorkingPrecision deve ser alto, 15 ou maior.

2. AccuracyGoal ou PrecisionGoal devem ser  menores que WorkingPrecision/2, 5 por exemplo. A integração pára quando um desses critérios é atingido. O padrão de NIntegrate é AccuracyGoal -> ∞, ou seja, só PrecisionGoal terá relevância para o teste de convergência da integral. Atenção, os vaores de AccuracyGoal e PrecisionGoal padrões variam de função para função no mathematica (NMinimize por exemplo possui outro padrão), por via das dúvidas, eu especifico explicitamente ambos.

3. Se os ajustes acima não forem suficientes, MaxRecursion, Exclusions,  MaxPoints e MinRecursion são fáceis de serem manipulados e eficazes.

4. Method em NIntegrate é a opção mais difícil de lidar, e contém diversas sub-opções. Minha sugestão: deixar Method no automático (i.e., não especificar), a menos que as etapas acima não sejam suficientes para obter a resposta com a precisão desejada.

Muita atenção às mensagens de erro! 

Obs: Ao tratar de um problema novo, nunca ficar satisfeito com a primeira resposta numérica que o Mathematica fornece. Deve-se alterar os parâmetros de integração para averiguar se a resposta é robusta.

Alguns testes

Φgas0[R_]:=- NIntegrate[σgas[Rlinha](((4 EllipticK[((4 R Rlinha)/((R^2)+(Rlinha^2) + 2 R Rlinha))]))/(R+Rlinha)) Rlinha,{Rlinha,0,Rmax} ]

ΦgasBad[R_]:=- NIntegrate[σgas[Rlinha](((4 EllipticK[((4 R Rlinha)/((R^2)+(Rlinha^2) + 2 R Rlinha))]))/(R+Rlinha)) Rlinha,{Rlinha,0,Rmax} , WorkingPrecision -> 4]


Φgas1[R_]:=- NIntegrate[σgas[Rlinha](((4 EllipticK[((4 R Rlinha)/((R^2)+(Rlinha^2) + 2 R Rlinha))]))/(R+Rlinha)) Rlinha,{Rlinha,0,Rmax} , WorkingPrecision -> 15, PrecisionGoal -> 5, AccuracyGoal -> ∞]

Φgas2[R_]:=- NIntegrate[σgas[Rlinha](((4 EllipticK[((4 R Rlinha)/((R^2)+(Rlinha^2) + 2 R Rlinha))]))/(R+Rlinha)) Rlinha,{Rlinha,0,Rmax} , WorkingPrecision -> 25, PrecisionGoal -> 5, AccuracyGoal -> ∞]

ΦgasR1[R_]:=- NIntegrate[σgas[Rlinha](((4 EllipticK[((4 R Rlinha)/((R^2)+(Rlinha^2) + 2 R Rlinha))]))/(R+Rlinha)) Rlinha,{Rlinha,0,Rmax} , WorkingPrecision -> 15, PrecisionGoal -> 5, AccuracyGoal -> ∞, MaxRecursion -> 20]

ΦgasR2[R_]:=- NIntegrate[σgas[Rlinha](((4 EllipticK[((4 R Rlinha)/((R^2)+(Rlinha^2) + 2 R Rlinha))]))/(R+Rlinha)) Rlinha,{Rlinha,0,Rmax} , WorkingPrecision -> 25, PrecisionGoal -> 5, AccuracyGoal -> ∞, MaxRecursion -> 20]

ΦgasE[R_]:=- NIntegrate[σgas[Rlinha](((4 EllipticK[((4 R Rlinha)/((R^2)+(Rlinha^2) + 2 R Rlinha))]))/(R+Rlinha)) Rlinha,{Rlinha,0,Rmax} , WorkingPrecision -> 15, PrecisionGoal -> 5, AccuracyGoal -> ∞,Exclusions->{R == Rlinha} ]

(ΦgasBadtable = Table[ΦgasBad[r], {r, 1, rmax, 10} ])//TableForm// Timing

(Φgas0table = Table[Φgas0[r], {r, 1, rmax, 10} ])//TableForm// Timing

(Φgas1table = Table[Φgas1[r], {r, 1, rmax, 10} ])//TableForm// Timing

(Φgas2table = Table[Φgas2[r], {r, 1, rmax, 10} ])//TableForm// Timing

(ΦgasR1table = Table[ΦgasR1[r], {r, 1, rmax, 10} ])//TableForm// Timing

(ΦgasEtable = Table[ΦgasE[r], {r, 1, rmax, 10} ])//TableForm// Timing

<<SetOptions2a.m

Row[{ListPlot[1- Φgas0table/ Φgas2table, PlotRange -> All, ImageSize -> Small],
ListPlot[1- Φgas0table/ Φgas1table, PlotRange -> All, ImageSize-> Small], 
ListPlot[1- Φgas0table/ ΦgasR1table, PlotRange -> All, ImageSize-> Small],
ListPlot[1- Φgas0table/Re[ ΦgasEtable], PlotRange -> All, ImageSize-> Small]}]

Row[{ListPlot[1- Φgas1table/ Φgas0table, PlotRange -> All, ImageSize -> Small],
ListPlot[1- Φgas1table/ Φgas2table, PlotRange -> All, ImageSize -> Small],
ListPlot[1- Φgas1table/ ΦgasR1table, PlotRange -> All, ImageSize-> Small], 
ListPlot[1- Φgas1table/ Re[ΦgasEtable], PlotRange -> All, ImageSize-> Small]}]

Para todos os casos que foram plotados acima, as diferenças relativas são da ordem de (10^(-4)) ou menores; ou seja, há uma boa concordância entre todas essas opções impressas acima. Se (10^(-4)) for precisão suficiente, os gráficos acima sugerem que pode-se escolher qualquer uma das opções acima, assim a opção mais rápida é a melhor. É importante ressaltar que há diferenças sistemáticas de uma integral para a outra. Para o problema físico que ilustra esta aplicação, essas diferenças de (10^(-4)) (ainda que  sistemáticas) são irrelevantes (são facilmente absorvidas no erro da distância da galáxia). Note por exemplo o último Plot. Isto ocorre pois o método de integração numérica que o Mathematica usou para Φgas1 é diferente do empregado para ΦgasE .

Opções para método de integração podem ser dadas explicitamente, para mais detalhes, ver por exemplo o Help. O Mathematica usou um método que envolve complexos para resolver ΦgasE, por isto aparecem componentes pequenas imaginárias nas respostas. Os testes de convergência interna do mathematica são feitos com o módulo da reposta (veja PrecisionGoal no Help). Como numericamente a precisão não é infinita, sempre pode sobrar uma parte imaginária pequena (se comparada à componente real). Nestes casos, faz sentido tomar a parte real com Re[...] nas respostas, e isto foi usado acima sempre que ΦgasEtable apareceu (pode-se também usar Abs[...], mas com este último perde-se a informação do sinal).

Quando o método não é especificado, deixa-se o Mathematica escolher automaticamente. Esta escolha depende de vários fatores, que incluem o integrando e a precisão desejada. Assim mudanças na precisão sem menção explícita ao método, podem acarretar em integrais sendo feitas a partir de métodos diferentes.

Aula 2

Função numérica aproximada

Vamos adotar a opção ΦgasR1. Calcularemos a seguir uma tabela maior, de maior resolução. As anteriores eram só para testar a otimização da integral.

AbsoluteTime[]

timei = AbsoluteTime[];

points = Table[i,{i,0,Rmax,2}]; 

Monitor[
tableΦgas =   Table[{R,ΦgasR1[R]}, {R,points}],
N[R/ Rmax]];

timef = AbsoluteTime[];
Print[timef - timei] (*Imprime o tempo total em segundos que o cáculo necessitou*)

Dimensions[tableΦgas]

A advertência NIntegrate::slwcon apenas serve para alertar que talvez haja formas mais rápidas de calcular a mesma coisa.  

Observe que nenhum erro de convergência apareceu.

ΦgasI = Interpolation[tableΦgas]

Plot[ΦgasI[R], {R,0,Rmax}] // Timing
Plot[ΦgasR1[R], {R,0,Rmax}] // Timing (*Demora muito.... Pode abortar.*)

Teste da aproximação

Questão: quão boa é a aproximação ΦgasI de ΦgasR1?

Teste rápido visual (baixa precisão, apenas verifica se a interpolação foi minimamente bem feita):

Show[ListPlot[tableΦgas, PlotRange -> All],Plot[ΦgasI[R], {R,0,Rmax}, PlotStyle -> Red], ImageSize -> Large]

Teste com intervalos regulares: 

Que a curva passe exatamente por cima dos pontos usados na tabela é trivial. Mas será que o erro introduzido pela aproximação numérica entre um ponto da tabela e outro é satisfatório? 

Se a precisão desejada é da ordem de 10%, um simples teste visual como o acima é suficiente. Já uma precisão de 1% é difícil ou impossível de ser inferida pelo plot acima.

Table[{R, 1 - ΦgasI[R]/ΦgasR1[R]}, {R, 0.1, Rmax, Rmax/(10 π)}] (*Usei 10 π  como passo apenas para garantir que estamos testando pontos que não estão na tabela que gerou ΦgasI.*)

ListPlot[%, PlotRange -> All]

Teste com intervalos irregulares: 

Use a própria “inteligência” do Plot para buscar por regiões críticas.

Faça um plot  da diferença relativa. Comece selecionando uns poucos pontos (PlotPoints -> 10) e MaxRecursion -> 0 e vá aumentando os valores conforme seu tempo permitir e o resultado for convergindo.

Dependendo da situação, o erro máximo pode não ser relevante, apenas o erro médio (às vezes um único ponto aparece como muito distante dos demais, e um único ponto dificilmente é relevante). No último caso, uma estratégia simples é simplesmente remover o PlotRange -> All dos Plots abaixo, ou especificar a região a ser plotada em detalhes.

Plot[ 1 - ΦgasI[R]/ΦgasR1[R], {R,0,Rmax}, PlotPoints -> 10, MaxRecursion -> 0, PlotRange -> All] // Timing

Plot[ 1 - ΦgasI[R]/ΦgasR1[R], {R,0,Rmax}, PlotPoints -> 20, MaxRecursion -> 3, PlotRange -> All] // Timing

Plot[ 1 - ΦgasI[R]/ΦgasR1[R], {R,0,Rmax}, PlotPoints -> 30, MaxRecursion -> 4, PlotRange -> All] // Timing

Para gerar funções numéricas aproximadas de dimensão maior que 1 pode-se seguir essencialmente os mesmos princípios.

Um exemplo simples bidimensional: encontra-se no help do Mathematica

f=ListInterpolation[
Table[Sin[x y],{x,0,1,.25},{y,0,2,.25}],
{{0,1},{0,2}}]

Show[{
Plot3D[f[x,y],{x,0,1},{y,0,2}],
Graphics3D[{Red,PointSize[0.03],Table[Point[{x,y,Sin[x y]}],{x,0,1,.25},{y,0,2,.25}]}]
}]

Aula 3

Exportando dados

Tabela completa

O cálculo da tabela tableΦgas foi rápido, mas em problemas mais demorados é útil salvar a tabela obtida para depois não precisar calcular tudo de novo.

Export["tablePhigas.csv", tableΦgas]

Clear[ΦgasI, tableΦgas]

tableΦgas = Import["tablePhigas.csv"];
ΦgasI = Interpolation[tableΦgas]
{ ListPlot[tableΦgas], Plot[ΦgasI[R], {R,0,Rmax}]}

Tabela parcial

Suponha que estejamos calculando uma tabela mais demorada. Por exemplo, considere o seguinte elemento para a tabela

ΦgasSlow[R_]:=- NIntegrate[σgas[Rlinha](((4 EllipticK[((4 R Rlinha)/((R^2)+(Rlinha^2) + 2 R Rlinha))]))/(R+Rlinha)) Rlinha,{Rlinha,0,Rmax} , WorkingPrecision -> 22, PrecisionGoal -> 7, AccuracyGoal -> ∞,Exclusions->{R == Rlinha} , MinRecursion -> 2, MaxRecursion -> 20]

ΦgasSlow[3] // Timing

Poderia ser uma tabela com uma estrutura mais complexa, por exemplo, uma tabela de 10 ou mais entradas ao invés de apenas duas. O exemplo abaixo é simples, mas contém a essência para casos mais complexos.

É importante que os pontos sejam igualmente espaçados (ou ao menos aproximadametne igualmente espaçados, ou que variem o espaçamento suavimente) para evitar problemas com a interpolação. Bruscas variações de espaçamento podem gerar bruscas oscilações não desejadas.

Rmax 

RmaxR = 250 (*"rounded" para evitar mal espaçamento entre pontos. O último ponto pode ser eliminado depois, se necessário *)

itotal =50  (*50 será o número de arquivo salvos*)

step = N[RmaxR / itotal / 4] (*cada arquivo conterá 4 dados igualmente espaçados*)

Table[    (*O comando Table é aqui usado apenas para gerar um loop. Poderia-se usar um For, While ou outra variação*)
timei=AbsoluteTime[];
tableΦgasSlow[i] = Table[{R,Re[ΦgasSlow[R]] }, {R, (i-1) (RmaxR/50) , i (RmaxR/50) - step, step}]; (*Principal linha computacional*)
Export["tablePhigasSlow"<>ToString[i]<>".csv",  tableΦgasSlow[i]]; 

timef=AbsoluteTime[];
Print[{i,timef-timei}],
{i,1,itotal}];

Outras opções além do Print[i] que dependendo do problema podem ser relevantes:

NotebookSave[] -- Salva o notebook atual

SendMail[....]

Clear[tableΦgasSlow]

Table[
tableΦgasSlow[i] = Import["tablePhigasSlow"<>ToString[i]<>".csv"],
{i,1,13}];

tableΦgasSlowFull = Flatten[Join[Table[tableΦgasSlow[i], {i,1,13}]],1]

Show[ListPlot[tableΦgasSlowFull, PlotMarkers -> Automatic], Plot[ΦgasI[R], {R,0,Rmax}, PlotStyle -> Red]]

Aula 4

Apresentação de gráficos e manipulação de opções

O padrão de gráficos do Mathematica tem usualmente qualidade inferior ao que se espera da qualidade de gráficos para publicação.

Pode-se alterar as opções de gráficos individualmente, e pode-se também alterar o padrão de todos os gráficos. Essa alteração de padrão já fizemos acima ao usarmos “<<SetOptions2a.m” . SetOptions2a.m é um arquivo que eu criei que essencialmente altera várias opções padrão de gráficos. Agora não, mas mais a frente veremos como criar pacotes como esse SetOptions2a.m 

Como o padrão já foi alterado acima, vamos começar do zero. Para isto vamos limpar o Kernel, o que pode ser atingido tanto por meio de “Evaluation > Quit Kernel” quanto pela execução da célula abaixo.

Exit[]

E assim voltamos ao padrão.

Plot[{(x^2), -(x^2) + 1}, {x,-5,5}]

Para saber quais são as opções padrão de determina função do Mathematica, muitas vezes o mais conveniente é consultar o Help. Outra forma é por meio do comando Options . Abaixo mostramos as opções padrão de NIntegrate e Plot

Options[NIntegrate]

Options[Plot]

Para o caso de gráficos, podemos ainda copiar e colar um gráfico e pedir pelas opções que foram utilizadas para o fazer, como abaixo

Options[]  (*Ver também AbsoluteOptions*)

Algumas opções básicas para Plot

manyplots = Row[{
Plot[{(x^2), -(x^2) + 1}, {x,-5,5}, PlotRange -> {{-3,3}, {-3,3}}, ImageSize -> Small],
Plot[{(x^2), -(x^2) + 1}, {x,-5,5}, PlotRange -> {{-3,3}, {-3,3}}, ImageSize -> Small, AspectRatio -> 1],
Plot[{(x^2), -(x^2) + 1}, {x,-5,5}, PlotRange -> {{-3,3}, {-3,3}}, ImageSize -> Small, AspectRatio -> 1, PlotStyle -> Thick],
Plot[{(x^2), -(x^2) + 1}, {x,-5,5}, PlotRange -> {{-3,3}, {-3,3}}, ImageSize -> Small, AspectRatio -> 1, PlotStyle -> {{Thick, Red}, {Thick,Dashed, Brown}}],
Plot[{(x^2), -(x^2) + 1}, {x,-5,5}, PlotRange -> {{-3,3}, {-3,3}}, ImageSize -> Small, AspectRatio -> 1, PlotStyle -> {{Thick, Red}, {Thick,Dashed, Brown}}, Frame -> True],
Plot[{(x^2), -(x^2) + 1}, {x,-5,5}, PlotRange -> {{-3,3}, {-3,3}}, ImageSize -> Small, AspectRatio -> 1, PlotStyle -> {{Thick, Red}, {Thick,Dashed, Brown}}, Frame -> True, Axes -> False],
Plot[{(x^2), -(x^2) + 1}, {x,-5,5}, PlotRange -> {{-3,3}, {-3,3}}, ImageSize -> Small, AspectRatio -> 1, PlotStyle -> {{Thick, Red}, {Thick,Dashed, Brown}}, Frame -> True, Axes -> False, GridLines -> Automatic],
Plot[{(x^2), -(x^2) + 1}, {x,-5,5}, PlotRange -> {{-3,3}, {-3,3}}, ImageSize -> Small, AspectRatio -> 1, PlotStyle -> {{Thick, Red}, {Thick,Dashed, Brown}}, Frame -> True, Axes -> False, GridLines -> Automatic, GridLinesStyle -> Directive[LightGray, Dashed], FrameStyle -> Larger],
Plot[{(x^2), -(x^2) + 1}, {x,-5,5}, PlotRange -> {{-3,3}, {-3,3}}, ImageSize -> Small, AspectRatio -> 1, PlotStyle -> {{Thick, Red}, {Thick,Dashed, Brown}}, Frame -> True, Axes -> False, GridLines -> Automatic, GridLinesStyle -> Directive[LightGray, Dashed], FrameStyle -> Larger, FrameTicks -> {{{-2,0,2}, None},{{-2,0,2}, None}}],
Plot[{(x^2), -(x^2) + 1}, {x,-5,5}, PlotRange -> {{-3,3}, {-3,3}}, ImageSize -> Small, AspectRatio -> 1, PlotStyle -> {{Thick, Red}, {Thick,Dashed, Brown}}, Frame -> True, Axes -> False, GridLines -> Automatic, GridLinesStyle -> Directive[LightGray, Dashed], FrameStyle ->{{{Larger , Thick},{Larger , Thick}},{{Larger , Thick},{Larger , Thick}}} , FrameTicks -> {{{{-2,-"J", {0.05,0}},{0,0, {0.05,0}},{2,"J", {0.05,0}}}, None},{{{-2,-"H", {0.05,0}}, {0,0, {0.05,0}},{2,"H", {0.05,0}}}, None}}, FrameTicksStyle -> Thickness[0.008]]
}]

Show[, FrameStyle -> Automatic, GridLines -> None, AspectRatio -> 1.1, ImageSize -> 150]

Export["graficoalefe.pdf",%]

Curiosidade, tente entender as manipulações abaixo:

Row[
Table[
manyplots[[1,i]],
{i,{1,4,5,6,8}}
]
]

Row[
Table[
Show[manyplots[[1,i]], Epilog -> Inset[Style[i, Larger, Bold], {-2,1}]],
{i,{1,4,5,6,8}}
]
]

Às vezes pode ser útil tratar um parâmetro de uma opção ou um grupo de opções como uma variável.

range = {{-3,5}, {-3,3}};
Plot[{(x^2), -(x^2) + 1}, {x,-5,5}, PlotRange -> range]

opcoes={PlotRange -> {{-3,3}, {-3,3}}, ImageSize -> Small, AspectRatio -> 1, PlotStyle -> {{Thick, Red}, {Thick,Dashed, Brown}}, Frame -> True, Axes -> False, GridLines -> Automatic, GridLinesStyle -> Directive[LightGray, Dashed], FrameStyle -> Larger};

Plot[{(x^2), -(x^2) + 1}, {x,-5,5},opcoes]

Não funcionou.... Mas podemos fazer funcionar se forçamos o uso da definição de “opcoes” dentro do comando Plot, a saber

Plot[{(x^2), -(x^2) + 1}, {x,-5,5},Evaluate[opcoes]] (*Ver detalhes de Evaluate no Help!*)

opcoes[[4]]

Ou ainda....

Plot[{(x^2), -(x^2) + 1}, {x,-5,5},Evaluate[opcoes[[4]]]]

Options[%] (*Note o PlotRange abaixo*)

Este tipo de uso de opções, como variáveis, é de grande utilidade para programação.

Por fim, pode-se alterar o padrão das opções de certa função do Mathematica por meio de...

SetOptions[Plot, Frame -> True, Axes -> False];

Plot[{(x^2), -(x^2) + 1}, {x,-5,5}]

O SetOptions acima só modificou o padrão do Plot. O ListPlot, por exemplo, segue com o padrão dele.

ListPlot e problemas com PlotMarkers

Exit[]

SetDirectory[NotebookDirectory[]];
gas=Import["UGC.txt","Table"];
gasI = Interpolation[gas];
<<SetOptions2a.m

Show[ListPlot[gas, PlotMarkers -> Automatic], Plot[gasI[r], {r,4,250}, PlotStyle -> Red]]

{Show[ListPlot[gas, PlotMarkers -> Automatic], Plot[gasI[r], {r,4,250}, PlotStyle -> Red]],
Show[ListPlot[gas, PlotMarkers -> circlecross[Darker[Blue],7]], Plot[gasI[r], {r,4,250}, PlotStyle -> Red]]}

PlotMarkers seja com opção None (padrão) ou Automatic, não têm posições muito precisas. Para ter precisão, deve-se usar símbolos gráficos. circlecross é uma função que gera um símbolo e foi definida em “SetOptions2a.m”, a saber:

circlecross[color_,size_]:=Graphics[{color,Thick,Circle[],Line[{{0,-0.95},{0,0.95}}],Line[{{-0.95,0},{0.95,0}}]},ImageSize->size]

{circlecross[Red,40],circlecross[Red,7] }

Segue uma forma mais precisa de visualizar as diferenças de posição de símbolo gráfico, como o circlecross, dos símbolos padrão do ListPlot (que se baseia em caracteres de texto):

{Show[ListPlot[gas, PlotMarkers -> circlecross[Red,8]], ListPlot[gas, PlotMarkers -> None], PlotRange -> {{100, 150}, Automatic}],
Show[ListPlot[gas, PlotMarkers -> circlecross[Red,8]], ListPlot[gas, PlotMarkers -> Automatic], PlotRange -> {{100, 150}, Automatic}]}

Legendas dos eixos

LogLogPlot[x,{x,10,5000},Frame -> True, Axes -> False, ImageSize -> 300,  FrameLabel -> {"x", "y"},FrameStyle -> Medium]

LogLogPlot[x,{x,10,5000},Frame -> True, Axes -> False, ImageSize -> 300,  FrameLabel -> {Style["x", Bold,25], Style["y", Bold]},FrameStyle -> Medium]

LogLogPlot[x,{x,10,5000},Frame -> True, Axes -> False, ImageSize -> 300,  FrameLabel -> {Style["(SubStar[Υ])"],(SubStar[Υ])},FrameStyle -> Medium]

SetDirectory[NotebookDirectory[]]
im=Import["latex-image-1.pdf"][[1]]
LogLogPlot[x,{x,10,5000},Frame -> True, Axes -> False, ImageSize -> 300,  FrameLabel -> {Show[im,ImageSize -> 20],Show[im,ImageSize -> 20]},FrameStyle -> Medium, ImagePadding -> Automatic]

0

Grade ou Tabela de Gráficos

padding={{0,0},{0,1}};
p1=Plot[x,{x,10,50},ImagePadding->padding, ImageSize -> {200}, AspectRatio -> 1];
p2=LogLogPlot[x,{x,10,5000},ImagePadding->padding, ImageSize -> {200}, AspectRatio -> 1];
grid=Grid[{{p1, p2},{p2, ""}}, Spacings -> {0,0}]

Sobre as opções embutidas em SetOptioms2a.m para a função Plot

Exit[]

original = Options[Plot]

Ao abrir o arquivo SetOptions2a.m encontra-se a seguinte linha:

SetOptions[Plot, GridLines -> Automatic, GridLinesStyle -> Directive[LightGray, Dashed], Frame -> True, Axes -> False, PlotStyle -> Thick,  ImageSize -> Medium,FrameStyle -> Larger]

SetDirectory[NotebookDirectory[]]
<<SetOptions2a.m

after = Options[Plot]

original ⋂ after

Complement[ after, original]

Table -> ParallelTable