我正在研究我的论文并在Matlab中运行一些编程问题。我正在努力实施“黄金二分法”'''''加快我的代码。为此,我已经咨询了功能FZERO的构建。
所以我确定两个向量之间的差异(1x20)。
Difference = Clmax_dist-cl_vec;
Clmax_dist
来自半经验方法,cl_vec
来自外部AVL.exe文件的执行。
基本上,这种差异仅取决于一个变量AOA
,因为Clmax_dist
向量是常量。因此,我不断向AVL.exe提供新的AOA
值以获取新的cl_vec
并再次将其与常量Clmax_dist
进行比较。
我正在迭代这个,直到向量中的一个元素变为零或负数。我的循环停止并显示最终的AOA
。这是一个耗时的方法,我想使用FZERO加快速度。
但是,FZERO文档显示它仅适用于具有标量输入的函数。因此,我的问题是:如何将FZERO与具有向量作为输出的函数一起使用。或者我需要做一些完全不同的事情吗?
我尝试过以下方法:
[Difference] = obj.DATCOMSPANLOADING(AOA);
fun=@obj.DATCOMSPANLOADING;
AOA_init = [1 20];
AOA_root = fzero(fun,AOA_init,'iter');
这给了我以下错误:
Operands to the || and && operators must be convertible to logical scalar values.
Error in fzero (line 423)
while fb ~= 0 && a ~= b
Error in CleanCLmax/run (line 11)
AOA_root = fzero(fun,AOA_init,'iter');
Error in InitiatorController/moduleRunner (line 11)
ModuleHandle.run;
Error in InitiatorController/runModule (line 95)
obj.moduleRunner(ModuleHandle);
Error in RunSteps (line 7)
C.runModule('CleanCLmax');
DATCOMSPANDLOADING函数包含以下内容:
function [Difference] = DATCOMSPANLOADING(obj,AOA)
[Input]= obj.CLmaxInput; % Creates Input structure and airfoil list
obj.writeAirfoils(Input); % Creates airfoil coordinate files in AVL directory
[Clmax_dist,YClmax,Cla_mainsections] = obj.Clmax_spanwise(Input); % Creates spanwise section CLmax with ESDU method
[CLa] = obj.WingLiftCurveSlope(Input,Cla_mainsections); % Wing lift curve slope
[Yle_wing,cl_vec] = obj.AVLspanloading(Input,CLa,AOA); % Creates spanloading with AVL
Difference = Clmax_dist-cl_vec;
end
如果我需要进一步详细说明,请随时提出。当然,非常感谢你。
答案 0 :(得分:3)
fzero
确实只适用于标量。但是,您可以将标准转换为标量:您对AOA
感兴趣,其中向量中的任何元素变为零,在这种情况下,您重写目标函数以返回两个输出参数:minDifference
,min(Difference)
和Difference
。第一个输出minDifference
是差异的最小值,即fzero
应该尝试优化的内容(根据您的问题,我假设所有值都开始为正)。您将用于检查差异向量的第二个输出。