【发布时间】: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