如何使用Fsolve在python中找到具有多次返回的函数的根?

问题描述

我具有以下功能

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作为fsolveargs参数。函数fsolve会在调用fun_root时为您打开该元组。

在这一行

result_exp2 = fun_root(result_x,tuple3)

您正在将tuple3(恰好是一个元组的单个python对象)传递给fun_root。在这种情况下,args将是((2,3,0),)。也就是说,它将是长度为1的元组,其中包含您传入的元组。基于导致错误的行,很明显,您要执行的操作是在{{ 1}},因此该行应为

tuple3

实现相同结果的一种不太优雅的方法是

fun_root