问题描述
我具有以下功能:
def fun_root(x,*pars):
a,b,fsolve = pars
exp1 = x**a - b*x + 2
exp2 = np.exp(a*x) + x**b
if fsolve == 1:
return exp1-exp2
elif fsolve == 0:
return exp2
然后,我使用以下代码查找以fsolve
为根的exp2的值。
tuple1 = (2,3)
tuple2 = tuple1 + (1,)
tuple3 = tuple1 + (0,)
result_x = scipy.optimize.fsolve(fun_root,np.array((1)),tuple2)
print(result_x)
result_exp2 = fun_root(result_x,tuple3)
print(result_exp2)
我可以得到一个根,即0.189。但是,我收到有关最后一行之前的行的错误消息:
a,fsolve = pars
ValueError: not enough values to unpack (expected 3,got 1)
上面的代码有什么问题?
Ps。我在函数中使用了可选的返回值,因为在我的实际情况下,该函数很复杂并且无法获得exp2的显式表达式。
解决方法
在这一行
result_x = scipy.optimize.fsolve(fun_root,np.array((1)),tuple2)
您正在传递tuple2
作为fsolve
的args
参数。函数fsolve
会在调用fun_root
时为您打开该元组。
在这一行
result_exp2 = fun_root(result_x,tuple3)
您正在将tuple3
(恰好是一个元组的单个python对象)传递给fun_root
。在这种情况下,args
将是((2,3,0),)
。也就是说,它将是长度为1的元组,其中包含您传入的元组。基于导致错误的行,很明显,您要执行的操作是在{{ 1}},因此该行应为
tuple3
实现相同结果的一种不太优雅的方法是
fun_root