Introducedilhaão a plotdf
=========================

A funcedilhaão plotdf cria um gráfico do campo de direccedilhaões para uma Equacedilhaão Diferencial Ordinária (EDO) de primeira ordem, ou para um sistema de duas EDO's autónomas, de primeira ordem.

Por tratar-se de um pacote adicional, para poder usá-lo deverá primeiro carregá-lo com o comando load("plotdf"). Também é necessário que Xmaxima esteja instalado, inclusivamente se executar o Maxima desde outra interface diferente.

Para desenhar o campo de direccedilhaões de uma única EDO, essa equacedilhaão deverá escrever-se na forma seguinte:

            dy
            -- = F(x,y)
            dx

e a funcedilhaão F será dada como argumento para o comando plotdf. A variável independente tem que ser sempre X e a variável dependente Y. A essas duas variáveis não poderá estar associado nenhum valor numérico.

Para desenhar o campo de direccedilhaões de um sistema autónomo de duas EDO's, as duas equacedilhaões devem ser escritas na forma seguinte

            dx             dy
            -- = G(x,y)    -- = F(x,y)
            dt             dt

e o argumento para o comando plotdf será uma lista com duas expressões para as funcedilhaões F e G.

Quando se trabalha com uma única equacedilhaão, plotdf assume implicitamente que x=t e G(x,y)=1, transformando a equacedilhaão num sistema autónomo com duas equacedilhaões.

