我正在尝试使用scipy.optimize
来最小化一个复杂(向量)变量的函数。到目前为止,我的结果表明可能不可能实现。为了调查这个问题,我实现了一个简单的例子 - 最小化带有偏移量的复杂向量的2范数:
import numpy as np
from scipy.optimize import fmin
def fun(x):
return np.linalg.norm(x - 1j * np.ones(2), 2)
sol = fmin(fun, x0=np.ones(2) + 0j)
输出结果为:
Optimization terminated successfully.
Current function value: 2.000000
Iterations: 38
Function evaluations: 69
>>> sol
array([-2.10235293e-05, 2.54845649e-05])
显然,解决方案应该是
array([0.+1.j, 0.+1.j])
对于这个结果感到失望,我也尝试了scipy.optimize.minimize
:
from scipy.optimize import minimize
def fun(x):
return np.linalg.norm(x - 1j * np.ones(2), 1)
sol = minimize(fun, x0=np.ones(2) + 0j)
输出结果为:
>>> sol
fun: 2.0
hess_inv: array([[ 9.99997339e-01, -2.66135332e-06],
[-2.66135332e-06, 9.99997339e-01]])
jac: array([0., 0.])
message: 'Optimization terminated successfully.'
nfev: 24
nit: 5
njev: 6
status: 0
success: True
x: array([6.18479071e-09+0.j, 6.18479071e-09+0.j])
情况也不太理想。我已经尝试了所有可能的 minimize
方法(根据需要提供Jacobian和Hessian),但它们都无法获得正确的结果。大部分方法会导致 ComplexWarning: Casting complex values to real discards the imaginary part
,这表明它们不能正确处理复数。
使用 scipy.optimize
是否有可能解决问题呢?
如果有可能,请告诉我我的错误之处,非常感谢。
如果不行,您是否可以提供其他优化工具的建议(用于Python),使其能够处理此类问题?