这可能涉及微积分,但我不记得如何做微积分。
我知道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]
。这不是必要的,但如果可能的话,那就太好了。
我该怎么做?
我原来的方法只是迭代一些值来逼近答案,但它并没有完全给我我想要的东西。
忽略函数逻辑中的算术 - 它们只是其他逻辑的占位符。
答案 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中的任何静态函数集都是固定的。