Contact
CoCalc Logo Icon
StoreFeaturesDocsShareSupport News AboutSign UpSign In
| Download

NOTEBOOKS TUTORIAL SAGEMATH

Views: 4541
%auto typeset_mode(True, display=False)

CÁLCULO DE RAÍZES E SISTEMAS DE EQUAÇÕES

SAGE também permite calcular raízes de equações lineares e não lineares através do pacote SymPy. O pacote SymPy é uma biblioteca Python para matemática simbólica e permite resolver equações e sistemas lineares e não lineares. O comando solve permite resolver equações e sistemas lineares e nsolve equações não lineares.

solve(x^2-3*x-2,x)
[x == -1/2*sqrt(17) + 3/2, x == 1/2*sqrt(17) + 3/2]
f = x^2-3*x-2 resultado_a = solve(f,x) resultado_a
[x == -1/2*sqrt(17) + 3/2, x == 1/2*sqrt(17) + 3/2]
# ou ainda resultado_b = f.solve(x) resultado_b
[x=1217+32x = -\frac{1}{2} \, \sqrt{17} + \frac{3}{2}, x=1217+32x = \frac{1}{2} \, \sqrt{17} + \frac{3}{2}]
[x=1217+32x = -\frac{1}{2} \, \sqrt{17} + \frac{3}{2}, x=1217+32x = \frac{1}{2} \, \sqrt{17} + \frac{3}{2}]

O resultado de "resultado" é um vetor coluna que apresenta os valores de X1 e X2. Dessa forma, podemos acessar somente o valor de X1 ou de X2

resultado_b[0]; resultado_b[1]
x=1217+32x = -\frac{1}{2} \, \sqrt{17} + \frac{3}{2}
x=1217+32x = \frac{1}{2} \, \sqrt{17} + \frac{3}{2}

ATENÇÃO! Solve() não resolve todo tipo de equação. Veja o exemplo abaixo:

fx = x^2 - 2 * x + cos(2*x+pi) fx
x^2 - 2*x + cos(pi + 2*x)
solve(fx,x)
[x == -sqrt(cos(2*x) + 1) + 1, x == sqrt(cos(2*x) + 1) + 1]

Como podemos observar, o comando solve() não resolveu a equação. Neste caso temos que usar métodos de aproximação numérica para encontrar valores que satisfação uma certa restrição. Um desses métodos é o 'find root':

find_root(intervalo_a, intervalo_b)

sendo "intervalo_a" e "intervalo_b", os valores de X mais próximos da raiz a ser encontrada.

# primeiro chute: 0<=x<=1 fx.find_root(0,1)
Error in lines 2-2 Traceback (most recent call last): File "/projects/sage/sage-6.10/local/lib/python2.7/site-packages/smc_sagews/sage_server.py", line 947, in execute exec compile(block+'\n', '', 'single') in namespace, locals File "", line 1, in <module> File "sage/symbolic/expression.pyx", line 10840, in sage.symbolic.expression.Expression.find_root (/projects/sage/sage-6.10/src/build/cythonized/sage/symbolic/expression.cpp:57550) return find_root(f, a=a, b=b, xtol=xtol, File "/projects/sage/sage-6.10/local/lib/python2.7/site-packages/sage/numerical/optimize.py", line 108, in find_root raise RuntimeError("f appears to have no zero on the interval") RuntimeError: f appears to have no zero on the interval

No primeiro chut não foi encontrado uma raiz no intervalo.

# segundo chute: 1<=x<=5 fx.find_root(1,5)
1.3330565711303075

O valor de uma raiz (pode existir outras) foi encontrado no segundo chute, porém, é difícil acertar e muitas tentativas podem ser utilizadas gerando perda de tempo. Uma saída prática é obsevar primeiro o gráfico e a partir da observação determinar os valores do intervalo. Como não temos certeza qual o intervalo ou se existe somente uma raiz, a dica é usar um intervalo de tamanho considerável (-20,20)

plot(fx,(x,-20,20), gridlines='minor',figsize=(4, 3))

De acordo com o gráfico abaixo, podemos ver que existe duas raizes entre -2 e 2, sendo uma entre -1 e 0 e a outra entre 1 e 2.

plot(fx,(x,-2,2), gridlines='minor',figsize=(4, 3))
# segundo chute: -1<=x<=0 fx.find_root(-1,0)
-0.33540803933285074
fx.find_root(-1,0); fx.find_root(1,2)
-0.33540803933285074 1.3330565711303535
fx.find_local_minimum(-1,1)
(-1.3423554146943397, 0.35228846676181602)

Sistemas de Equações

reset()

Equações Lineares

%var y eq1 = 2*x+3*y-6 eq2 = 3*x-4*y-12 eq1; eq2
2*x + 3*y - 6 3*x - 4*y - 12
implicit_plot(eq1,(x,-10,10),(y,-10,10)) + implicit_plot(eq2,(x,-10,10),(y,-10,10), gridlines='minor')

A raiz é o ponto de encontro das duas retas, valor entre 3 e 4 para x e 0 e 1 para y.

solve([eq1 ,eq2 ],[x , y])
[[x == (60/17), y == (-6/17)]]

Equações Não Lineares

%var y eq1 = y^2 + 8*x == 0 eq2 = -x^2 -8*y == 2 eq1; eq2
y^2 + 8*x == 0 -x^2 - 8*y == 2
implicit_plot(eq1,(x,-10,10),(y,-10,10),color = 'red') + implicit_plot(eq2,(x,-10,10),(y,-10,10), gridlines='minor')
solve([eq1,eq2],[x,y])
[[x == -0.00781297686626381, y == -0.2500076305588621], [x == -7.830640958832725, y == -7.914868105515588], [x == (3.919227064207133 - 7.072470694459699*I), y == (4.082437617897199 + 6.929654639134567*I)], [x == (3.919227064207133 + 7.072470694459699*I), y == (4.082437617897199 - 6.929654639134567*I)]]

Sistemas de Inequações

reset()
%var y inq1 = x - y >= 10 inq2 = 2*x - y/8 <= 1
region_plot(inq1,(x,-20,20),(y,-20,20),incol="red") + region_plot(inq2,(x,-20,20),(y,-20,20))
solve([inq1,inq2],[x,y])
[[x == (-2/15), y == (-152/15)], [x == 1/16*y + 1/2, y < (-152/15)], [x == y + 10, y < (-152/15)], [y + 10 < x, x < 1/16*y + 1/2, y < (-152/15)]]

Outro exemplo

inq1(x,y) = x - y >=10 inq2(x,y) = 2*x - y/8 <= 1 eq1(x,y) = y/x == 4
region_plot(inq1,(x,-20,20),(y,-20,20),incol="red") + region_plot(inq2,(x,-20,20),(y,-20,20))+ region_plot(eq1,(x,-20,20),(y,-20,20),incol="green")
solve([inq1,inq2,eq1],[x,y])
[[x == (-10/3), y == (-40/3), (-10/3) != 0], [x == 1/4*y, y < (-40/3), 1/4*y != 0]]

%%%% FIM CALCULO RAIZES EQUAÇÕES %%%%

var('y')
y
f = x+1 f.subs(x=1)
2