matlab - MATLAB - 如何定义多变量目标优化
问题描述
我试图理解多变量目标优化,我需要优化复杂的函数,但要开始,我需要优化以下函数:
function ap_phase = objecfun(tau)
f = 1000; %Frequency
w = 2*pi*f; %Angular Frequency
trans_func = @(taux) (1-1i*w*taux)./(1+1i*w*taux); %Transfer function
trans_zero = trans_func(tau(1)); %Transfer function evaluated with the first variable
trans_quad = trans_func(tau(2)); %Transfer function evaluated with the second variable
ap_phase = rad2deg(phase(trans_zero)-phase(trans_quad)); %Phase difference
end
函数 objecfun 将一个长度为 2 的向量作为输入,计算 2 个传递函数,然后减去传递函数的相位。
我的目标是相位应该在 90° 左右
我用来进行优化的脚本如下
tau0 = [2E-5, 1E-3]; %Initial Value for tau(1) and tau(2)
lb = [1E-7, 1E-7]; %Lower bound for tau(1) and tau(2)
ub = [1E-2, 1E-2]; %Upper bound for tau(1) and tau(2)
goal = 90; %Optimization goal
weight = 1; %Weight
[x,fval] = fgoalattain(@objecfun,tau0,goal,weight,[],[],[],[],lb,ub)
优化器收敛但我得到一个错误的答案,我得到
x =
0.0100 0.0000
fval =
-178.1044
错了,fval 应该接近 90°
我究竟做错了什么?
解决方案
我认为您需要替换您的目标函数和目标值,以使其适合问题表述。您可以将函数输出与所需角度之间的差异的 L2 范数用作目标函数,并将目标设置为一些容差。
我还检查了“fmincon”:
new_goal = 1e-4;
objectfun = @(x) norm(objecfun(x) - goal);
options = optimoptions('fgoalattain');
options.PlotFcns = 'optimplotfval';
[tau_star,fval] = fgoalattain(objectfun,tau0,new_goal,weight,[],[],[],[],lb,ub,[],options);
options = optimoptions('fmincon');
options.PlotFcns = 'optimplotfval';
[tau_star2,fval,exitflag,output] = fmincon(objectfun,tau0,[],[],[],[],lb,ub,[], options);
fgoalattain_solution_phase_diff = objecfun(tau_star)
fmincon_solution_phase_diff = objecfun(tau_star2)
并得到:
fgoalattain_solution_phase_diff =
90.0000
fmincon_solution_phase_diff =
90.0006
注意:您也可以在函数中省略 rad2deg 并将其值用作所需的角度 [rad]。
推荐阅读
- json - 如何流式传输单声道
- > 通过 Spring webflux?
- c++ - 如何使用 std::sqrt 作为 std::function?
- c++ - C++ 结构和数组:打印所有数组值的问题
- mocha.js - 带有柏树的摩卡测试模板
- c++ - STL 并行执行与 OpenMP 性能
- javascript - 从网站连接到 mongoDB(/mongoose)?
- kubernetes - Kubernetes Java 客户端 13.0.0 copyFileToPod() 挂起
- c++ - 重载要从 Qt 应用程序调用的外部 C++ 类
- c# - ASP.NET 自定义验证器客户端不工作
- ssl - 在较新的 Raspberry Pi OS 版本上,使用 curl/wget 的 https 连接失败