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

使用Scipy最小化定积分常数时遇参数缺失错误求助

问题解决:Scipy优化定积分时的参数传递错误

错误原因分析

  1. 参数未传递:调用minimize时,没有将cv和xm这两个常量参数传递给目标函数minimization_function,导致函数报错缺少必填参数。
  2. 积分函数参数不匹配:quad的args参数传递错误,integrand需要cv和c两个额外参数,但原代码只传了c。
  3. 优化目标类型错误:quad返回的是包含积分值和误差的元组,但minimize要求目标函数返回标量值,直接返回元组会导致后续计算失败。

修正后的完整代码

import numpy as np
from scipy.integrate import quad
from scipy.optimize import minimize


def g_x(x, cv):
    cv2 = np.square(cv)
    return (x + 1 - np.sqrt(np.square(x) + 2 * cv2 * x + 1)) / (1 - cv2)

def g_approx(x, c):
    return (c * x) / (1 + c * x)

def integrand(x, cv, c):
    return g_x(x, cv) - g_approx(x, c)

def minimization_function(c, cv, xm):
    # 提取积分值,忽略误差项;args匹配integrand的参数顺序
    integral_value, _ = quad(integrand, 0, xm, args=(cv, c))
    # 返回积分值的平方,避免正负抵消,最小化误差的累积量级
    return integral_value ** 2

# 初始化参数
c_0 = 1
cv = 0.6
xm = 15

# 调用minimize,通过args传入常量参数cv和xm
res = minimize(minimization_function, c_0, args=(cv, xm), method='CG', tol=1.e-2, options={'gtol': 0.01, 'maxiter': 5})

# 打印优化结果
print(res)

关键修改点说明

  • minimize的参数传递:添加args=(cv, xm),将常量参数传递给目标函数,确保minimization_function能获取到cv和xm。
  • quad的参数修正:将args=c改为args=(cv, c),与integrand的参数列表(x, cv, c)匹配,保证积分计算时参数正确传递。
  • 优化目标调整:从quad的返回值中提取积分值并取平方,既满足minimize对标量输出的要求,又能避免误差正负抵消导致优化失效(对应L2范数最小化,更符合拟合误差的优化逻辑)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 20:15:37