【发布时间】:2018-12-15 02:26:28
【问题描述】:
我正在尝试使用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 指定所有可能的方法(根据需要提供雅可比和黑森),但它们都没有达到正确的结果。多数导致ComplexWarning: Casting complex values to real discards the imaginary part,说明无法正确处理复数。
这可能使用scipy.optimize吗?
如果是这样,如果有人能告诉我我做错了什么,我将非常感激。
如果没有,您是否对允许这样做的替代优化工具(用于 Python)有建议?
【问题讨论】:
标签: python scipy mathematical-optimization