8 - CALCULO-RAIZES-EQUACOES

560 days ago by jmarcellopereira

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

SAGE também permite calcular raízes de equações lineares e não lineares através o comando solve(equacao,var)

solve(x^2-3*x-2,x) 
       
[x == -1/2*sqrt(17) + 3/2, x == 1/2*sqrt(17) + 3/2]
[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]
[x == -1/2*sqrt(17) + 3/2, x == 1/2*sqrt(17) + 3/2]
resultado_b = f.solve(x) resultado_b 
       
[x == -1/2*sqrt(17) + 3/2, x == 1/2*sqrt(17) + 3/2]
[x == -1/2*sqrt(17) + 3/2, x == 1/2*sqrt(17) + 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 == -1/2*sqrt(17) + 3/2
x == 1/2*sqrt(17) + 3/2
x == -1/2*sqrt(17) + 3/2
x == 1/2*sqrt(17) + 3/2

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

t = x^2 - 2 * x + cos(2*x+pi) t 
       
x^2 - 2*x + cos(pi + 2*x)
x^2 - 2*x + cos(pi + 2*x)
solve(t(x),x) 
       
__main__:2: DeprecationWarning: Substitution using function-call syntax
and unnamed arguments is deprecated and will be removed from a future
release of Sage; you can use named arguments instead, like EXPR(x=...,
y=...)
See http://trac.sagemath.org/5930 for details.
[x == -sqrt(cos(2*x) + 1) + 1, x == sqrt(cos(2*x) + 1) + 1]
__main__:2: DeprecationWarning: Substitution using function-call syntax and unnamed arguments is deprecated and will be removed from a future release of Sage; you can use named arguments instead, like EXPR(x=..., y=...)
See http://trac.sagemath.org/5930 for details.
[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 t.find_root(0,1) 
       
Traceback (click to the left of this block for traceback)
...
RuntimeError: f appears to have no zero on the interval
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "_sage_input_9.py", line 10, in <module>
    exec compile(u'open("___code___.py","w").write("# -*- coding: utf-8 -*-\\n" + _support_.preparse_worksheet_cell(base64.b64decode("IyBwcmltZWlybyBjaHV0ZTogMDw9eDw9MQoKdC5maW5kX3Jvb3QoMCwxKQ=="),globals())+"\\n"); execfile(os.path.abspath("___code___.py"))
  File "", line 1, in <module>
    
  File "/tmp/tmpI2t5EQ/___code___.py", line 4, in <module>
    exec compile(u't.find_root(_sage_const_0 ,_sage_const_1 )
  File "", line 1, in <module>
    
  File "sage/symbolic/expression.pyx", line 10854, in sage.symbolic.expression.Expression.find_root (/home/jmarcellopereira/SageMath/src/build/cythonized/sage/symbolic/expression.cpp:57521)
  File "/home/jmarcellopereira/SageMath/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 t.find_root(1,5) 
       
1.3330565711303075
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(t,(x,-20,20), gridlines='minor',figsize=(6, 5)) 
       

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(t,(x,-2,2), gridlines='minor',figsize=(6, 5)) 
       
# segundo chute: -1<=x<=0 t.find_root(-1,0) 
       
-0.33540803933285074
-0.33540803933285074
t.find_root(-1,0);t.find_root(1,2) 
       
-0.33540803933285074
1.3330565711303535
-0.33540803933285074
1.3330565711303535
t.find_local_minimum(-1,1) 
       
(-1.3423554146943397, 0.35228846676181602)
(-1.3423554146943397, 0.35228846676181602)

Sistemas De Equações

reset() 
       

Equações Lineares

eq1(x,y) = 2*x+3*y-6; eq2(x,y) = 3*x-4*y-12; eq1; eq2 
       

solve([eq1 ,eq2 ],[x , y]) 
       

Equações Não Lineares

eq1(x,y) = y*x -2*x == 0 eq2(x,y) = -x^2 -8*y == 2 eq1; eq2 
       

solve([eq1,eq2],[x,y]) 
       

Sistemas de Inequações

inq1(x,y) = x - y >=10 inq2(x,y) = 2*x - y/8 <= 1 
       
solve([inq1,inq2],[x,y]) 
       

Outro exemplo

inq1(x,y) = x - y >=10 inq2(x,y) = 2*x - y/8 <= 1 eq1 = y/x == 4 
       
solve([inq1,inq2,eq1],[x,y]) 
       

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