我具有要近似的复杂函数,并且我使用np.polyfit找到多项式来近似它。

我想找到正确的十进制位置的统计数据,以确定近似值的质量。

但是很难有效地做到。目前,我只是将元素转换为字符串,并根据元素找到最长的常见前缀长度元素,不用说这效率低下。

import numpy as np
from collections import Counter

x = np.linspace(1, 2, 4096)
exp = np.exp(x)
poly = np.polyfit(x, exp, 6)
approx = np.polyval(poly, x)

def LCP(s1, s2):
    c = 0
    for a, b in zip(s1, s2):
        if a != b:
            break
        c += 1
    return c

def leading_digits(f1, f2):
    l = LCP(str(f1), str(f2)) - 1
    return max(l, 0)

correct_places = Counter()
for a, b in zip(approx, exp):
    correct_places[leading_digits(a, b)] += 1
Counter({7: 2014, 8: 1699, 6: 207, 9: 135, 5: 27, 10: 12, 11: 2})

什么是更有效的方法?

分析解答

比较平等的领先数字的数量似乎不是一个好方法。 1.011.09具有共同的2领先数字,1.091.101,但第二对具有较小的绝对差。

我将计算绝对差异,并使用对数获得它的数量级:

Counter(-np.floor(np.log10(abs(approx-exp))).astype(int))

输出:

Counter({8: 3488, 7: 307, 9: 272, 10: 26, 11: 2, 12: 1})