寻找近似系数
Finding coefficients for approximations
出于对数学的好奇心,我只想近似计算任何数字,纯粹是根据 e。
示例:如果我给出 n=7.3890,程序必须 return a=1,b=0,这是所有整数对 (a,b) 的最佳近似值(最小误差)
from math import *
n=float(input("Enter a number to be approximated:"))
for a in range(10):
for b in range(10):
if ((e**2)*a)+(e*b)==n:
print(a,b)
此程序无法执行此操作,因为它搜索的是精确值而不是近似值
前提:以下解决方案找到整数(近似)系数。
使代码更高效的一种简单方法是使用 vectorization(使用 numpy
库)计算所有索引组合的多项式,然后 return 组合多项式值更接近 n
.
的指数
以下代码使用 np.meshgrid
, then computes the polynomial on all combinations and computes the positions of the combination making the polynomial closer to n
using np.argmin
创建所有整数 a
和 b
组合的网格。最后,它 return 是组合的 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)
returns (1, 0)
在我的笔记本电脑上大约需要 75 微秒。
您可以轻松地将上面的代码扩展到 higher-order 多项式的情况,因为 np.meshgrid
方法接受任意数量的范围来创建网格。
出于对数学的好奇心,我只想近似计算任何数字,纯粹是根据 e。
示例:如果我给出 n=7.3890,程序必须 return a=1,b=0,这是所有整数对 (a,b) 的最佳近似值(最小误差)
from math import *
n=float(input("Enter a number to be approximated:"))
for a in range(10):
for b in range(10):
if ((e**2)*a)+(e*b)==n:
print(a,b)
此程序无法执行此操作,因为它搜索的是精确值而不是近似值
前提:以下解决方案找到整数(近似)系数。
使代码更高效的一种简单方法是使用 vectorization(使用 numpy
库)计算所有索引组合的多项式,然后 return 组合多项式值更接近 n
.
以下代码使用 np.meshgrid
, then computes the polynomial on all combinations and computes the positions of the combination making the polynomial closer to n
using np.argmin
创建所有整数 a
和 b
组合的网格。最后,它 return 是组合的 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)
returns (1, 0)
在我的笔记本电脑上大约需要 75 微秒。
您可以轻松地将上面的代码扩展到 higher-order 多项式的情况,因为 np.meshgrid
方法接受任意数量的范围来创建网格。