Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

calculating cubic root in python

Tags:

python

I'm trying to evaluate the following function in python:

f(x) = (1 + cos(x))^(1/3)


def eval( i ):
   return math.pow( (1 + math.cos( i )), 1/3)

why is it always returning me 1? I'm trying to calculate the Right and Left approximation of an integral, and latter apply Simpson's Rule, but Python does not seem to like that expression. Help? *Complete Code *

import math

min = 0
max = math.pi / 2
n = 4
delta  = ( min + max ) / n

def eval( i ):
   return math.pow( (1 + math.cos( i )), 1/3)

def right( ):
   R = 0
   for i in range(1, n+1):
        R += eval( i )

   return R

def left():
   L = 0
   for i in range(0, n):
        print eval( i )
        L += eval( i )
like image 994
cybertextron Avatar asked Sep 09 '12 00:09

cybertextron


People also ask

What is the correct expression for calculating the cube root of 27 in Python?

Python Get Cube Root Using the Exponent Symbol ** For example, the cube root of integer -27 should be -3 but Python returns 1.5000000000000004+2.598076211353316j .

How do you write roots in Python?

sqrt() function is an inbuilt function in Python programming language that returns the square root of any number. Syntax: math. sqrt(x) Parameter: x is any number such that x>=0 Returns: It returns the square root of the number passed in the parameter.


2 Answers

Use floating point math (1 / 3 truncates to zero). Also, no need for math.pow (** for exponentiation)...

(1 + math.cos(i)) ** (1 / 3.0)

Also, min, max and eval are built-in functions - you are shadowing them.

Also, the extra spaces you are adding in your function call arguments are against PEP-8 (Python Style Guide). Specifically this paragraph:

http://www.python.org/dev/peps/pep-0008/#whitespace-in-expressions-and-statements

like image 145
FogleBird Avatar answered Sep 18 '22 22:09

FogleBird


Use

1/3.0

instead of

1/3

in your code. Otherwise your exponent will always be 0 due to integer truncation.

Whether to use ** or math.pow() is up to your preference, most would probably just use **.

It's probably not a good idea to define a function named eval since eval() is already in use by Python as a built-in function.

Background:

Note that you could also do 1.0 / 3 or 1.0 / 3.0 .. as long as one of the operands in the division is a float the result will be a float.

However, this float(1/3) would not work since it would convert the 0 resulting from the integer division 1/3 into a float giving you 0.0

Under Python 3.x the division operator / would have worked as you expected (ie it would give you a float value even with two integer operands). To get integer division you would have to use //.

So had you run this under Python 3.x you would not have encountered this particular problem.

like image 45
Levon Avatar answered Sep 20 '22 22:09

Levon