首页 文章

MATLAB:在具有矢量输出的函数上使用FZERO

提问于
浏览
1

我正在研究我的论文并在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

如果我需要进一步详细说明,请随时提出 . 当然,非常感谢你 .

1 回答

  • 3

    fzero 确实只适用于标量 . 但是,您可以将标准转换为标量:您感兴趣的是 AOA ,其中向量中的任何元素都变为零,在这种情况下,您重写目标函数以返回两个输出参数: minDifference ,即 min(Difference)Difference . 第一个输出 minDifference 是差异的最小值,即 fzero 应该尝试优化的内容(从你的问题来看,我最后用来检查你的差异向量) .

相关问题