问题描述
出于数学好奇心,我只想纯粹根据e来近似任意数字。
示例:如果我给出n = 7.3890,则程序必须返回a = 1,b = 0,这是所有整数对(a,b)的最佳近似值(最小误差)
it('Should check if #addItem button no longer exists',() => {
component.addItem(); // click on the button
fixture.detectChanges()
expect(component.addMode).toBeTruthy();
});
该程序无法执行此操作,因为它搜索的是精确值,而不是近似值
解决方法
前提:以下解决方案可找到整数(近似)系数。
提高代码效率的一种简单方法是使用vectorization(使用numpy
库)对所有索引组合计算多项式,然后返回其值等于多项式更接近n
的值。
以下代码使用np.meshgrid
创建所有整数a
和b
组合的网格,然后计算所有组合的多项式并计算组合的位置,使多项式更接近n
使用np.argmin
。最后,它返回组合的a
和b
值。
import numpy as np
def find_approximate_integer_coefficients(n,x,amin=-10,amax=10,bmin=-10,bmax=10):
a_range = np.arange(amin,amax+1)
b_range = np.arange(bmin,bmax+1)
a_coefficients,b_coefficients = np.meshgrid(a_range,b_range)
polynomial_value = (a_coefficients * (x ** 2) + b_coefficients * x)
argmin = np.abs(polynomial_value - n).argmin()
return a_coefficients.flatten()[argmin],b_coefficients.flatten()[argmin]
例如,find_approximate_integer_coefficients(7.3890,np.e)
在笔记本电脑上大约75微秒内返回(1,0)
。
由于np.meshgrid
方法接受任意数量的范围来创建网格,因此您可以轻松地将上面的代码扩展到高阶多项式的情况。