You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用scipy.fsolve求解含多输入单变量的函数根问题

问题分析与解决方案

核心问题

scipy.fsolve要求目标函数的第一个参数必须是待求解的变量,你当前的foo函数把待求变量y放在了参数列表的最后,导致fsolve无法正确识别待优化变量,这是语法错误的根源。

修正方案

方案1:调整函数参数顺序

直接修改foo,将y作为第一个参数,其余已知参数后置:

import numpy as np
from scipy.optimize import fsolve

def foo(y, T_, t_, x1_, x2_):  # 将y移到参数列表首位
    P = np.zeros(len(t_), dtype=object)
    s = np.zeros(len(t_))
    # 注意:确保dt是已定义的全局变量或额外传入的参数
    for i in range(len(t_)):
        P[i] = model1.Pr(T_, t_[i], x1_[0][i], x2_[0][i])
        agg_disc_fact = sum(P[i]) * y * dt
        stub = 1
        final_term = P[i][-1]
        s[i] = agg_disc_fact - stub + final_term
    return s[0]

# 调用fsolve,args传入其余已知参数
result = fsolve(func=foo, x0=0, args=(T, ts, x1, x2))

方案2:用lambda包装原函数(无需修改foo)

如果不想改动原foo的参数顺序,可以用lambda函数重新封装,适配fsolve的参数要求:

result = fsolve(func=lambda y: foo(T, ts, x1, x2, y), x0=0)

替代工具推荐

如果偏好更直观、信息更丰富的API,可以使用scipy.optimize.root,它返回的结果包含收敛状态等细节:

from scipy.optimize import root

# 使用方案1调整后的foo函数,或lambda包装的版本
sol = root(foo, x0=0, args=(T, ts, x1, x2))
# 查看求解结果
if sol.success:
    print("求解成功,根为:", sol.x[0])
else:
    print("求解失败,原因:", sol.message)

代码优化建议

当前代码用循环处理t_的每个元素,若model1.Pr支持向量化输入,可改成向量化操作提升效率:

def foo(y, T_, t_, x1_, x2_):
    # 假设model1.Pr可直接接收数组形式的t、x1、x2参数
    P = model1.Pr(T_, t_, x1_[0], x2_[0])
    agg_disc_fact = np.sum(P, axis=1) * y * dt
    stub = 1
    final_term = P[:, -1]
    s = agg_disc_fact - stub + final_term
    return s[0]

内容的提问来源于stack exchange,提问作者ak1504

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 02:35:24