2016-01-21 111 views
1

我正在研究我的论文,并在Matlab中运行一些编程问题。我正在尝试实施'黄金二分法'来加速我的代码。为此,我已经咨询了函数FZERO的构建。MATLAB:在具有向量输出的函数上使用FZERO

所以我决定两个向量都是(1x20)之间的差异。

Difference = Clmax_dist-cl_vec; 

Clmax_dist来自一个半经验方法和cl_vec来自外部AVL.exe文件的excecution。

本质上,这种差异仅取决于一个变量AOA,因为Clmax_dist矢量是一个常数。因此,我不断向AVL.exe提供一个新的AOA值,以获得新的cl_vec,并将其再次与常量Clmax_dist进行比较。

我重复此操作,直到矢量中的某个元素变为零或负值。我的循环停止并显示最后的AOA。这是一个耗时的方法,我想用FZERO来加快速度。

但是,FZERO文档显示它只适用于具有标量作为输入的函数。因此,我的问题是:如何将FZERO用于具有向量作为输出的函数。还是我需要做一些完全不同的事情?

我已经试过如下:

[Difference] = obj.DATCOMSPANLOADING(AOA); 

[email protected]; 
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

基本上,你需要重写你的函数,以便你有一个方程的根,你试图找到。它看起来像你想最小化向量中的一个元素,所以也许像'foo = any(processed_vector <= 0)' –

+0

正确!我正在尝试这个。我也想到了这一点。我完成后发布我的结果。不管怎么说,还是要谢谢你! –

回答

3

fzero确实只适用于标量。但是,您可以将标准转换为标量:您对AOA感兴趣,其中任何的向量中的元素变为零,在这种情况下,您将重写目标函数以返回两个输出参数:minDifference,即min(Difference),以及Difference。第一个输出minDifference是差异的最小值,即fzero应该尝试优化哪个(从您的问题开始,我假设所有值均为正数)。第二个输出结果将用于检查差异向量。

+0

嘿,谢谢你的评论。这种方法似乎工作正常,加快了我的代码。你给了我我想要的链接。从来没有想过,以单一标量来转换我的标准是可行的。谢谢! –