簡體   English   中英

MATLAB錯誤使用fzero function解決循環

[英]MATLAB error using fzero function to solve the loop

我的以下代碼生成圖 1 中 V 和 D 值的 plot。在圖中,拋物線和直線相交,我需要從循環中找到 plot 的根。 於是嘗試使用fzero function,卻出現了錯誤:

邏輯 AND (&&) 和 OR (||) 運算符的操作數必須可轉換為邏輯標量值。 使用 ANY 或 ALL 函數將操作數減少為邏輯標量值。

fzero 錯誤(第 326 行)
elseif ~isfinite(fx) || ~isreal(fx)

HW1 錯誤(第 35 行)
x=fzero(樂趣,1);

我的代碼是:

clear all; close all

W = 10000; %[N]
S = 40; %[m^2]
AR = 7;
cd0 = 0.01;
k = 1 / pi / AR;
clalpha = 2*pi;
Tsl=800; 
figure(1);hold on; xlabel('V');ylabel('D')
for h=0:1:8; 
    i=0;
    for alpha = 1:0.25:12
        i=i+1;
        rho(i)=1.2*exp(-h/10.4);
        cl(i) = clalpha * alpha * pi/180;
        V(i) = sqrt(2*W/rho(i)/S/cl(i));
        L(i) = 0.5 * rho(i) * V(i) * V(i) * S * cl(i);
        cd(i) = cd0 + k * cl(i) * cl(i);
        D(i) = 0.5 * rho(i) * V(i) * V(i) * S * cd(i);
        clcd(i) = cl(i)/cd(i);
        p(i) = D(i)*V(i);
        ang(i) = alpha;
        T(i)=Tsl*(rho(i)/1.2).^0.75;
    end
    figure(1); plot(V,D); hold on 
    plot(V,T);
end
fun = @(V) 0.5*V.*V.*rho.*S.*cd-T;
x=fzero(fun,1);

可能我不應該使用 fzero function,但任務是從 plot 中找到 V 的根(圖 1)。 分別有拋物線和直線。

來自fzero(fun,x)的文檔

fun :要求解的 Function,指定為標量值 function 的句柄或此類 function 的名稱。fun 接受標量x並返回標量fun(x)

您的 function 不返回標量輸入的標量值,它始終返回一個向量,該向量對於與 fzero 一起使用的fzero無效。

1.-您的代碼沒有 plot VD :您的代碼繪制D(V)T(V)

2.- T是完全平坦的,盡管使用T(i)=Tsl*(rho(i)/1.2).^0.75;參與內部for循環計算; 因為它必須以某種方式進行修改。

但實際上,它對於V的所有樣本、恆定溫度(°C?)以及外部for循環掃描變量h內的所有圈都保持不變[0:1:8]

生成的T(V)函數是扁平線。

3.-然后你嘗試構建一個第三個 function f你把它當作f(V)但實際上它是f(V,T)與 function 的右側有一個數字表達式,沒有符號表達式fzero期望嘗試零求解的符號表達式。

在 MATLAB中,必須以符號或數字方式進行零查找

像 fzero 這樣的符號找零fzero不適用於數值表達式,例如您在halpha的 2 個循環中計算的數值表達式。

fzero 可求解的fzero表達式示例:

3.1.-

fun = @(x)sin(cosh(x));
x0 = 1;
options = optimset('PlotFcns',{@optimplotx,@optimplotfval});
x = fzero(fun,x0,options)

3.2.-

fun = @sin; % function
x0 = 3; % initial point
x = fzero(fun,x0)

3.3.-將以下 3 行放在一個單獨的文件中,將此文件命名為fm

function y = f(x)
y = x.^3 - 2*x - 5;

並解決

fun = @f; % function
x0 = 2; % initial point
z = fzero(fun,x0)

3.4.- fzeros可以參數化求解

myfun = @(x,c) cos(c*x);  % parameterized function
c = 2;                    % parameter
fun = @(x) myfun(x,c);    % function of x alone
x = fzero(fun,0.1)

4.-所以既然你已經完成了所有的數值計算並且沒有提供符號表達式,那么用數值而不是符號來求解是合理的。

為此, 這里有一個非常有用的 function,稱為intersections.m ,由 Douglas Schwarz 編寫

clear all; close all;clc

W = 10000; %[N]
S = 40; %[m^2]
AR = 7;
cd0 = 0.01;
k = 1 / pi / AR;
clalpha = 2*pi;
Tsl=800; 

figure(1);
ax1=gca
hold(ax1,'on');xlabel(ax1,'V');ylabel(ax1,'D');grid(ax1,'on');
title(ax1,'1st graph');
reczeros={}
for h=0:1:8; 
    i=0;
    for alpha = 1:0.25:12
        i=i+1;
        rho(i)=1.2*exp(-h/10.4);
        cl(i) = clalpha * alpha * pi/180;
        V(i) = sqrt(2*W/rho(i)/S/cl(i));
        L(i) = 0.5 * rho(i) * V(i) * V(i) * S * cl(i);
        cd(i) = cd0 + k * cl(i) * cl(i);
        D(i) = 0.5 * rho(i) * V(i) * V(i) * S * cd(i);
        clcd(i) = cl(i)/cd(i);
        p(i) = D(i)*V(i);
        ang(i) = alpha;
        T(i)=Tsl*(rho(i)/1.2).^0.75;
    end
 
    plot(ax1,V,D); hold(ax1,'on'); 
    plot(ax1,V,T);
    
    [x0,y0]=intersections(V,D,V,T,'robust');
    reczeros=[reczeros [x0 y0]];
    for k1=1:1:numel(x0)
        plot(ax1,x0,y0,'r*');hold(ax1,'on')
    end
    
end

在此處輸入圖像描述

因為在每一對D(V) T(V)中可能沒有根、1 個根或超過 1 個根,所以使用單元格reczeros來存儲獲得的任何根是有意義的。

要讀取在第 3 圈和第 5 圈獲得的根:

reczeros{3}
=
55.8850  692.5504
reczeros{5}
=
23.3517  599.5325
55.8657  599.5325

5.-現在是第二張圖,即 function,其定義方式與雙for循環中的定義方式不同:

P = 0.5*V.*V.*rho.*S.*cd-T;

figure(2);
ax2=gca
hold(ax2,'on');xlabel(ax2,'V');ylabel(ax2,'P');grid(ax2,'on');
title(ax2,'2nd graph')
plot(ax2,V,P)
plot(ax2,V,T)

[x0,y0]=intersections(V,T,V,P,'robust');
for k1=1:1:numel(x0)
    plot(ax2,x0,y0,'r*');hold(ax2,'on')
end

在此處輸入圖像描述

format short
V0=x0
P0=y0
V0 =
86.9993
P0 =
449.2990

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM