Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 计算积分:一个线性解?_Python_Function_Integral - Fatal编程技术网

Python 计算积分:一个线性解?

Python 计算积分:一个线性解?,python,function,integral,Python,Function,Integral,我正在编写一个程序来寻找函数的积分,在这个程序中,用户指定矩形的数量、开始和停止 注意:我使用的是矩形的左端点 我的功能运行得很好(至少看起来很完美)。但是,我想看看是否可以为它编写一行程序,但不确定如何编写,因为我正在使用eval()。这是我的原始代码: def integral(function, n=1000, start=0, stop=100): """Returns integral of function from start to stop with 'n' rectan

我正在编写一个程序来寻找函数的积分,在这个程序中,用户指定矩形的数量、开始和停止

注意:我使用的是矩形的左端点

我的功能运行得很好(至少看起来很完美)。但是,我想看看是否可以为它编写一行程序,但不确定如何编写,因为我正在使用
eval()
。这是我的原始代码:

def integral(function, n=1000, start=0, stop=100):
    """Returns integral of function from start to stop with 'n' rectangles"""
    increment, rectangles, x = float((stop - start)) / n, [], start
    while x <= stop:
        num = eval(function)
        rectangles.append(num)
        if x >= stop: break
        x += increment
    return increment * sum(rectangles)
实际答案是
1000000/3
,因此我的函数给出了一个非常好的估计(仅针对1000个矩形)

我在一条航线上的尝试:

def integral2(function, n=1000, start=0, stop=100): rectangles = [(float(x) / n) for x in range(start*n, (stop*n)+1)]; return (float((stop-start))/n) * sum([eval(function) for x in rectangles])
然而,这并不是真正的一行,因为我使用的是分号。另外,它有点慢(需要几秒钟的时间,这非常重要),并且给出了错误的答案:

>>> integral2('x**2')
33333833.334999967
那么,对于这个函数是否可以使用一个线性解决方案呢?我不知道如何在同一个列表中实现
eval()
float(x)/n
float(x)/n
范围
功能中实现一个虚拟“步骤”

谢谢

def integral2(function, n=1000, start=0, stop=100): return (float(1)/n) * sum([eval(function) for x in [(float(x) / n) for x in range(start*n, (stop*n)+1)]])
请注意,
integral
integral2
之间有很大区别:
integral2
生成
(停止*n)+1-(开始*n)
矩形,而
integral
只生成
n
矩形




或许更具可比性的
integral
翻译为:

def integral3(function, n=1000, start=0, stop=100): return (float(stop-start)/n) * sum([eval(function) for x in [start+(i*float(stop-start)/n) for i in range(n)]])

In [77]: %timeit integral3('x**2')
100 loops, best of 3: 7.1 ms per loop

当然,应该说,除了(反常的?)娱乐之外,把它变成一句台词是没有任何意义的:)

请注意,
integral
integral2
之间有很大区别:
integral2
生成
(停止*n)+1-(开始*n)
矩形,而
integral
只生成
n
矩形




或许更具可比性的
integral
翻译为:

def integral3(function, n=1000, start=0, stop=100): return (float(stop-start)/n) * sum([eval(function) for x in [start+(i*float(stop-start)/n) for i in range(n)]])

In [77]: %timeit integral3('x**2')
100 loops, best of 3: 7.1 ms per loop


当然,应该说,除了(反常的?)娱乐之外,把它变成一行代码是没有任何意义的:)

如果您将
函数作为Python
可调用的
本身来接收,则不需要使用
eval
您还可以使用
numpy.arange
函数生成浮点值列表

案例1:
函数
是一个Python
可调用的函数
案例2:
函数
不是Python
可调用的

如果将
函数
作为Python
可调用
本身接收,则不需要使用
eval
您还可以使用
numpy.arange
函数生成浮点值列表

案例1:
函数
是一个Python
可调用的函数
案例2:
函数
不是Python
可调用的

用numpy的linspace作弊怎么样

integrate = lambda F, n0, nf: sum([F(x)*(abs(nf-n0)/(abs(nf-n0)*300))for x in np.linspace(n0, nf, abs(nf-n0)*300)])
它采用函数F、下限n0和上限nf。以下是0到5之间的x**2的工作原理:

In [31]: integrate(lambda x: x**2, 0, 5)
Out[31]: 41.68056482099179
非常接近

编辑:这是我的linspace one班轮

linspace = lambda lo, hi, step:[lo + (hi-lo)/step*i + (hi-lo)/(step*step-1)*i for i in range(step)]

有一种方法可以把它变成一个完整的一行积分器。我把这个留给你,我的朋友

用numpy的linspace作弊怎么样

integrate = lambda F, n0, nf: sum([F(x)*(abs(nf-n0)/(abs(nf-n0)*300))for x in np.linspace(n0, nf, abs(nf-n0)*300)])
它采用函数F、下限n0和上限nf。以下是0到5之间的x**2的工作原理:

In [31]: integrate(lambda x: x**2, 0, 5)
Out[31]: 41.68056482099179
非常接近

编辑:这是我的linspace one班轮

linspace = lambda lo, hi, step:[lo + (hi-lo)/step*i + (hi-lo)/(step*step-1)*i for i in range(step)]

有一种方法可以把它变成一个完整的一行积分器。我把这个留给你,我的朋友

请记住,浮点数本质上是不准确的。试一试可能会有帮助。此外,一句话也不是什么值得努力的事情。现在很糟糕。@WaleedKhan我不想在我的程序中使用一行程序,因为它比较慢。我只是想知道这是否可能,如果可能,如何实现。顺便说一句,我会将一个可调用对象(例如lambda,一个函数,…)传递给函数,而不是传递给
eval
-它更干净,可以大大加快速度。@MatteoItalia同意-
lambda x:x**2
eval('x**2')好得多
请记住,浮点数本质上是不准确的。试一试可能会有帮助。此外,一句话也不是什么值得努力的事情。现在很糟糕。@WaleedKhan我不想在我的程序中使用一行程序,因为它比较慢。我只是想知道这是否可能,如果可能,如何实现。顺便说一句,我会将一个可调用对象(例如lambda,一个函数,…)传递给函数,而不是传递给
eval
-它更干净,可以大大加快速度。@MatteoItalia同意-
lambda x:x**2
eval('x**2')好得多
我的不是那么准确,尽管我的也不是那么准确
linspace = lambda lo, hi, step:[lo + (hi-lo)/step*i + (hi-lo)/(step*step-1)*i for i in range(step)]