8

我正在尝试在 python 中评估以下函数:

f(x) = (1 + cos(x))^(1/3)


def eval( i ):
   return math.pow( (1 + math.cos( i )), 1/3)

为什么它总是返回我1?我正在尝试计算积分的RightLeft近似值,后者 apply 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 )
4

5 回答 5

18

使用浮点数学(1 / 3 截断为零)。此外,不需要 math.pow (** 求幂)...

(1 + math.cos(i)) ** (1 / 3.0)

此外,minmaxeval内置函数 - 您正在遮蔽它们。

此外,您在函数调用参数中添加的额外空格违反PEP-8(Python 样式指南)。特别是这一段:

http://www.python.org/dev/peps/pep-0008/#whitespace-in-expressions-and-statements

于 2012-09-09T00:34:31.433 回答
10

利用

1/3.0

代替

1/3

在你的代码中。否则,您的指数将始终0归因于整数截断。

是否使用**math.pow()取决于您的喜好,大多数人可能只会使用**.

定义一个名为的函数可能不是一个好主意,eval因为eval()已经被 Python 用作内置函数。

背景:

请注意,您也可以做 1.0 / 3 or 1.0 / 3.0.. 只要除法中的操作数之一是 a结果float将是 a float

但是,这 float(1/3)不起作用因为它将0整数除法的结果1/3转换为float给你0.0

Python 3.x下,除法运算符/会按照您的预期工作(即,float即使有两个整数操作数,它也会给您一个值)。要获得整数除法,您必须使用//.

所以如果你在 Python 3.x 下运行它,你就不会遇到这个特殊的问题。

于 2012-09-09T00:33:47.520 回答
1

Python 3.11 中的新功能

math模块现在包含一个内置的cbrt立方根,因此您的函数可以实现为:

def f(x):
    return math.cbrt(1 + math.cos(x))
于 2021-07-26T08:17:48.123 回答
0

1/3 是整数除法,计算结果为 0。试试 1./3

于 2012-09-09T00:35:09.253 回答
0

我认为这是因为您正在执行整数运算,而您确实打算执行浮点运算。尝试将 [second] 1更改为 1.0

def eval( i ):
    return math.pow( (1 + math.cos( i )), 1.0/3)
于 2012-09-09T00:36:01.023 回答