Definicedilhaões para plotdf
============================

 -- Function: plotdf (DYDX,...opcedilhaões...)
 -- Function: plotdf ([DXDT,DYDT],...opcedilhaões...)

     Desenha um campo de direccedilhaões em duas dimensões X e Y.

     DYDX, DXDT e DYDT são expressões que dependem de X e Y. Para além dessas duas variáveis, as duas expressões podem depender de um conjunto de parâmetros, com valores numéricos que são dados por meio da opcedilhaão parameters (a sintaxe dessa opcedilhaão explica-se mais para a frente), ou com um intervalo de possíveis valores definidos com a opcedilhaão SLIDERS.

     Várias outras opcedilhaões podem incluirem-se dentro do comando, ou serem seleccionadas no menú.  Clicando num ponto do gráfico faz com que seja desenhada a curva integral que passa por esse ponto; o mesmo pode ser feito dando as coordenadas do ponto com a opcedilhaão trajectory_at dentro do comando plotdf. A direccedilhaão de integracedilhaão pode controlar-se com a opcedilhaão direction, que aceita valores de forward, backward ou both. O número de passos realizados na integracedilhaão numérica controla-se com a opcedilhaão nsteps e o incremento do tempo em cada passo com a opcedilhaão tstep. Usa-se o método de Adams Moulton para fazer a integracedilhaão numérica; também é possível mudar para o método de Runge-Kutta de quarta ordem com ajuste de passos.

     Menú da janela do gráfico:

     O menú da janela gráfica inclui as seguintes opcedilhaões: Zoom, que permite mudar o comportamento do rato, de maneira que servirá para fazer zoom na região do gráfico clicando com o botão esquerdo. Cada clic alarga a imagem mantendo no centro dela o ponto onde se clicou.  Mantendo carregada a tecla Shift enquanto se faz clic, faz diminuir o tamanho. Para continuar a desenhar trajectórias com um clic, selecciona-se a opcedilhaão Integrate do menú.

     A opcedilhaão Config do menú pode usar-se para mudar a(s) EDO(S) e fazer alguns outros ajustes. Após ter feito alguma alteracedilhaão, deverá usar a opcedilhaão Replot para activar as novas configuracedilhaões.  Se introduzir duas coordenadas no campo Trajectory at do menú de diálogo do Config, e a seguir carregar na tecla Enter, será acrescentada mais uma curva integral.  Se seleccionar a opcedilhaão Replot, só será apresentada a última curva integral seleccionada.

     Mantendo o botão direito carregado enquanto se desloca o cursor, poderá arrastar o gráfico na horizontal e na vertical.  Outros parâmetros, por exemplo, o número de passos, o valor inicial de T, as coordenadas do centro e o raio, podem ser alterados no sub-menú da opcedilhaão Config.

     Com a opcedilhaão Save, pode imprimir-se o gráfico numa impressora Postscript ou gravar uma cópia num ficheiro Postscript. Para optar entre impressão ou gravacedilhaão em ficheiro, selecciona-se Print Options na janela de diálogo de Config. Após ter preenchido os campos da janela de diálogo de Save, será necessário seleccionar a opcedilhaão Save do primeiro menú para criar o ficheiro ou imprimir o gráfico.

     Opcedilhaões gráficas:

     A funcedilhaão plotdf admite varias opcedilhaões, cada uma sendo uma lista de duas ou mais elementos. O primeiro elemento é o nome da opcedilhaão, e o resto estará formado pelos argumentos para essa opcedilhaão.

     A funcedilhaão plotdf reconhece as seguintes opcedilhaões:

       * tstep estabelece a amplitude dos incrementos da variável independente T, utilizados para calcular as curvas integrais. Se for dada só uma expressão DYDX, a variável X será directamente proporcional a T. O valor por omissão é  0.1.

       * nsteps estabelece o número de passos de comprimento tstep que se utilizarão na variável independente para calcular a curva integral. O valor por omissão é 100.

       * direction estabelece a direccedilhaão da variável independente que será seguida para calcular uma curva integral.  Os valores possí são: forward, para fazer que a variável independente aumente nsteps vezes, com incrementos tstep; backward, para fazer que a variável independente diminua; both, para estender a curva integral nsteps passos para a frente e nsteps passos para atrás.  As palavras right e left podem serem usadas como sinónimos de forward e backward. O valor por omissão é both.

       * tinitial estabelece o valor inicial da variável T utilizado para calcular curvas integrais. Já que as equacedilhaões diferenciais são autónomas, esta opcedilhaão só aparecerá nos gráficos das curvas em funcedilhaão de T. O valor por omissão é 0.

       * versus_t utiliza-se para criar uma segunda janela gráfica, com o gráfico de uma curva integral, como duas funcedilhaões X, Y, de variável independente T. Se for dado a versus_t qualquer valor diferente de 0, mostrar-se-á a segunda janela gráfica, que inclui outro menú, similar ao da janela principal. O valor por omissão é 0.

       * trajectory_at estabelece as coordenadas XINITIAL e YINITIAL para o ponto inicial da curva integral. Não tem atribuído nenhum valor por omissão.

       * parameters estabelece uma lista de parâmetros, junto com os seus valores numéricos, que são utilizados na definicedilhaão da equacedilhaão diferencial. Os nomes dos parâmetros e os seus valores devem escrever-se em formato de cadeia de caracteres como uma sequência de pares nome=valor separados por vírgulas.

       * sliders estabelece uma lista de parâmetros que poderão ser alterados interactivamente usando barras com sliders, assim como os intervalos de variacedilhaão dos ditos parâmetros.  Os nomes dos parâmetros e os seus intervalos devem escrever-se em formato de cadeia de caracteres como uma sequência de pares nome=min:max separados por vírgulas.

       * xfun estabelece uma cadeia de caracteres com funcedilhaões de X separadas por ponto e vírgula para ser representadas por cima do campo de direccedilhaões. Essas funcedilhaões serão interpretadas por Tcl, e não por Maxima.

       * xradius é metade do comprimento do intervalo de valores a representar na direccedilhaão x. O valor por omissão é 10.

       * yradius é metade do comprimento do intervalo de valores a representar na direccedilhaão y. O valor por omissão é 10.

       * xcenter é a coordenada x do ponto situado no centro do gráfico. O valor por omissão é 0.

       * ycenter é a coordenada y do ponto situado no centro do gráfico. O valor por omissão é 0.

       * width estabelece a largura da janela gráfica em pixels. O valor por omissão é 500.

       * height estabelece a altura da janela gráfica em pixels. O valor por omissão é 500.

     Exemplos:

     NOTA: Em alguns casos, dependendo da interface usada para executar o Maxima, as funcedilhaões que usam openmath, em particular plotdf, podem desencadear um bug se terminarem em ponto e vírgula, e não com o símbolo de dólar. Para evitar problemas, usaremos o símbolo de dóla nos exemplos a seguir.

       * Para mostrar o campo de direccedilhaões da equacedilhaão diferencial y' = exp(-x) + y e a solucedilhaão que passa por (2, -0.1):

               (%i1) load("plotdf")$

               (%i2) plotdf(exp(-x)+y,[trajectory_at,2,-0.1]);

       * Para mostrar o campo de direccedilhaões da equacedilhaão diff(y,x) = x - y^2 e a solucedilhaão com condicedilhaão inicial y(-1)
          = 3, pode utilizar-se o comando:

               (%i3) plotdf(x-y^2,[xfun,"sqrt(x);-sqrt(x)"],
                         [trajectory_at,-1,3], [direction,forward],
                         [yradius,5],[xcenter,6]);

          O gráfico também mostra a funcedilhaão y = sqrt(x).

       * O exemplo seguinte mostra o campo de direccedilhaões de um oscilador harmónico, definido pelas equacedilhaões dx/dt = y e dy/dt = -k*x/m, e a curva integral que passa por (x,y) = (6,0), com uma barra de slider que permitirá mudar o valor de m interactivamente (k permanecerá fixo em 2):

               (%i4) plotdf([y,-k*x/m],[parameters,"m=2,k=2"],
                           [sliders,"m=1:5"], [trajectory_at,6,0]);

       * Para representar o campo de direccedilhaões da equacedilhaão de Duffing, m*x''+c*x'+k*x+b*x^3 = 0, introduz-se a variável y=x' e faz-se:

               (%i5) plotdf([y,-(k*x + c*y + b*x^3)/m],
                             [parameters,"k=-1,m=1.0,c=0,b=1"],
                             [sliders,"k=-2:2,m=-1:1"],[tstep,0.1]);

       * O campo de direccedilhaões dum pêndulo amortecido, incluindo a solucedilhaão para condicedilhaões iniciales dadas, com uma barra de slider que pode usar-se para mudar o valor da masa, m, e com o gráfico das duas variáveis de estado em funcedilhaão do tempo:

               (%i6) plotdf([y,-g*sin(x)/l - b*y/m/l],
                        [parameters,"g=9.8,l=0.5,m=0.3,b=0.05"],
                        [trajectory_at,1.05,-9],[tstep,0.01],
                        [xradius,6],[yradius,14],
                        [xcenter,-4],[direction,forward],[nsteps,300],
                        [sliders,"m=0.1:1"], [versus_t,1]);