Python中如何为多输出函数的单个输出求解根?
问题:如何分别求解多返回值函数的根?
我正在编写Python代码,目标是针对输入变量x求解函数输出的根。现有代码如下:
def Compound_Correlation_Function(x): # Here comes a long part of the code... Equity_Solve = Tranches.loc[0, 'Par_Spread_bps'] - Market_Data.iloc[0,0] Mezzanine_Solve = Tranches.loc[1, 'Par_Spread_bps'] - Market_Data.iloc[1,0] return Equity_Solve, Mezzanine_Solve Correlation_Value = optimize.root(Compound_Correlation_Function, x0 = 0.3)
该函数返回Equity_Solve和Mezzanine_Solve两个输出值,我希望分别为这两个输出单独求解根。注释掉其中一个返回值时能得到正确结果,但希望实现代码自动化,尝试了以下写法均失败:
Correlation_Value = optimize.root(Compound_Correlation_Function[0], x0 = 0.3) Correlation_Value = optimize.root(Compound_Correlation_Function(x)[0], x0 = 0.3) Correlation_Value = optimize.root(Compound_Correlation_Function()[], x0 = 0.3)
请问能否在optimize.root语句中指定要求解根的输出?
解决方案
optimize.root要求目标函数接收输入参数x后返回单个标量(或一维数组),无法直接指定多返回值函数的某一输出。你可以通过以下几种方式实现需求:
方法1:用Lambda表达式包装函数
直接用lambda提取原函数的指定返回值,传递给optimize.root:
# 求解Equity_Solve的根 equity_root = optimize.root(lambda x: Compound_Correlation_Function(x)[0], x0=0.3) # 求解Mezzanine_Solve的根 mezzanine_root = optimize.root(lambda x: Compound_Correlation_Function(x)[1], x0=0.3)
lambda会接收x参数,调用原函数后返回对应索引的结果,完全符合optimize.root的要求。
方法2:修改原函数增加控制参数
如果原函数内部有大量计算,不想重复执行,可以给函数加一个参数指定返回哪一个结果,再结合optimize.root的args参数传递:
def Compound_Correlation_Function(x, tranche_idx=0): # Here comes a long part of the code... Equity_Solve = Tranches.loc[0, 'Par_Spread_bps'] - Market_Data.iloc[0,0] Mezzanine_Solve = Tranches.loc[1, 'Par_Spread_bps'] - Market_Data.iloc[1,0] return [Equity_Solve, Mezzanine_Solve][tranche_idx] # 求解Equity_Solve的根 equity_root = optimize.root(Compound_Correlation_Function, x0=0.3, args=(0,)) # 求解Mezzanine_Solve的根 mezzanine_root = optimize.root(Compound_Correlation_Function, x0=0.3, args=(1,))
这种方式避免了重复计算原函数内的长代码块,效率更高。
方法3:编写专门的包装函数
如果需要更清晰的代码结构,可以单独写一个包装函数来提取指定结果:
def solve_single_tranche(x, tranche_idx): equity_res, mezzanine_res = Compound_Correlation_Function(x) return equity_res if tranche_idx == 0 else mezzanine_res # 求解Equity_Solve的根 equity_root = optimize.root(lambda x: solve_single_tranche(x, 0), x0=0.3) # 求解Mezzanine_Solve的根 mezzanine_root = optimize.root(lambda x: solve_single_tranche(x, 1), x0=0.3)
内容的提问来源于stack exchange,提问作者Ast_7
相关产品推荐
相关产品推荐

