Python中含复数函数的最小值求解优化问题
复数向量的函数最小值优化问题
问题需求
寻找使目标函数取最小值的复数向量z(可表示为直角坐标a+bj或极坐标「幅值+相位」)。目标函数由z及其他极坐标转直角坐标的复数组成,输出为标量,理论上存在唯一最小值向量。
初始代码的错误分析
错误代码
from math import radians from cmath import rect import numpy as np import scipy.optimize as opt # input variables, to be obtained via GUI w1 = 0.5 w2 = 0.5 a1m = 53 a1p = 280 a2m = 46 a2p = 245 s11m = 1.8 s11p = 338 s21m = 1.1 s21p = 332 cwm_max = 500 f = lambda z: (w1*abs(rect(a1m,radians(a1p)) + complex(cwx,cwy) / rect(s11m,radians(s11p))) + w2*abs(rect(a2m,radians(a2p)) + complex(cwx,cwy) / rect(s21m,radians(s21p)))) # create a grid of potential vectors wrapping from 0 to 360 degress with max amplitude = cwm_max: cwx, cwy = np.meshgrid(np.linspace(-cwm_max,cwm_max,200),np.linspace(-cwm_max,cwm_max,200)) # opt.minimze requires a guess argument guess = np.array([0, 200]) sol = opt.minimize(f, guess) print(sol)
报错原因
- 函数参数逻辑错误:
scipy.optimize.minimize要求目标函数接收单个参数向量(每次迭代传入一个点的[x,y]),但代码里的lambda函数直接使用全局的cwx、cwy数组,完全忽略了minimize传递的参数z。 - 复数转换类型错误:
complex(cwx,cwy)无法处理数组,complex()仅支持标量输入,因此抛出TypeError: only length-1 arrays can be converted to Python scalars。
正确的优化实现
不需要专门的复数优化函数——复数优化本质是二维实数优化,将复数的实部和虚部作为两个独立的实数变量即可。以下是修正后的代码:
from math import radians, degrees from cmath import rect, polar import numpy as np import scipy.optimize as opt # 预计算固定复数(提前转换,避免重复计算) w1, w2 = 0.5, 0.5 A1 = rect(53, radians(280)) A2 = rect(46, radians(245)) S11 = rect(1.8, radians(338)) S21 = rect(1.1, radians(332)) cwm_max = 500 # 目标函数:接收参数z = [实部, 虚部],返回标量值 def objective(z): cw = complex(z[0], z[1]) term1 = abs(A1 + cw / S11) term2 = abs(A2 + cw / S21) return w1 * term1 + w2 * term2 # 初始猜测值 guess = np.array([0, 200]) # 变量边界:实部和虚部都限制在[-500, 500] bounds = [(-cwm_max, cwm_max), (-cwm_max, cwm_max)] # 使用L-BFGS-B算法(支持边界约束,适合平滑函数优化) sol = opt.minimize(objective, guess, bounds=bounds, method='L-BFGS-B') # 输出结果 print("优化结果(直角坐标):x={:.2f}, y={:.2f}".format(sol.x[0], sol.x[1])) cw_opt = complex(sol.x[0], sol.x[1]) mag, phase_rad = polar(cw_opt) phase_deg = degrees(phase_rad) if phase_deg < 0: phase_deg += 360 print("优化结果(极坐标):幅值={:.2f}, 相位={:.2f}°".format(mag, phase_deg))
关键改进点
- 目标函数接收
minimize传递的参数向量,每次迭代处理单个点的实部和虚部,转换成标量复数。 - 提前计算所有固定的复数,减少重复计算,提升效率。
- 添加边界约束,符合问题中幅值不超过500的限制。
- 使用
L-BFGS-B算法,适合带边界约束的平滑函数优化,迭代次数少、效率远高于暴力搜索。
暴力解法说明
你最终使用的嵌套循环暴力搜索虽然能得到结果,但效率极低(当dim=1200时,需要执行144万次计算),且精度受网格步长限制。优化算法仅需几十到几百次迭代,就能找到更精确的最小值,运行速度提升几个数量级。
内容的提问来源于stack exchange,提问作者Inabsentia888
相关产品推荐
相关产品推荐

