代码之家  ›  专栏  ›  技术社区  ›  Herberts

如何在python中创建最小化函数

  •  0
  • Herberts  · 技术社区  · 3 年前

    我应该如何编写这个最小化函数,以便始终将0作为calc函数的结果?

    def calc(x, a, b, c, d):
        z = b + c + d
        y = x * a - z - x * a * 0.015
        return y
    
    
    def minimize(a, b, c, d):
        z = b + c + d
        # 0 = a * 0.095 - z
        # what if z is > a
        m = '?'
        return m
    
    
    A = 100
    B = 90
    C = 5
    D = 1
    
    print(calc(minimize(A, B, C, D), A, B, C, D))
    

    我尝试过使用spicy.optimize.ddifferential_evolution,它可以最大限度地减少calc()的值,但我认为一种简单的微积分方法应该可以做到这一点,我只是不记得如何做到。

    1 回复  |  直到 3 年前
        1
  •  2
  •   Samwise    3 年前

    这只是一个简单的“求解X”问题,如果 calc 如果是固定的,那么只需自己解决它,然后在解决方案中进行代码编写比处理sympy之类的问题更容易。

    不需要复杂的微积分;只需使用你在基础代数中学到的相同技巧来平衡方程(即,只要你对两边做同样的事情,方程就会保持平衡——我记得我八年级的数学老师用平衡秤和一些砝码演示了这个概念)。

    给定此函数:

        z = b + c + d
        y = x * a - z - x * a * 0.015
        return y
    

    其与:

        return x * a - (b + c + d) - x * a * 0.015
    

    查找的值 x 依据 a, b, c, d 产生 return 0

            0 = x * a - (b + c + d) - x * a * 0.015
    b + c + d = x * a - x * a * 0.015
    b + c + d = x * a * (1 - 0.015)
    b + c + d = x * a * 0.985
            x = (b + c + d) / (a * 0.985)
    

    将其插入 minimize 功能:

    >>> def minimize(a, b, c, d):
    ...     return (b + c + d) / (a * 0.985)
    ...
    

    并用您的 calc 测试用例:

    >>> A = 100
    >>> B = 90
    >>> C = 5
    >>> D = 1
    >>>
    >>> print(calc(minimize(A, B, C, D), A, B, C, D))
    7.771561172376096e-15
    

    请注意,浮点并不是完全精确的,而且 calc 涉及到浮点运算,所以精确地得到零可能并不总是可能的。如果你想要精确的十进制数学,请查看Python的 decimal 单元