我想编写一个自定义函数来将表达式(python或lambda函数)以数字方式与特定容差集成。我知道使用scipy.integrate.quad
可以简单地更改epsabs
,但我想使用numpy自己编写函数。
来自this blogpost我知道函数:
def integrate(f, a, b, N):
x = np.linspace(a+(b-a)/(2*N), b-(b-a)/(2*N), N)
fx = f(x)
area = np.sum(fx)*(b-a)/N
return area
给了我与N段的数值积分。如何编写另一个函数或扩展它以获取tol
输入并增加N,直到两个后续计算之间的差异小于给定的容差?
答案 0 :(得分:1)
使用您拥有的功能,可以从合理的N开始,例如5,并保持数字加倍,直到达到所需的精度。
f = lambda x: np.exp(x)
print(integrate_tol(f, -1, 1, 1e-9))
print(np.exp(1)-np.exp(-1)) # exact value for comparison
一个简单的测试:
2.3504023872876028
2.3504023872876028
打印
tol
无法保证错误确实小于scipy.quad
(但是再次,(4*new_integral - old_integral)/3
并不能保证错误)。在实践中,错误将远小于tol,因为我使用的技巧称为Richardson extrapolation:返回值integrate
通常比新旧近似本身更准确。 (说明:由于4*new_integral - old_integral
使用中点规则,N的每次加倍都会使误差减少大约4倍。因此,取组合create table products
(
id int not null,
productname varchar(45),
productcategory varchar(45),
productprice decimal(8,2),
datepurchased varchar(45),
primary key (id)
);
INSERT INTO products (id, productname, productcategory, productprice, datepurchased) VALUES
(1, 'Toy car', 'toys', 200.30, '2017 December'),
(2, 'Phone', 'phone', 50.00, '2017 December'),
(3, 'Disk drive', 'Accessories', 10.00, '2018 January'),
(4, 'Mouse', 'Accessories', 20.30, '2018 January'),
(5, 'Baby doll', 'toys', 100.00, '2018 February'),
(6, 'Toy car', 'toys', 40.10, '2018 March');
几乎可以消除这两个结果中的残差。 )
(注意:在while循环中,从N = 1开始是不可取的;它可能是不够的,并且因为一些数字巧合而导致过早停止的风险更高,例如,函数在一堆地方为零。)