我有一个处理浮点数列表的函数,并返回浮点数列表 - 如何找到返回0列表的参数?

时间:2018-05-17 21:02:56

标签: python numpy scipy

这可能涉及微积分,但我不记得如何做微积分。

我知道python,但我不知道如何在python中做数学。

这就是我在这里的原因。

我有一个类似这样的功能(编辑:更具代表性的逻辑):

other_lst  = [1.,2.,3.,4.,5.] # A list of 5 floats from elsewhere
target_lst = [10,20,30,40,50] # A list of 5 ints from elsewhere

def get_result(   a_lst, an_other_lst, a_target_lst ):
    zipped = zip( a_lst, an_other_lst )    # no global(s), a pure call-signature

    _l = [ (x*y) / sum( [ x*y for x,y in zipped ] ) for x,y in zipped ]

    return [ i-j for i,j in zip( _l, a_target_lst ) ]

我想找一些非平凡的lst,这样就可以了 get_result( lst, other_lst, target_lst ) == [0,0,0,0,0]

编辑:甚至lst的所有值都是get_result(lst) == [0,0,0,0,0]。这不是必要的,但如果可能的话,那就太好了。

我该怎么做?

我原来的方法只是迭代一些值来逼近答案,但它并没有完全给我我想要的东西。

忽略函数逻辑中的算术 - 它们只是其他逻辑的占位符。

2 个答案:

答案 0 :(得分:1)

  

我该怎么做?

使用 scipy ,为什么不将 get_result( aLIST ) 包装成 penalty_fun() ,然后可以在scipy.optimize.fmin*解算器套件内操作吗?

def penalty_fun( x, other_param, yet_another_param ):
    aResultLIST = get_result( x.tolist(), other_param, yet_another_param )
    return sum( [ item**2 for item in aResultLIST )

求解器的最小化搜索使用带有一些初始值或随机值的向量 x[:] ~ ( a, b, c, d, e )

fmin_l_bfgs_b( func    = penalty_fun,
               x0      = x,
               args    = [ other_lst, target_lst ],
               iprint  = 5,
               pgtol   = 1E-8,    
               factr   = 1E+9,    
               maxiter = 1E+8,    
               maxfun  = 1E+8     
               )

鉴于 get_result() 内部的技巧并不太疯狂,这种天真的力量可能会解决,可能会在x[:]中有很多初始起点,以满足您的愿望准备使用解决方案。

逻辑,在编辑之前勾勒出来,

def get_result(lst):
    # lst is always a list of 5 floats
    a, b, c, d, e = lst

    # logic goes here
    a = a+b
    b = b-c
    c = min(a,b,c)
    d = a*e
    e = d+b

    return [a, b, c, d, e]

产生无限多的解决方案:

a_OUT = 0 =      a_IN + b_IN                     ->     lin b_IN == -a_IN
b_OUT = 0 =             b_IN - c_IN              ->     lin b_IN ==         c_IN
c_OUT = 0 = min( a_IN,  b_IN,  c_IN )            :: non-lin                                       == min( a_IN, -a_IN, -a_IN ) == abs( a_IN ) == 0
d_OUT = 0 =      a_IN *                    e_IN  :: non-lin      OR( a_IN == 0         e_IN == 0 )
e_OUT = 0 =             b_IN +       d_IN        ::     lin b_IN ==             -d_IN

输入:
  a == 0, b == 0, c == 0, d == 0, e == < -INF, +INF >

答案 1 :(得分:0)

这不涉及微积分本身,它通常涉及代数。但是,由于你否认我们能够检查你正在使用的任何方程式,所以我建议你使用Newton's Root-finding algorithm一次一个地将一个零作为开始。

编辑:好的,它涉及差分微积分,但这并不是很难,并且对于你想要在a,b,c,d,e中的任何静态函数集都是固定的。