Sharednotebooks / 5.EquacoesDiferenciaisOrdinarias.ipynbOpen in CoCalc
Author: Sergio Luis Lopes Verardi
In [ ]:
%html <h2 style="color: rgb(51, 102, 255);">1. Resumo do Tutorial</h2> <br style="font-family: Verdana;"> <span style="font-family: Verdana;">Neste Tutorial, veremos como resolver, simbolicamente, <span style="color: rgb(51, 102, 255);">Equações Diferenciais Ordinárias de Ordens 1 e 2</span> usando os métodos estudados tipicamente em um curso introdutório de EDO.<br> À medida que o curso avançar, outros métodos serão discutidos como, por exemplo, solução por séries.<br> <br> </span>
In [ ]:
%html <h2 style="color: rgb(51, 102, 255);"><span style="font-family: LMMono10-Regular;">2</span>. Equações Diferenciais Ordinárias de Ordem 1</h2> <span style="font-family: Verdana;">Vejamos como resolver EDOs de ordem 1 expressas pela <span style="color: rgb(51, 51, 255);">forma geral</span>: $F(x,y(x),y'(x))=0$<br> <br> <br style="font-family: Verdana;"> </span><span style="font-family: Verdana;"><span style="color: rgb(51, 51, 255);"><span style="color: rgb(51, 51, 255);">Esquema Geral da Solução no Sage</span><br> <br> </span></span><span style="font-family: Verdana;">a) definição da variável independente: <span style="font-style: italic;">x=var('x')</span>;<br> b) definição da variável dependente: <span style="font-style: italic;">y=function('y')(x)</span><br> c) solução através do comando desolve:<br> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="font-style: italic; color: rgb(51, 51, 255);">desolve(edo, variavel, ics=..., ivar=..., show_method=..., contrib_ode=...)</span><br> <br> onde os parâmetros do comando <span style="color: rgb(51, 51, 255);">desolve</span> são:<br> &nbsp;&nbsp;&nbsp; <span style="font-style: italic; color: rgb(51, 51, 255);">edo</span>: é a equação diferencial ordinária que se deseja resolver; por exemplo, a equação $y'=2y+x$ é escrita como diff(y,x)==2*y+x (observe o duplo ==)<br> &nbsp;&nbsp;&nbsp; <span style="font-style: italic; color: rgb(51, 51, 255);">variavel</span>: nome da variável dependente (no exemplo acima, y)<br> &nbsp;&nbsp;&nbsp; <span style="font-style: italic; color: rgb(51, 51, 255);">ics</span>: argumento opcional que permite especificar condições iniciais; para Ordem 1, forneça uma lista $[x_0,y_0]$; para Ordem 2, &nbsp;$[x_0,y_0,x_1,y_1]$ ou $[x_0,y_0,y_0']$<br> &nbsp;&nbsp;&nbsp; <span style="font-style: italic; color: rgb(51, 51, 255);">ivar</span>: argumento opcional que permite especificar a variável independente (isto é essencial quando a EDO depende de parâmetros, ex: $y'=ay+bx+c$<br> &nbsp;&nbsp;&nbsp; <span style="font-style: italic; color: rgb(51, 51, 255);">show_method</span>: argumento opcional (default=False); se especificado como <span style="font-style: italic;">True</span>, o Sage informa o método de solução utilizado (linear, separable, exact, homogeneous, etc)<br> &nbsp;&nbsp;&nbsp; <span style="font-style: italic; color: rgb(51, 51, 255);">contrib_ode</span>: argumento opcional (default=False); se for True, o Sage tratará casos como equações de Ricatti, Lagrange, e outros casos patológicos (não veremos isto em detalhe).<br> <br> A seguir, serão fornecidos vários exemplos de resolução simbólica de EDOs de ordem 1, no Sage.<br> <br> </span>
In [ ]:
%html <h4 style="color: rgb(51, 51, 255);"><span style="font-family: Verdana;">Equações Lineares</span></h4> <span style="font-family: Verdana;"><span style="color: rgb(51, 102, 255);"></span></span><span style="font-family: Verdana;"></span><span style="font-family: Verdana;">São equações do tipo:&nbsp;$y'+P(x)y=Q(x)$<br> <br> Exemplo: $y'+3y=e^x$<br> <br> </span>
In [ ]:
#Exemplo: EDO Linear x=var('x'); y=function('y')(x) # definindo as variáveis # Solução Geral da EDO (não foi especificada condição inicial); não precisa especificar variável independente pois não existem parâmetros # Observe que show_method=True; então, a resposta do Sage contém a solução e, em seguida, o método usado (neste caso, linear) desolve(diff(y,x)+3*y==exp(x),y,show_method=True) show(desolve(diff(y,x)+3*y==exp(x),y,show_method=True))
In [ ]:
%html <h4 style="color: rgb(51, 51, 255);"><span style="font-family: Verdana;">Equações a Variáveis Separáveis</span></h4> <span style="font-family: Verdana;"><span style="color: rgb(51, 102, 255);"></span></span><span style="font-family: Verdana;"></span><span style="font-family: Verdana;">São equações do tipo:&nbsp;$P(x)=y'Q(x)$<br> <br> Exemplo: $yy'=x$<br> <br> </span>
In [ ]:
#Exemplo: Variáveis Separáveis x=var('x'); y=function('y')(x) fn=desolve(y*diff(y,x)==x,y,show_method=True) show(fn)
In [ ]:
%html <h4 style="color: rgb(51, 51, 255);"><span style="font-family: Verdana;">Equações Homogêneas</span></h4> <span style="font-family: Verdana;"><span style="color: rgb(51, 102, 255);"></span></span><span style="font-family: Verdana;"></span><span style="font-family: Verdana;">São equações do tipo:&nbsp;$y'=\frac{P(x,y)}{Q(x,y)}$, onde P e Q são funções homogêneas de mesmo grau (em um dado intervalo)<br> <br> Exemplo: $x^2y'=y^2+xy+x^2$<br> <br> </span>
In [ ]:
#Exemplo: Equações Homogêneas x=var('x'); y=function('y')(x) fn=desolve(x^2*diff(y,x)==y^2+x*y+x^2,y,show_method=True) show(fn) # Observe que a solução não é dada explicitamente!
In [ ]:
%html <h4 style="color: rgb(51, 51, 255);"><span style="font-family: Verdana;">Equações Exatas</span></h4> <span style="font-family: Verdana;"><span style="color: rgb(51, 102, 255);"></span></span><span style="font-family: Verdana;"></span><span style="font-family: Verdana;">São equações do tipo:$\frac{\partial f}{\partial x}dx+\frac{\partial f}{\partial y}dy$, onde f é uma função de 2 variáveis e diferenciável.<br> <br> Exemplo: $y'=\frac{\cos(y)-2x}{y+x\sin(y)}$, com $f(x,y)=x^2-x\cos(y)+y^2/2$<br> <br> </span>
In [ ]:
#Exemplo: Equações Exatas x=var('x'); y=function('y')(x) fn=desolve(diff(y,x)==(cos(y)-2*x)/(y+x*sin(y)),y,show_method=True) show(fn)
In [ ]:
%html <h2 style="color: rgb(51, 102, 255);"><span style="font-family: LMMono10-Regular;">3</span>. Alguns Exemplos Mais Elaborados</h2> <span style="font-family: Verdana;"><br style="font-family: Verdana;"> </span><span style="font-family: Verdana;"><span style="color: rgb(51, 51, 255);"><span style="color: rgb(51, 51, 255);">Exemplo 1: $y'+2y=x^2-2x+3$</span><br> <br> </span></span><span style="font-family: Verdana;">Podemos utilizar outros recursos do Sage em conjunto com o comando de resolução de EDO; por exemplo, vamos resolver a EDO acima do mesmo modo que nos exemplos anteriores, mas utilizaremos o comando <span style="font-style: italic;">expand</span> para expressar a solução, obtida pelo Sage, em uma forma mais simples e, a seguir, vamos impor uma condição inicial.<br> <br>
In [ ]:
#Exemplo 1 x = var('x'); y = function('y')(x) # definição das variáveis DE = diff(y,x)+2*y == x**2-2*x+3 # definição da EDO e atribuição da equação a uma variável print('a) Resolução da EDO') y1=desolve(DE, y); show(y1) print('b) Resolução da EDO e Simplificação da Solução') y2=desolve(DE, y).expand(); show(y2) print('c) Método Utilizado') desolve(DE, y, show_method=True)[1] # OBSERVE O USO DO PARÂMETRO [1]. O QUE ACONTECERIA SE VOCÊ USASSE [0]? print('d) Impõe Condição Inicial X(0)=1') y3=desolve(DE, y, ics=[0,1]).expand(); show(y3)
In [ ]:
In [ ]:
%html </span></span><span style="font-family: Verdana;"><span style="color: rgb(51, 51, 255);"><span style="color: rgb(51, 51, 255);">Exemplo 2: $y'\log(y)=y\sin(x)$</span><br> <br> </span></span><span style="font-family: Verdana;">É simples verificar que se trata de uma EDO a variáveis separáveis e veremos que o Sage reconhece esse fato.<br> Por outro lado, o Sage fornece uma solução em forma implícita; veremos que, neste caso, podemos utilizar o comando <span style="font-style: italic; color: rgb(51, 51, 255);">solve</span> para obter uma expressão explícita para a solução.<br> Por fim, construiremos os gráficos correspondentes à solução da EDO para diferentes condições iniciais.<br> <br>
In [ ]:
#Exemplo 2: x = var('x'); y = function('y')(x) desolve(diff(y,x)*log(y) == y*sin(x), y, show_method=True)[1] # Verificando que o Sage usa método das variáveis separáveis ed = desolve(diff(y,x)*log(y) == y*sin(x), y); # Resolve a EDO e atribui a solução à variável ed show(ed) # Observe que a solução é uma equação envolvendo y e x, ou seja, y é dado implicitamente em termos de x # ESSA EQUAÇÃO PODE SER RESOLVIDA ATRAVÉS DO COMANDO SOLVE sol=solve(ed, y) show(sol) # Veja que existem duas soluções possíveis, correspondendo aos sinais + e - do argumento da função exponencial!
In [ ]:
%html Agora vamos traçar os gráficos para a primeira solução (o procedimento é análogo, para a segunda); além disso, vamos assumir $c\geq 1$ Para isso, precisamos atribuir valores numéricos à constante C, mas como ter acesso a essa constante ? Observe que a função $y(x)$ depende tanto da variável dependente $x$ como da constante C. O Sage possui um comando que retorna as variáveis/parâmetros de uma equação
In [ ]:
ed.variables()
In [ ]:
%html Vemos portanto que as variáveis da equação armazenada em $ed$ são _C e x, nessa ordem; ou seja, _C é a variável de índice 0 e x é a variável de índice 1.<br> Para acessar C, executamos o comando:
In [ ]:
c=ed.variables()[0] # [0] seleciona a variável de índice 0 show(c)
In [ ]:
%html Como fazemos para atribuir o valor 5 ao parâmetro C? Usamos o comando:
In [ ]:
solve(ed, y)[0].substitute(c == 5).rhs()
In [ ]:
%html No comando acima, executamos os seguintes passos:<br> a) resolvemos a equação <em>ed</em> obtendo y=f(x)<br> b) substituimos c=5 na expressão de f(x)<br> c) selecionamos o lado direito (através de <em>rhs</em>() ) da equação y=f(x) (porque queremos graficar f(x))<br> <br> Agora, podemos traçar a solução para c=5
In [ ]:
plot(solve(ed, y)[0].substitute(c == 2).rhs(), x, -3, 3)
In [ ]:
%html Podemos graficar simultaneamente diferentes soluções particulares, correspondentes a diferentes condições iniciais (valores de C).<br> Observe o uso de uma estrutura de repetição (for) cuja sintaxe é da linguagem PYTHON (já mencionamos que o Sage usa Python).<br> A expressão for k in range(1,10,2) significa que o contador k parte do valor 1 e vai até 10 de 2 em 2. Portanto, k=1, 3, 5, 7,9.
In [ ]:
In [ ]:
P = Graphics() for k in range(1,10,2): P += plot(solve(ed, y)[0].substitute(c==1+k/4).rhs(), x, -3, 3) P.show()
In [ ]:
%html <h2 style="color: rgb(51, 102, 255);">3. Equações Diferenciais Ordinárias de Ordem 2</h2> <br style="font-family: Verdana;"> <span style="font-family: Verdana;">Futuramente, veremos que, quando se resolve determinadas Equações Diferenciais Parciais pelo Método de Separação de Variáveis naturalmente somos conduzidos ao problema de resolver uma Equação Diferencial Ordinária de Ordem 2. <br> Por esse motivo, apresentamos aqui como resolver EDOs de segunda ordem com o Sage, mas apenas no caso em que as equações são lineares e a coeficientes constantes.<br> <br> </span><span style="font-family: Verdana;"><span style="color: rgb(51, 51, 255);"><span style="color: rgb(51, 51, 255);">Exemplo 1: $y''+3y=x^2-7x+31$</span></span></span><br> <br>
In [ ]:
x = var('x'); y = function('y')(x) DE = diff(y,x,2)+3*y == x^2-7*x+31 sol=desolve(DE, y).expand() show(sol)
In [ ]:
%html IMPONDO DUAS CONDIÇÕES INICIAIS (para a função e sua derivada no instante t=0): $y(0)=1$ e $y'(0)=2$
In [ ]:
solA=desolve(DE, y, ics=[0,1,2]).expand() show(solA)
In [ ]:
%html IMPONDO DUAS CONDIÇÕES DE CONTORNO: $y(0)=1$ e $y(-1)=0$
In [ ]:
solB=desolve(DE, y, ics=[0,1,-1,0]).expand() show(solB)
In [ ]:
In [ ]:
t,L,R,C,E,wd=var('t,L,R,C,E,wd') assume(L>0) assume(C>0) assume(R>0) assume(E>0) assume(wd>0) assume((C*R^2-4*L) > 0) q=function('q',t) ed = L*diff(q,t,2)+R*diff(q,t,1)+q/C==E*sin(wd*t) sol=desolve(ed,q,ivar=t) show(sol) forget()
In [ ]:
In [ ]:
t,L,R,C,E,wd=var('t,L,R,C,E,wd') assume(L>0) assume(C>0) assume(R>0) assume(E>0) assume(wd>0) #assume((C*R^2-4*L) > 0) q=function('q',t) ed = L*diff(q,t,2)+q/C==0 sol=desolve(ed,q,ivar=t) show(sol) forget()
In [ ]:
x,a,b,c,d=var('x,a,b,c,d') assume(a>0) assume(b>0) assume(c>0) assume(d>0) #assume((C*R^2-4*L) > 0) p=function('p')(x) ed = ((a*x-b)^2)*diff(p,x,2)+(c*x-d)*diff(p,x,1)==1 sol=desolve(ed,p,ivar=x) show(sol) forget()
In [ ]:
x,a,b,c,d=var('x,a,b,c,d') assume(a>0) assume(b>0) assume(c>0) assume(d>0) p=function('p')(x) ed = ((a*x+b)^2)*diff(p,x,2)+(c*x+d)*diff(p,x,1)==1 sol=desolve(ed,p,ivar=x) show(sol) forget()
In [ ]: