Suponhamos que queremos desenvolver um programa para calcular a raiz quadrada de um número bem preciso, por exemplo 5. Sabemos que em Python isso não é problema pois alguém resolveu essa questão para nós, graças ao método sqrt do módulo math. Mas vamos admitir que não é assim. Vamos então à procura de um algoritmo. Fazemos uma pesquisa na internet recorrendo ao Google, e lá nos aparece o Método de Newton. Para calcular o valor aproximado da raíz basta iterar a fórmula:
1.
x(n
+
1
)
=
1
/
2
*
(x(n)
+
a
/
x(n))
1.
x
=
2.0
2.
3.
for
i
in
range(
10
):
4.
x
=
1
/
2
*
(x
+
5
/
x)
5.
print
(x)
1.
x
=
4.0
2.
3.
for
i
in
range(
10
):
4.
x
=
1
/
2
*
(x
+
20
/
x)
5.
print
(x)
1.
a
=
eval(input(
'Qual o número? '
))
2.
x
=
a
/
2
3.
4.
for
i
in
range(
10
):
5.
x
=
1
/
2
*
(x
+
a
/
x)
6.
print
(x)
1.
Python
3.2
.
3
(default, Sep
5
2012
,
20
:
52
:
27
)
2.
[GCC
4.2
.
1
(Based on Apple Inc. build
5658
) (LLVM build
2336.1
.
00
)]
3.
Type
"help"
,
"copyright"
,
"credits"
or
"license"
for
more information.
4.
>>>
import
raiz2
5.
Qual o número?
15
6.
3.872983346207417
7.
>>>
Mas uns dias depois o amigo aparece-lhe de novo, muito triste. Queria usar o seu programa do cálculo da raíz quadrada como auxiliar de outro programa para calcular as raízes de um polinómio do segundo grau, e não via como. Ele até sabe a fórmula resolvente:
1.
raiz_1
=
(
-
b
+
raiz2(b
*
*
2
-
4
*
a
*
c))
/
2
*
a
2.
raiz_2
=
(
-
b
-
raiz2(b
*
*
2
-
4
*
a
*
c))
/
2
*
a
01.
import
raiz2
02.
03.
a
=
eval(input(
'Coeficiente de grau 2: '
))
04.
b
=
eval(input(
'Coeficiente de grau 1: '
))
05.
c
=
eval(input(
'Coeficiente de grau 0: '
))
06.
07.
raiz_1
=
(
-
b
+
raiz2(b
*
*
2
-
4
*
a
*
c))
/
2
*
a
08.
raiz_2
=
(
-
b
-
raiz2(b
*
*
2
-
4
*
a
*
c))
/
2
*
a
09.
10.
print
(raiz_1, raiz_2)
01.
Python
3.2
.
3
(default, Sep
5
2012
,
20
:
52
:
27
)
02.
[GCC
4.2
.
1
(Based on Apple Inc. build
5658
) (LLVM build
2336.1
.
00
)]
03.
Type
"help"
,
"copyright"
,
"credits"
or
"license"
for
more information.
04.
[evaluate poli2.py]
05.
>>> Qual o número?
13
06.
3.6055512754639896
07.
Coeficiente de grau
2
:
2
08.
Coeficiente de grau
1
:
3
09.
Coeficiente de grau
0
:
4
10.
Traceback (most recent call last):
11.
File
"/Volumes/Work/__Aulas/_____Aulas 2013_2014/IPRP/Blogue_iprp/causas_das_coisas/poli2.py"
, line
9
,
in
<module>
12.
builtins.TypeError:
'module'
object
is
not
callable
13.
<
/
module>
E ainda há o erro! Mas tu percebes a razão do erro pois lembras-te bem como se pode usar o código (objectos e definições) que se encontra num módulo: tens que colocar o nome do módulo, seguido de um ponto, seguido do nome do objecto ou da definição. Mas neste teu caso como proceder se não há um nome associado ao código que calcula a raiz? Então vamos dar um nome, salvar tudo e voltar a executar. Vejamos as alterações ao teu programa:
01.
def
raiz_quadrada():
02.
a
=
eval(input(
'Qual o número? '
))
03.
x
=
a
/
2
04.
05.
for
i
in
range(
10
):
06.
x
=
1
/
2
*
(x
+
a
/
x)
07.
print
(x)
08.
09.
10.
raiz_quadrada()
01.
import
raiz2
02.
03.
04.
a
=
eval(input(
'Coeficiente de grau 2: '
))
05.
b
=
eval(input(
'Coeficiente de grau 1: '
))
06.
c
=
eval(input(
'Coeficiente de grau 0: '
))
07.
08.
raiz_1
=
(
-
b
+
raiz2.raiz_quadrada(b
*
*
2
-
4
*
a
*
c))
/
2
*
a
09.
raiz_2
=
(
-
b
-
raiz2.raiz_quadrada(b
*
*
2
-
4
*
a
*
c))
/
2
*
a
10.
11.
print
(raiz_1, raiz_2)
01.
Python
3.2
.
3
(default, Sep
5
2012
,
20
:
52
:
27
)
02.
[GCC
4.2
.
1
(Based on Apple Inc. build
5658
) (LLVM build
2336.1
.
00
)]
03.
Type
"help"
,
"copyright"
,
"credits"
or
"license"
for
more information.
04.
[evaluate poli2.py]
05.
>>>Qual o número?
17
06.
4.123105625617661
07.
Coeficiente de grau
2
:
3
08.
Coeficiente de grau
1
:
4
09.
Coeficiente de grau
0
:
5
10.
Traceback (most recent call last):
11.
File
"/Volumes/Work/__Aulas/_____Aulas 2013_2014/IPRP/Blogue_iprp/causas_das_coisas/poli2.py"
, line
10
,
in
<module>
12.
builtins.TypeError: raiz_quadrada() takes no arguments (
1
given)
13.
<
/
module>
1.
if__name__
=
=
‘__main__’:
2.
*
código_aqui
*
01.
def
raiz_quadrada():
02.
a
=
eval(input(
'Qual o número? '
))
03.
x
=
a
/
2
04.
05.
for
i
in
range(
10
):
06.
x
=
1
/
2
*
(x
+
a
/
x)
07.
print
(x)
08.
09.
if
__name__
=
=
'__main__'
:
10.
print
(raiz_quadrada())
Por um lado sabemos que o valor da raiz a calcular é função dos coeficientes e por isso é determinado internamente pelo programa e não por nós através de uma instrução de input. Por outro lado, quando o resultado é calculado não o queremos imprimir mas antes usar dentro de uma expressão mais geral (i.e., (-b + raiz2.raiz_quadrada(b**2 - 4*a*c))/ 2*a)). Por isso o que está mal com a nossa solução é o modo como raiz quadrada recebe o valor e o comunica. Quando não nos interessa a interacção com o utilizador humano o que temos a fazer é usar um parâmetro formal, para a entrada do dado, e return, para devolver o resultado, em vez de input e de print respectivamente. Vamos de novo alterar o código.
01.
def
raiz_quadrada(a):
02.
"""Calcula a raiz quadrada aproximada de a, suposto um número positivo."""
03.
x
=
a
/
2
04.
for
i
in
range(
10
):
05.
x
=
1
/
2
*
(x
+
a
/
x)
06.
return
x
07.
08.
if
__name__
=
=
'__main__'
:
09.
# Para testar
10.
num
=
eval(input(
'O número sff: '
))
11.
print
(raiz_quadrada(num))
01.
Python
3.2
.
3
(default, Sep
5
2012
,
20
:
52
:
27
)
02.
[GCC
4.2
.
1
(Based on Apple Inc. build
5658
) (LLVM build
2336.1
.
00
)]
03.
Type
"help"
,
"copyright"
,
"credits"
or
"license"
for
more information.
04.
[evaluate poli2.py]
05.
Coeficiente de grau
2
:
2
06.
Coeficiente de grau
1
:
16
07.
Coeficiente de grau
0
:
4
08.
raiz
1
-
1.033370
09.
raiz_2
-
30.966630
Mas se olharmos para o código do programa para o cálculo do polinómio, não estamos a incorrer no mesmo erro? Isto é, se alguém quiser usar este código para calcular as raízes de um polinómio não vai ter o mesmo problema? Claro que sim! Então vamos resolver isto do mesmo modo.
01.
import
raiz2
02.
03.
def
polinomio_2_grau(a,b,c):
04.
""" Calcula as raízes de um polinómio do segundo grau. Funciona para raízes não complexas."""
05.
raiz_1
=
(
-
b
+
raiz2.raiz_quadrada(b
*
*
2
-
4
*
a
*
c))
/
2
*
a
06.
raiz_2
=
(
-
b
-
raiz2.raiz_quadrada(b
*
*
2
-
4
*
a
*
c))
/
2
*
a
07.
return
(raiz_1, raiz_2)
08.
09.
if
__name__
=
=
'__main__'
:
10.
# Para testar
11.
a
=
eval(input(
'Coeficiente de grau 2: '
))
12.
b
=
eval(input(
'Coeficiente de grau 1: '
))
13.
c
=
eval(input(
'Coeficiente de grau 0: '
))
14.
r_1, r_2
=
polinomio_2_grau(a,b,c)
15.
print
(
'raiz 1: %f\nraiz 2: %f'
%
(r_1, r_2))
Sem comentários:
Enviar um comentário