使用SciPy Minimize报错:缺少必选参数‘labour’的问题求助
问题原因与解决思路
问题根源
SciPy的optimize.minimize要求目标函数接收单个一维数组参数,数组内包含所有优化变量。你定义的current_optimization_f是接收两个独立的位置参数next_capital和labour,但minimize会把初始猜测[2,0.2]作为一个整体数组传入,导致函数只拿到第一个参数(整个数组),自然提示缺少第二个参数labour。
手动调用current_optimization_f(2, 0.3)正常,是因为你手动传入了两个独立参数,和minimize的调用逻辑完全不同。
解决方案
把目标函数改成接收单个数组参数,内部拆分成所需变量,两种简洁写法:
写法1:索引拆分数组
current_optimization_f = lambda x: -optimization_f(3, x[0], x[1], initial_value)
x是minimize传入的数组,x[0]对应next_capital,x[1]对应labour。
写法2:参数解包(更通用)
利用Python解包语法,适配任意数量的优化变量:
current_optimization_f = lambda x: -optimization_f(3, *x, initial_value)
修改后完整可运行代码
import numpy as np from scipy import optimize alpha = 0.4 gamma = 0.4 delta = 0.05 beta = 0.95 production_f = lambda capital, labour : (capital** alpha) * (labour ** (1-alpha)) utility_f_uni = lambda consumption, labour : np.log(consumption) + gamma * np.log(1-labour) if (consumption > 0 and labour > 0 and labour < 1) else -5000 law_of_motion_f = lambda current_capital, next_capital, labour : production_f(current_capital, labour) - next_capital + (1-delta) * current_capital utility_f_multi = lambda current_capital, next_capital, labour : utility_f_uni(law_of_motion_f(current_capital, next_capital, labour), labour) optimization_f = lambda current_capital, next_capital, labour, value_f: utility_f_multi(current_capital, next_capital, labour) + beta * value_f(next_capital) max_capital = lambda capital : production_f(capital, 1) + (1 - delta) * capital initial_value = lambda x : 0 # 修改后的目标函数 current_optimization_f = lambda x: -optimization_f(3, *x, initial_value) # 调用minimize optimized_problem = optimize.minimize(current_optimization_f, [2,0.2]) print(optimized_problem)
额外提示
如果需要约束优化变量的取值范围(比如labour必须在(0,1)之间,next_capital非负),可以传入bounds参数避免函数触发定义域外的异常:
bounds = [(0, None), (1e-8, 1-1e-8)] # 给边界加微小偏移,避免log(0)或log(1)报错 optimized_problem = optimize.minimize(current_optimization_f, [2,0.2], bounds=bounds)
内容的提问来源于stack exchange,提问作者JPR
相关产品推荐
相关产品推荐

