我正在尝试在python中评估以下函数:
f(x) = (1 + cos(x))^(1/3)
def eval( i ):
return math.pow( (1 + math.cos( i )), 1/3)
为什么它总是归还给我1
?
我正在尝试计算积分的Right
和Left
近似值,后者应用Simpson's Rule
,但Python
似乎不喜欢该表达式。
救命?
*完整代码*
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 )
答案 0 :(得分:17)
使用浮点数学运算(1/3截断为零)。此外,不需要math.pow(**用于取幂)......
(1 + math.cos(i)) ** (1 / 3.0)
此外,min
,max
和eval
是内置函数 - 您正在隐藏它们。
此外,您在函数调用参数中添加的额外空格是针对PEP-8(Python样式指南)。特别是这一段:
http://www.python.org/dev/peps/pep-0008/#whitespace-in-expressions-and-statements
答案 1 :(得分:10)
使用
1/3.0
而不是
1/3
你的代码中的。否则,由于整数截断,您的指数始终为0
。
是否使用**
或math.pow()
取决于您的偏好,大多数人可能只使用**
。
定义名为eval
的函数可能不是一个好主意,因为eval()已经被Python用作内置函数。
背景:
请注意,您也可以执行1.0 / 3
或1.0 / 3.0
..只要一个分部中的操作数为float
,结果就会是float
一个float(1/3)
。
但是,此0
不会工作,因为它会将整数除1/3
产生的float
转换为0.0
给您/
在 Python 3.x 下,除法运算符float
将按预期工作(即,即使有两个整数操作数,它也会为您提供//
值。要获得整数除法,您必须使用{{1}}。
所以你在Python 3.x下运行它,你不会遇到这个特殊的问题。
答案 2 :(得分:1)
math
模块现在包含一个用于立方根的内置 cbrt
,因此您的函数可以实现为:
def f(x):
return math.cbrt(1 + math.cos(x))
答案 3 :(得分:0)
1/3是整数除数,评估为0.尝试1./3
答案 4 :(得分:0)
我认为这是因为您正在执行整数运算,而您确实打算执行浮点运算。尝试将[second] 1 更改为 1.0 :
def eval( i ):
return math.pow( (1 + math.cos( i )), 1.0/3)