Matlab中如何对以向量为输入的多元函数实现优化求解
完全可以通过将多组优化变量拼接为单个长向量作为输入,配合矢量化目标函数即可实现单输入求解,不需要借助arrayfun循环处理,以下是具体实现方案:
方案1:长向量拼接法(通用适配所有优化器)
将所有待求解的变量拼接为一维长向量作为优化输入,目标函数内做对应维度拆分计算即可:
clear; A = [1;2]; n = length(A); % 待求解的独立问题个数 % 目标函数输入为长度2*n的长向量: % 前n个元素对应每个独立问题的Vs变量,后n个元素对应每个独立问题的Vx变量 obj = @(x) sum( -x(1:n).^2 - A .* x(n+1:end).^2 ); % 初始化所有变量的初始值设为0 x0 = zeros(2*n, 1); % 直接调用优化器求解 x_opt = fminsearch(obj, x0); % 拆分得到所有最优解 Vs_opt = x_opt(1:n); Vx_opt = x_opt(n+1:end);
注意:你给出的原目标函数是负平方项求和,若要做最小值求解是无界的,没有有限最优解;如果是求解最大值,将目标函数取反后再求最小值即可,对应原问题的最大值。
如果你的各个A对应的优化问题独立没有变量耦合,长向量拼接法的求解结果和你之前用arrayfun循环得到的结果完全一致,计算效率更高。
方案2:二次规划专属优化(更高效)
你的目标属于二次型结构,可以调用quadprog求解,比fminsearch这类启发式求解器速度更快、精度更高:
clear; A = [1;2]; n = length(A); H = diag([ones(n,1); A]); % 二次型系数矩阵 f = zeros(2*n, 1); x_opt = quadprog(H, f); Vs_opt = x_opt(1:n); Vx_opt = x_opt(n+1:end);
内容的提问来源于stack exchange,提问作者Chang
相关产品推荐
相关产品推荐

