【问题标题】:MATLAB: Using FZERO on a function which has a vector outputMATLAB:在具有矢量输出的函数上使用 FZERO
【发布时间】:2016-01-21 13:29:00
【问题描述】:

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

如果我需要进一步详细说明,请随时询问。当然,非常感谢。

【问题讨论】:

  • 基本上,你需要重写你的函数,这样你就有了一个你想要找到根的方程。看起来您想最小化向量中的一个元素,所以可能类似于foo = any(processed_vector <=0)
  • 没错!我现在正在尝试这个。我也想通了。完成后我会发布我的结果。还是谢谢!

标签: matlab optimization vector


【解决方案1】:

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

【讨论】:

  • 您好,谢谢您的评论。这种方法似乎工作正常并加快了我的代码。你给了我我丢失的链接。从未想过将我的标准转换为单个标量会起作用。谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-05-02
  • 2013-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-23
  • 2018-01-10
相关资源
最近更新 更多