使用Matlab全局优化工具箱与遗传算法最小化黑箱函数报错求助
问题分析与解决
错误原因
你直接将optimvar创建的优化变量对象传入objective_function,此时函数内的c、d并非数值类型(而是Matlab的优化变量对象)。ode45要求初始条件必须是单精度/双精度数值,因此触发superiorfloat函数的类型检查错误。
本质问题是:optimproblem的目标函数不能直接调用普通函数(会立即执行),普通函数也无法处理非数值的优化变量对象;而遗传算法需要目标函数仅在传入数值参数时才计算结果。
解决方案
方案1:直接使用GA的传统调用方式(无需optimvar)
GA本身支持直接传入参数上下界,无需通过optimproblem包装,是更简洁的实现方式:
修改脚本为:
% 定义参数上下界,顺序对应a,b,c,d lb = [0, 0, -5, -5]; ub = [10, 10, 5, 5]; % 设置GA选项 options = optimoptions("ga","PlotFcn","gaplotbestf"); rng default % 调用GA:目标函数接受向量输入,拆分为a,b,c,d传入原函数 [sol,fval] = ga(@(x) objective_function(x(1),x(2),x(3),x(4)), 4, [], [], [], [], lb, ub, [], options); % 提取结果 disp(['最优a: ', num2str(sol(1))]); disp(['最优b: ', num2str(sol(2))]); disp(['最优c: ', num2str(sol(3))]); disp(['最优d: ', num2str(sol(4))]); disp(['最小目标函数值: ', num2str(fval)]);
方案2:使用optimproblem+optimvar(需包装目标函数)
若坚持用优化问题框架,需用fcn2optimexpr将普通目标函数包装为优化表达式,延迟数值计算到solve阶段:
修改脚本为:
% 定义优化变量 a = optimvar("a","LowerBound",0,"UpperBound",10); b = optimvar("b","LowerBound",0,"UpperBound",10); c = optimvar("c","LowerBound",-5,"UpperBound",5); d = optimvar("d","LowerBound",-5,"UpperBound",5); % 用fcn2optimexpr包装目标函数,避免提前执行 obj = fcn2optimexpr(@objective_function, a, b, c, d); prob = optimproblem("Objective", obj); % 设置GA选项 options = optimoptions("ga","PlotFcn","gaplotbestf"); rng default % 求解 [sol,fval] = solve(prob,"Solver","ga","Options",options);
额外修正建议
原目标函数中ode45的时间区间写为[0,10],但前面定义的t = linspace(0,20,20000),时间区间不一致,建议统一为:
[t,y] = ode45(@rh, t, [c;d]); % 直接用定义好的t作为时间区间
内容的提问来源于stack exchange,提问作者azonips
相关产品推荐
相关产品推荐

