【问题标题】:ValueError: inhomogeneous shape for scipy.optimize.minimize with matrix in functionValueError:函数中带有矩阵的 scipy.optimize.minimize 的形状不均匀
【发布时间】:2023-01-26 02:06:49
【问题描述】:

我正在尝试使用 pythons scipy.optimize.minimize 在函数变为 0 的函数中查找 x 的值。但是,尽管函数的最终结果是单个值,但函数确实包含矩阵运算,它给我一个错误:

  File "...\Anaconda3\lib\site-packages\spyder_kernels\py3compat.py", line 356, in compat_exec
    exec(code, globals, locals)

  File "...\test.py", line 41, in <module>
    result = minimize(func, x0 = 15, bounds = [ (0 , 10000 ) ])

  File "...\Anaconda3\lib\site-packages\scipy\optimize\_minimize.py", line 699, in minimize
    res = _minimize_lbfgsb(fun, x0, args, jac, bounds,

  File "...\Anaconda3\lib\site-packages\scipy\optimize\_lbfgsb_py.py", line 306, in _minimize_lbfgsb
    sf = _prepare_scalar_function(fun, x0, jac=jac, args=args, epsilon=eps,

  File "...\Anaconda3\lib\site-packages\scipy\optimize\_optimize.py", line 263, in _prepare_scalar_function
    sf = ScalarFunction(fun, x0, args, grad, hess,

  File "...\Anaconda3\lib\site-packages\scipy\optimize\_differentiable_functions.py", line 158, in __init__
    self._update_fun()

  File "...\Anaconda3\lib\site-packages\scipy\optimize\_differentiable_functions.py", line 251, in _update_fun
    self._update_fun_impl()

  File "...\Anaconda3\lib\site-packages\scipy\optimize\_differentiable_functions.py", line 155, in update_fun
    self.f = fun_wrapped(self.x)

  File "...\Anaconda3\lib\site-packages\scipy\optimize\_differentiable_functions.py", line 137, in fun_wrapped
    fx = fun(np.copy(x), *args)

  File "...\test.py", line 40, in <lambda>
    func = lambda x: example(x)

  File "...\test.py", line 18, in example
    A = np.matrix([[0, 0, 0, -1, 1, -1],

  File "...\Anaconda3\lib\site-packages\numpy\matrixlib\defmatrix.py", line 145, in __new__
    arr = N.array(data, dtype=dtype, copy=copy)

ValueError: setting an array element with a sequence. The requested array has an inhomogeneous shape after 1 dimensions. The detected shape was (6,) + inhomogeneous part.

下面我放了一个示例函数,它给出了上述错误。有没有办法最小化这个功能?

(请注意,这是一个示例函数,我不知道这个函数是否真的有解决方案。我的主要问题是关于我得到的错误是否有解决方案)。

我正在使用 python 版本 3.10.8。

import numpy as np
from scipy.optimize import minimize
from scipy.linalg import solve

def example(x: float) -> float:
    a = 4
    b = 4*x
    c = 18*np.sin(x)
    d = 14*np.sqrt(1/x)

    A = np.matrix([[0, 0, 0, -1, 1, -1],
                   [0 - 1, 4, 2*x, 0, 0],
                   [1, 3*x-4, 4, 18, 2, 0],
                   [0, 0, 1, 0, 0, 0],
                   [3*x, 2*a, b, d, 0, 0],
                   [0, 0, d, d-c, 0, 0]
                   ])

    b = np.matrix([[0],
                   [0],
                   [b-c],
                   [c/d],
                   [4*a],
                   [b*a-c]
                   ])

    C1, C2, C3, C4, C5, C6 = np.squeeze(solve(A, b))

    val = C1 * np.sin(a * 2) + C2 * c**2 + 4*C3*x**2 + d*C4 + C5*x + C6

    return val

func = lambda x: example(x)
result = minimize(func, x0 = 15, bounds = [ (0 , 10000 ) ])

起初我尝试使用 sympy 最小化函数。但是,这需要很长时间,因此不是一种选择。从理论上讲,我可以(可能)通过手动求解矩阵来解决这个问题,分别写出每个函数。但是,我宁愿去那里作为最后的手段,它使代码变得非常不可读,并且使所有内容不再与我使用的引用相似。

【问题讨论】:

  • 请提供完整的错误信息!
  • 我编辑了完整的错误
  • 你有没有测试example来确保它是一个有效的功能?如果您花时间阅读完整堆栈,则会在尝试创建 A 时发生错误。尝试example(15),这就是minimize 将尝试使用您的函数的方式。
  • 问题是 x 实际上没有定义,lambda 只是包装了 example 函数,它仍然需要参数 x(未定义)。所以这会失败……它恰好在 minimize 函数内部失败,所以不太明显。

标签: python scipy valueerror


【解决方案1】:

scipy.optimize.minimize 没有将浮点参数传递给函数而是一维数组,这会导致不正确的矩阵(例如[[0, 0, array(30), 0, 0]])。铸造价值解决了这个问题:

def example(x_in) -> float:
  x = float(x_in)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 2015-03-07
    • 1970-01-01
    相关资源
    最近更新 更多