Matlab黄金搜索法功率输出优化代码数组索引报错问题咨询
问题诊断与解答
报错根本原因
- 你当前代码中的
power_output是通过MF_t.*difference.*e直接计算得到的数值数组,而非可以接收输入参数的自定义函数 - 代码中
f2 = -power_output(x2)、f3 = -power_output(x3)的写法被Matlab判定为对power_output数组做索引取值,但x2、x3都是0.2~1.4区间内的浮点数,不符合数组索引必须为正整数/逻辑值的要求,这才是报错的核心原因,和数组本身是否有负值无关。
取绝对值对优化结果的影响
要结合你的优化目标判断:
- 如果你的优化目标本身就是最大化功率输出的绝对值,对数组取绝对值再做后续优化是合理的,不会影响结果正确性
- 如果你的优化目标是最大化原始功率输出(允许负值存在,负值代表反向功率等物理意义),强行取绝对值会完全改变目标函数的分布,最终得到的最优解和你原本的优化需求会完全不符,结果是错误的。
代码修复方案
你首先要把功率输出的计算逻辑封装成输入为优化变量的函数,假设你的优化变量为x,参考写法如下:
% 单独封装的功率计算函数,和主脚本放在同一路径下 function p = calc_power(x) % 替换为你实际的物理计算逻辑,确保MF_t、difference、e都和输入x关联 MF_t = ... difference = ... e = ... p = MF_t.*difference.*e; end
主脚本修改参考:
% POWER OUTPUT OPTIMIZATION USING - GOLDEN SEARCH METHOD x_lower = 0.2; x_upper = 1.4; h = (x_upper - x_lower); r = (sqrt(5) - 1)*0.5; % 修正黄金分割内点计算逻辑,原来的(1+r)*h会得到区间外的无效点 x2 = x_lower + r*h; x3 = x_upper - r*h; tol = 0.05; count = 1; % 修正循环终止条件,原来的h>-tol会导致循环异常运行 while h > tol f2 = -calc_power(x2); f3 = -calc_power(x3); if f3 < f2 x_lower = x2; h = (x_upper - x_lower); x2 = x3; x3 = x_upper - r*h; elseif f2 < f3 x_upper = x3; h = (x_upper - x_lower); x3 = x2; x2 = x_lower + r*h; else x_lower = x2; x_upper = x3; h = (x_upper - x_lower); x2 = x_lower + r*h; x3 = x_upper - r*h; end count = count + 1; if count > 100 break end end answer = (x_upper + x_lower)/2 % 修正未定义变量fanswer的问题 value = calc_power(answer)
内容的提问来源于stack exchange,提问作者Jov
相关产品推荐
相关产品推荐

