Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python TypeError: unsupported operand type(s) for /: 'NoneType' and 'float'

This is a assignment we got from our teacher. We are supposed to use Simpson's Rule to do a numerical integration of a functions f(x) = x*cos(third_root(x))

But we are not allowed to use the built in function of cos or use x**(1.0/3.0) to find the third root.

I get the errors:

Traceback (most recent call last):
  File "path", line 104, in <module>
    print simpson(f, 1.0, 50.0, 10)
  File "path", line 91, in simpson
    I += 2 * f(x) + (4.0 * f(x + h))
  File "path", line 101, in f
     return x*final_cos(final_3root(x))
  File "path", line 72, in final_cos
    x = float_mod(x, 2 * pi)
  File "path", line 42, in float_mod
    k = int(x / a)
TypeError: unsupported operand type(s) for /: 'NoneType' and 'float'

Process finished with exit code 1

And here is my code:

import math


def final_3root(a):
    q, m = math.frexp(a)

    if 0.5 > q or q > 1.0:
        raise ValueError('Math domain error')

    x = 0.8968521468804229452995486
    factor_1 = 0.6299605249474365823836053
    factor_2 = 0.7937005259840997373758528

    q_croot = (q / (x * x) + 2.0 * x) / 3.0
    q_croot = (q / (q_croot * q_croot) + 2.0 * q_croot) / 3.0
    q_croot = (q / (q_croot * q_croot) + 2.0 * q_croot) / 3.0
    q_croot = (q / (q_croot * q_croot) + 2.0 * q_croot) / 3.0

    if m % 3.0 == 0.0:
        m /= 3
        answer = math.ldexp(q_croot, m)

    elif m % 3 == 1:
        m += 2
        m /= 3
        answer = factor_1 * math.ldexp(q_croot, m)

    elif m % 3 == 2:
        m += 1
        m /= 3
         answer = factor_2 * math.ldexp(q_croot, m)

    fasit = a ** (1.0 / 3.0)

#----------------------------------------------

def float_mod(x, a):
    k = int(x / a)
    if (x * a) < 0:
        k -= 1
    return x - float(k) * a


def ratio_based_cosinus(x):
    epsilon = 1.0e-16

    previous_Value = 1
    return_Value = 1
    n = -1
    while True:
        n += 1
        ratio = (-x * x) / (((2 * n) + 1) * ((2 * n) + 2))

        previous_Value *= ratio
        return_Value += previous_Value

        if abs(previous_Value) < epsilon:
            break
    return return_Value


def final_cos(x):
    if isinstance(x, int):
        x += 0.0

    pi = 3.1415926

    x = float_mod(x, 2 * pi)

    if x > pi:
        return ratio_based_cosinus(-x)
   else:
        return ratio_based_cosinus(x)

 #----------------------------------------------


def simpson(f, a, b, N):
    if N & 1:
        raise ValueError('Ugyldig tall')

    I = 0
    h = float((b - a) / N)
    x = float(a)

    for i in range(0, N / 2):
        I += 2 * f(x) + (4.0 * f(x + h))
        x += 2 * h

    I += float(f(b) - f(a))
    I *= h / 3

    print "The sum is: ", I


def f(x):


     return x*final_cos(final_3root(x))


print simpson(f, 1.0, 50.0, 10)
like image 867
Zahand Avatar asked Mar 31 '14 12:03

Zahand


People also ask

How do I fix unsupported operand type in Python?

The Python "TypeError: unsupported operand type(s) for /: 'str' and 'int'" occurs when we try to use the division / operator with a string and a number. To solve the error, convert the string to an int or a float , e.g. int(my_str) / my_num .

What does TypeError unsupported operand type S for /: List and int?

The Python "TypeError: unsupported operand type(s) for /: 'list' and 'int'" occurs when we try to use the division / operator with a list and a number. To solve the error, figure out how the variable got assigned a list and correct the assignment, or access a specific value in the list.

What does unsupported operand type S for +: NoneType and int mean in Python?

In python, TypeError: unsupported operand type(s) for +: 'NoneType' and 'int' error occurs when an integer value is added to a variable that is None. You can add an integer number with a another number. You can't add a number to None.

What does unsupported operand type S for /: STR and STR mean?

The Python "TypeError: unsupported operand type(s) for -: 'str' and 'str'" occurs when we try to use the subtraction - operator with two strings. To solve the error, convert the strings to int or float values, e.g. int(my_str_1) - int(my_str_2) . Here is an example of how the error occurs. main.py. Copied!


1 Answers

final_3root is missing a return statement.

Look closely at the error. x is None. If you trace it back, you'll see that the return value of that function is used, but it never returns anything.

like image 151
Jonathon Reinhart Avatar answered Oct 19 '22 23:10

Jonathon Reinhart