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)
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 .
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.
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.
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!
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With