如何使用scipy.optimize fsolve标志

时间:2016-10-30 22:16:53

标签: python numpy scipy

这是代码的简化版本。当没有标志运行时,我得到结果。 但是,当我使用标志时,它会抛出错误。我需要通过fsolve运行此代码。代码已经简化。

错误:具有多个元素的数组的真值是不明确的。使用a.any()或a.all()

import numpy as np
from scipy.optimize import fsolve

price = np.array([39, 34, 29, 25, 21])
S     = np.repeat(300, len(price)) 
flag  = np.array([1, 1, 0, 1, 1])

def Val(S, flag = 0):
    p = 4 
    if   flag == 0: p = S * flag
    elif flag == 1: p = S * flag
    return p 

val = lambda x: Val(S, flag) - price
print fsolve(val, np.repeat(35, len(S)))

2 个答案:

答案 0 :(得分:1)

flagVal的默认值是标量,但您在上面声明的flag变量是一个数组。当flag是标量时,flag == 0也会是标量(TrueFalse),您的ifelif语句将会有道理。

但是,如果flag是一个数组,flag == 0的输出将是一个布尔数组,其形状与flag相同。在您的情况下,它将是np.array([False, False, True, False, False])。在数组的情况下,if flag == 0是不明确的,因为数组中可能有多个元素可以是true或false。如果(如您的示例中)数组中的某些元素为真且有些元素为假,那么我们应该执行if分支还是elif分支?

在你的情况下,它甚至不重要,因为你在两种情况下都执行完全相同的计算。

答案 1 :(得分:0)

这解决了这个问题:

    import numpy as np
    from scipy.optimize import fsolve

    price = np.array([39, 34, 29, 25, 21])
    S     = np.repeat(300, len(price)) 
    flag  = np.array([1, 1, 0, 1, 1])

    def Val(S, flag = 0):
        return np.where(flag, S + price, S - price )

    val = lambda x: Val(S, flag) - price
    print fsolve(val, np.repeat(35, len(S)))