2014-03-31 103 views
3

这是我们从老师那得到的任务。我们应该用辛普森规则做了数值积分的功能f(x) = x*cos(third_root(x))Python类型错误:不支持的操作数类型为:'NoneType'和'float'

但我们不允许使用内置的cos功能或使用x**(1.0/3.0)找到第三根。

我得到的错误:

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 

这里是我的代码:

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

'final_3root'和'simpson'没有return语句,所以默认返回'None'。 – poke

回答

14

final_3root缺少return语句。

仔细查看错误。 xNone。如果你追溯它,你会看到该函数的返回值被使用,但它永远不会返回任何东西。

+0

它的工作。非常感谢 :) – Zahand

相关问题