当前位置: 首页 > 知识库问答 >
问题:

Python的sipi-fsolc不工作。为什么fsolc返回'无'?

朱阳曜
2023-03-14

首先,对我糟糕的英语水平感到抱歉。

我做的是BDT模型,但这里有些问题。

此函数是第4列的更改代码

def f(x):
    a=1 / (1 + f_tree.loc[1, 4] + x)
    b=1 / (1 + f_tree.loc[2, 4] + x)
    c=1 / (1 + f_tree.loc[3, 4] + x)
    d=1 / (1 + f_tree.loc[4, 4] + x)
    e=0.5*(a+b)/ (1 + f_tree.loc[1, 3])
    f=0.5*(b+c)/ (1 + f_tree.loc[2, 3])    
    g=0.5*(c+d)/ (1 + f_tree.loc[3, 3]) 
    h=0.5*(e+f)/ (1 + f_tree.loc[1, 2])
    i=0.5*(f+g)/ (1 + f_tree.loc[2, 2])  
    return -Market_data['PV'][3] + (0.5 * (h+i) / (1+f_tree.loc[1,1]))
x=fsolve(f,0)
x
f_tree.loc[1,4]+=x
f_tree.loc[2,4]+=x
f_tree.loc[3,4]+=x
f_tree.loc[4,4]+=x
f_tree

前桌

之后的桌子

我尝试转换为循环,但不工作。

这是我的密码

import numpy as np
import pandas as pd
import math as m
from scipy.optimize import fsolve
global cal_temp, loop_temp
cal_temp =[]
loop_temp = []
list_temp =[]
final_list = []

# find x
def f2(x):
    temp_val = 0
    temp_val = (1 / (1 + f_tree.loc[1, 2] + x)) + (1 / (1 + f_tree.loc[2, 2] + x))
    return -pv[1] + (0.5 * (temp_val / (1+f_tree.loc[1,1])))
        
def f(x): 
    for j in range(1, n+1):
        i = 1
        while i <= j:
            f_tree_x.loc[i,j] = 1 / (1 + f_tree.loc[i, j] + x)
            i += 1
    list_temp = [value for value in list(np.array(f_tree_x[set_row].tolist())) if value != 0]   
    final = calculate(list_temp, set_row)
    return -pv[(set_row-1)] + (0.5 * sum(map(float, final)) / (1+f_tree.loc[1,1]))

def calculate(take_list, set_row):
    reset = []
    cal_temp = reset
    for row_no in range(set_row-1):
        cal_temp.append(0.5 * (take_list[row_no] + take_list[row_no+1]) / (1 + f_tree.loc[row_no+1, set_row-1]))
    if set_row == 3:
        return cal_temp
    else:
        set_row -= 1
        loop_temp = cal_temp
        calculate(loop_temp, set_row)

# main
n = int(input('typing year(2~10)'))
sr = [0.050, 0.055, 0.060, 0.070, 0.080, 0.090, 0.100, 0.110, 0.120, 0.130, 0.140]
s_fir = [0.050000, 0.060024, 0.070071, 0.142293, 0.130935, 0.151393, 0.171938, 0.192568, 0.213282, 0.234078]
pv= [0.952381, 0.898452, 0.839619, 0.735030, 0.649931, 0.564474, 0.481658, 0.403883, 0.332885, 0.269744]

V = 0.1
u = m.exp(V)
d = 1/u

f_tree = pd.DataFrame(np.zeros((n,n)), index=range(1,n+1), columns=range(1,n+1), dtype=float)
f_tree_x = pd.DataFrame(np.zeros((n,n)), index=range(1,n+1), columns=range(1,n+1), dtype=float)

for j in range(1, n+1):
    i = 1
    while i <= j:
        f_tree.loc[i,j] = s_fir[0] * (u**(j-i)) * (d**(i-1))
        i += 1
for set_row in range(1, n+1):
    if set_row == 1:
        print(f_tree)
        continue
    if set_row == 2:
        x = fsolve(f2, 0)
        print(x)
        w = 1
        while w <= set_row:
            f_tree.loc[w, set_row] += x
            w += 1
    if set_row >= 3:
        x = fsolve(f, 0)
        print('x')
        print(x)
        # fsolve(f, 0)
        w = 1
        while w <= set_row:
            f_tree.loc[w, set_row] += x
            w += 1

