8

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)
1
  • 1
    final_3root and simpson don’t have return statements, so they will return None by default. Commented Mar 31, 2014 at 12:59

1 Answer 1

19

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.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.