scipy 给定一个书面的再分配函数,我想决定第一项是什么

7xzttuei  于 2023-03-30  发布在  其他
关注(0)|答案(1)|浏览(89)

我用Python编写了以下函数,返回幂分布的权重

import math
def get_power_distribution(distribution_count=8, power_distribution=1.3):
    repartition = [math.pow(power_distribution, i + 1) for i in range(distribution_count)]
    repartition_sum = sum(repartition)
    distribution = [val / repartition_sum for val in repartition]
    return distribution

它将1 ^ power_distribution幂到distribution_count ^ power_distribution,对所有结果求和,然后告诉每个幂代表和的哪一部分。
返回的分配和等于100%,1.0

res=get_power_distribution(3,10)
[0.009009009009009009, 0.09009009009009009, 0.9009009009009009]
sum(res)
1.0

我想决定返回列表的第一项是什么而不是0.009009009009009009作为res[0]我想计算power_distribution会给我0.01这个distribution_count
函数的新签名可以是
一个二个一个一个
用sympy或scipy解决它似乎是可能的。
我想到了这样一件事:

def base_to_power(target,distib_count):
    from sympy import symbols, solve
    x = symbols('x')
    expr = x * sum([x**(i+1) for i in range(distib_count)]) - target # Exact opposite of res[0] from get_power_distribution
    res = solve(expr)
    return res
vsikbqxv

vsikbqxv1#

您可以编写自己的二分例程来对像这样的函数进行二分

def bisect(f, lo, hi, dif):
    if hi < lo:
        hi, lo = lo, hi
    a = f(lo)
    b = f(hi)
    while a*b < 0 and hi-lo > dif:
        m = (lo + hi)/2
        c = f(m)
        if c*f(hi) < 0:
            a = c
            lo = m
        else:
            b = c
            hi = m
    return m

然后

>>> f = lambda x: get_power_distribution(3, x)[0] - 0.01
>>> lo=1;hi=10,tol=0.01;bisect(f, (lo, hi), tol)
9.4609375

或者你可以写一个允许符号输入的函数(ala SymPy),然后使用现有的nsolve:将math.pow更改为sympy.Pow并导入sympy而不是math.

>>> nsolve(f(x), (1, 10), solver='bisect', prec=3)
9.46

如果你使用符号形式,你也可以得到一个x的多项式,你想解决。因为它的阶数比计数少1,可能没有一个封闭的形式的解决方案,但你可以很容易地计算根(迭代)到任何你想要的精度。不是迭代的部分是要解决的表达式的创建,例如。

def g(t, n):
    eq = get_power_distribution(n, x)[0] - nsimplify(t, rational=True)
    pos = [i for i in real_roots(eq.as_numer_denom()[0]) if i.is_positive]
    assert len(pos) == 1
    return pos[0]
>>> g(.01, 3)
-1/2 + sqrt(397)/2
>>> _.n(3)
9.46
>>> g(2/5, 4)
CRootOf(2*x**3 + 2*x**2 + 2*x - 3, 0)
>>> _.n(3)
0.961

相关问题