循环n=2,3可以。但是循环n=4有什么问题吗

Traceback (most recent call last):
  File "d:\BDT_model\BDT_3.py", line 102, in <module>
    x = fsolve(f, 0)
  File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\scipy\optimize\minpack.py", line 160, in fsolve
    res = _root_hybr(func, x0, args, jac=fprime, **options)
  File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\scipy\optimize\minpack.py", line 226, in _root_hybr
    shape, dtype = _check_func('fsolve', 'func', func, x0, args, n, (n,))
  File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\scipy\optimize\minpack.py", line 24, in _check_func
    res = atleast_1d(thefunc(*((x0[:numinputs],) + args)))
  File "d:\BDT_model\BDT_3.py", line 33, in f
    return -pv[(set_row-1)] + (0.5 * sum(map(float, final)) / (1+f_tree.loc[1,1]))
TypeError: 'NoneType' object is not iterable

plz帮助

共有1个答案

上官兴昌
2023-03-14

以下是读取错误的方法:关注notiterable。行中的某些内容正在尝试迭代。唯一有意义的部分是sum(map(float,final))。所以我们知道,finalNone

finalcalculate的返回值。查看代码,calculate确实不返回任何内容,而不是预期的iterable。

在某一点上,计算状态

if set_row == 3:
    return cal_temp

但是,相应的else递归调用calculate(loop\u temp,set\u row),并丢弃返回值。您可能希望保留递归返回值并返回它:

return calculate(loop_temp, set_row)

与这些类型的问题一样,错误完全在您的代码中,而不是在您正在使用的经过彻底测试且通常经过深思熟虑的库中。

 类似资料:
  • 问题内容: 为什么要用返回? 我如何获得改组后的值而不是? 问题答案: 更改x列表到位。 就地更改结构的方法通常返回None,而不是修改后的数据结构。 如果要基于现有列表创建新的随机混排列表,并按顺序保留现有列表,则可以使用输入的完整长度: 你还可以将用于排序键: 但这会调用排序(操作),而采样到输入长度仅需要O(N)操作(与所使用的过程相同,即从收缩池中换出随机值)。 演示:

  • 问题内容: 我已经能够验证结果是否为。但是,它不返回列表。为什么? 问题答案: 对列表进行适当排序,即不返回新列表。写吧

  • 问题内容: 我正在尝试使用一个字段来获取手动输入,然后使用该数据。 我发现的所有资料都声称我应该使用该函数,但是我还没有找到一个简单的可运行的迷你示例,因此无法使用它。 我希望有人可以给我打电话,告诉我我做错了什么。这是一个迷你文件: 这给了我一个我可以输入的字段,但是一旦输入数据我就什么也不能做。 我怀疑我的代码不起作用,因为最初它是空的。但是,一旦输入了输入数据,我该如何访问呢? 问题答案:

  • 问题内容: 我正在通过LPTHW,遇到了一些我听不懂的东西。您何时会需要布尔值或返回布尔值以外的其他值?LPTHW文本指出所有语言(如python)都具有此行为。他是说解释型语言还是编译型语言,还是鸭子类型的还是静态类型的语言? 我运行了以下代码: 请帮助我了解这里发生了什么。 根据文档:http : //docs.python.org/2/library/stdtypes.html 除非另有说明

  • 问题内容: 我正在通过以下方式从Java代码启动Windows进程(用C ++编写,但没有源代码): 我的问题是,waitFor()方法永远不会结束。因此,我尝试在一个简单的shell中启动该过程,并以shell中的许多打印正确结束(我猜是标准输出)。 因此,即使我现在不需要这些输出,我还是决定创建并启动一个读取标准输出的线程。这解决了问题。 因此,我的问题是以下问题:该解决方案是“启动并等待具有

  • 我在客户端使用vue、vue路由器,在服务器端使用express、morgan(MEVN应用程序) 在客户端我用vue cookie设置cookie 在服务器端,我使用CookieParser 所以,在应用程序。我有这样的代码 并且,在文件中,我有这样一个GET请求的代码 问题是,var loginHash=req.cookies['Login'];总是返回未定义的,即使我有登录cookie 添加