【问题标题】:How to pass multiple constants and variables to Scipy Optimize?如何将多个常量和变量传递给 Scipy Optimize?
【发布时间】:2020-01-19 14:04:44
【问题描述】:

我正在尝试将模型数据(从eR 计算)拟合到我的实验数据e_exp。我不太清楚如何将常量和变量传递给func

import numpy as np
import math
from scipy.optimize import curve_fit, least_squares, minimize

f_exp     = np.array([1, 1.6, 2.7, 4.4, 7.3, 12, 20, 32, 56, 88, 144, 250000])
e_exp     = np.array([7.15, 7.30, 7.20, 7.25, 7.26, 7.28, 7.32, 7.25, 7.35, 7.34, 7.37, 13.55])

ezero     = np.min(e_exp)
einf      = np.max(e_exp)

ig_fc     = 500
ig_alpha  = 0.35

def CCER(einf, ezero, f_exp, fc, alpha):
    x  = [np.log(_ / ig_fc) for _ in f_exp]
    eR = [ezero + 1/2 * (einf - ezero) * (1 + np.sinh((1 - ig_alpha) * _) / (np.cosh((1 - ig_alpha) * _) + np.sin(1/2 * ig_alpha * math.pi))) for _ in x]
    return eR

def func(z):
    return np.sum((CCER(z[0], z[1], z[2], z[3], z[4], z[5]) - e_exp) ** 2)

res = minimize(func, (ig_fc, ig_alpha), method='SLSQP')

einfezerof_exp 都是常量加上我需要优化的变量是 ig_fcig_alpha,其中ig 代表初始猜测。

我怎样才能做到这一点?

我也不确定scipy 的哪些优化算法最适合我的问题(curve_fitleast_squaresminimize)。

【问题讨论】:

    标签: python scipy-optimize


    【解决方案1】:

    我相信您想要的是以下内容:

    def CCER(x, fc, alpha):
        y = np.log(x/fc)
        eR = ezero + 1/2 * (einf - ezero) * (1 + np.sinh((1 - alpha) * y) / (np.cosh((1 - alpha) * y) + np.sin(1/2 * alpha * math.pi)))
        return eR
    
    res = curve_fit(CCER, f_exp, e_exp, p0=(ig_fc, ig_alpha))
    

    您将第一个值作为参数传递给CCER,然后将其余两个值(fcalpha)视为可优化参数。所有固定参数都将从外部范围读取 - 无需将它们显式传递给此处的函数。

    最后,在curve_fit 中,您只需要传递一组输入 (f_exp) 和相应的输出 (e_exp),以及 - 可能 - 一组初始猜测 p0

    【讨论】:

    • 感谢您的回答,@Miłosz Wieczór。因为einfezero 没有被定义为输入,所以我很难理解到底发生了什么。另外,res[0][0]res[0][1] 各自的 fcalpha 是否需要优化?
    • 当在函数的本地范围内找不到时,Python 会尝试在外部范围内搜索einfezero,即本例中的全局范围。这就是为什么您不必将它们作为参数传递的原因。关于输出,通过查看文档:docs.scipy.org/doc/scipy/reference/generated/… 你会看到第一个数组(res[0])确实是优化参数列表,第二个数组(res[1])报告了不确定性。
    • 感谢您的解释,@Miłosz Wieczór!现在对我来说很有意义。
    • 我有一个后续问题要问你,@Miłosz Wieczór。例如,如果e_exp 不是一个向量,而是一个形状为(2, 12) 的二维数组,该怎么办?这将产生einfezero 不再是单个值,而是具有(2,1) 的形状。如果我尝试运行它,我会得到error: Result from function call is not a proper array of floats. 这与 Python 如何读取全局变量有关。有没有办法让它与多个 e_exp 一起工作,以便对它们中的每一个执行计算?谢谢你,我很抱歉在评论部分这样伏击你。
    猜你喜欢
    • 2022-11-22
    • 2020-12-20
    • 2020-10-03
    • 2012-07-24
    • 2023-03-15
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多