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)]