我已经定义了一个函数。这称为“二等分”,其代码在帖子下方。

我还有一个名为“ v”的数据框,其中包含7列和2行:

D   P   h     O   Q   SD      LT
80  27  0.37 50   2    3      1.51
50  27  0.25 50   2    3      0.03


在二等分函数中,您需要四个参数。 f,a,b和N。
这些定义如下:

b = 5
a = 0.05
N = 1000


现在,“ f”是一个带有未知变量的函数:“ x”。这是一个匿名函数(lambda x)。二等分函数找到'x'的值,其中f等于零。现在,“ f”是一个非常讨厌的派生,是的,我将对其进行清理,但是请不要专注于此,因为函数本身是正确的。因此,“ f”为:

f = lambda x: norm.ppf(1-(v.iloc[i,4]*v.iloc[i,1]*v.iloc[i,2])/(2*v.iloc[i,0]*x))*v.iloc[i,5]*np.sqrt(v.iloc[i,6])*v.iloc[i,1]*v.iloc[i,2]+np.sqrt(2*v.iloc[i,0]*v.iloc[i,3]*v.iloc[i,1]*v.iloc[i,2])-v.iloc[i,0]*x*(((-(norm.ppf(1-(v.iloc[i,4]*v.iloc[i,2]*v.iloc[i,1])/(2*x*v.iloc[i,0]))))*(1-norm.cdf((norm.ppf(1-(v.iloc[i,4]*v.iloc[i,2]*v.iloc[i,1])/(2*x*v.iloc[i,0]))),loc=0,scale=1))+(norm.pdf((norm.ppf(1-(v.iloc[i,4]*v.iloc[i,2]*v.iloc[i,1])/(2*x*v.iloc[i,0]))),loc=0,scale=1)))*v.iloc[i,5]*np.sqrt(v.iloc[i,6])-v.iloc[i,4])/v.iloc[i,4]*-1


目标是将'bisection-function'应用于数据帧中的每一行:从而添加一个新列,该每一列将给出bisection-function的结果,其中该函数使用所有7列。

现在,当我想应用功能'bisection(f,a,b,N)'时,我尝试了以下代码:

  for i in range(0,2,1):
      v['k'] = bisection(f,a,b,N)


这给了我以下结果:

D   P   h     O       Q SD  LT    k
80  27  0.37  50     2  3   1.51 3.814891
50  27  0.25  50     2  3   0.03 3.814891


如您所见,它为“ x”找到正确的值,但仅为第二行找到。第一行的结果是4.50 ..当我将代码更改为:

  for i in range(0,1,1):
      v['k'] = bisection(f,a,b,N)


我得到:

D   P   h     O      Q  SD  LT    k
80  27  0.37  50     2  3   1.51 4.503648
50  27  0.25  50     2  3   0.03 4.503648


所以我想要的结果是:

D   P   h     O      Q  SD  LT    k
80  27  0.37  50     2  3   1.51 4.503648
50  27  0.25  50     2  3   0.03 3.814891


我该如何实现?

我也尝试通过将'f'更改为:

f = lambda x: norm.ppf(1-(v.Q*v.P*v.h)/(2*v.D*x))*v.SD*np.sqrt(v.LT)*v.P*v.h+np.sqrt(2*v.D*v.O*v.P*v.h)-v.D*x*(((-(norm.ppf(1-(v.Q*v.P*v.h)/(2*x*v.D))))*(1-norm.cdf((norm.ppf(1-(v.Q*v.P*v.h)/(2*x*v.D))),loc=0,scale=1))+(norm.pdf((norm.ppf(1-(v.Q*v.P*v.h)/(2*x*v.D))),loc=0,scale=1)))*v.SD*np.sqrt(v.LT)-v.Q)/v.Q*-1


并尝试使用以下代码进行迭代:

 for index, row in df.iterrows():
     v.append(bisection(f,a,b,N))


但是然后我得到了错误:

  ValueError: The truth value of a Series is ambiguous. Use a.empty,
  a.bool(), a.item(), a.any() or a.all().


有人可以帮助我吗?

二等分函数的代码:

def bisection(f,a,b,N):
'''Approximate solution of f(x)=0 on interval [a,b] by the bisection
method.

Parameters
----------
f : function
    The function for which we are trying to approximate a solution f(x)=0.
a,b : numbers
    The interval in which to search for a solution. The function returns
    None if f(a)*f(b) >= 0 since a solution is not guaranteed.
N : (positive) integer
    The number of iterations to implement.

Returns
-------
x_N : number
    The midpoint of the Nth interval computed by the bisection method. The
    initial interval [a_0,b_0] is given by [a,b]. If f(m_n) == 0 for some
    midpoint m_n = (a_n + b_n)/2, then the function returns this solution.
    If all signs of values f(a_n), f(b_n) and f(m_n) are the same at any
    iteration, the bisection method fails and return None.

Examples
--------
>>> f = lambda x: x**2 - x - 1
>>> bisection(f,1,2,25)
1.618033990263939
>>> f = lambda x: (2*x - 1)*(x - 3)
>>> bisection(f,0,1,10)
0.5
'''
if f(a)*f(b) >= 0:
    print("Bisection method fails.")
    return None
a_n = a
b_n = b
for n in range(1,N+1):
    m_n = (a_n + b_n)/2
    f_m_n = f(m_n)
    if f(a_n)*f_m_n < 0:
        a_n = a_n
        b_n = m_n
    elif f(b_n)*f_m_n < 0:
        a_n = m_n
        b_n = b_n
    elif f_m_n == 0:
        print("Found exact solution.")
        return m_n
    else:
        print("Bisection method fails.")
        return None
return (a_n + b_n)/2

最佳答案

您的代码:

    for i in range(0,2,1):
        v['k'] = bisection(f,a,b,N)


只需将新列“ k”的所有值设置为每次迭代中二等分函数计算出的任何值

创建一个系列并将其分配给新行“ k”,也许像这样:

    v['k'] = pd.Series([bisection(f,a,b,N) for i in range(2)], index = v.index)

关于python - 在多行上执行功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55893578/

10-09 08:22