使用调和平均值近似对数

问题描述 投票:0回答:1

这里是近似 log10(x+1), (x+1) 的函数 < ~1.2

a = 1.097
b = 0.085
c = 2.31

ans = 1 / (a - b*x + c/x)

所以它看起来应该是这样的 它的工作原理是调整调和平均值以匹配 log10 但问题出在 abc 的值上

问题是如何得到恰到好处的a、b和c 以及如何做出更好的近似

我编写了这段代码,可以为您提供 a、b、c 的相当好的近似值 但我的代码无法让它变得更好

这是我的代码:

import numpy as np

a = 1
b = 0.01
c = 2

def mlg(t):
    x = t
    if t == 0:
        x = 0.00000001
    x2 = x*x
    o = a - (b * x) + (c / x)
    return 1/o

def mlg0(t):
    x = t
    if t == 0:
        x = 0.00000001
    x2 = x*x
    o = a - (b * x) + (c / x)
    return o

for i in range(9000):
    n1 = np.random.uniform(0,1.19,1000)
    for i in range(1000):
        n = n1[i]
        o = np.log10(n+1)
        u = mlg(n) - o
        e = u ** 2

        de_da = 0 - 2 * (u) / (mlg0(n) ** 2)
        de_db = de_da * n 
        de_dc = de_da / n

        a -= de_da * 0.00001
        b -= de_db * 0.00001
        c -= de_dc * 0.00001

print(a,b,c)

那么你们对于如何产生更好的价值有什么想法吗?

我在神经网络中使用了类似的反向传播方法,但它无法给我更好的值

python math logarithm approximation
1个回答
0
投票

如果将它们通过泰勒级数展开为 x 的幂,那么

enter image description here

使 x、x^2 和 x^3 的系数相等可得出

enter image description here

代码中:

import math
import numpy as np
import matplotlib.pyplot as plt

c = math.log( 10 )
a = c / 2
b = c / 12

print( "a, b, c = ", a, b, c )


x = np.linspace( -0.2, 0.2, 50 )
y = np.log10( 1 + x )
fit = x / ( a * x - b * x ** 2 + c )

plt.plot( x, y  , 'b-', label="Original" )
plt.plot( x, fit, 'ro', label="Fit"      )
plt.legend()
plt.show()

输出: enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.