You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

报错原因

  1. 函数参数逻辑错误:scipy.optimize.minimize要求目标函数接收单个参数向量(每次迭代传入一个点的[x,y]),但代码里的lambda函数直接使用全局的cwx、cwy数组,完全忽略了minimize传递的参数z。
  2. 复数转换类型错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 05:45:00