簡體   English   中英

數值求解非線性方程

[英]Solving a nonlinear equation numerically

我有以下方程式可以解決:

 aRatio = ((sqrt_gamma_ratio * (1/m) * ((1 + (squared_m_coefficient * m^2))^num_exponent))/ denom);

其中變量aRatiosqrt_gamma_ratiosquared_m_coefficientnum_exponentdenom均為已知常數(分別為squared_m_coefficientnum_exponentdenom )。 在上面的代碼之前, m是符號定義的。 這是我的一些代碼中包含迭代的一部分,因此我需要一些幫助,提出一種通用方法來近似m (不必太精確,我可以說是百分之一百了)。 我試過使用vpasolve函數,如下所示:

f = vpasolve(aRatio == ((sqrt_gamma_ratio * (1/m) * ((1 + (squared_m_coefficient * m^2))^num_exponent))/ denom), m);

但它只是返回

Empty sym: 0-by-1

因此,Matlab似乎無法象征性地解決它。 我猜想我必須采用數值方法,而我對此不太熟悉。 長期目標是確定m作為aRatio的函數。 最終,我希望為aRatio創建一個值數組,其范圍為1-1000,間隔為10。這樣,我可以(希望地)生成aRatiom 這將通過使用while循環的迭代來完成。 我計划更改其他一些變量,但是我認為,如果我能僅就這一部分問題尋求幫助,那將有很長的路要走。

我的問題是為什么Matlab不能用符號方式解決這個相對簡單的方程式,我有什么選擇? 我已經在Google上進行了廣泛的搜索,我感到非常困惑。

編輯:這是相關的代碼

gam0 = 1.4; %specific heat ratio in middle of nozzle
gamE = 1.28:-.01:1.20 ; %establish exit sp heat ratio variation
denom = 1.728; % this is the denominator of the given eqn, evaluated at g* = 
1.4
aRatio = 1:10:1001;
count = 1;
mach_number = zeros(1,length(aRatio));

以下代碼用於調試目的,它屬於while循環。 我想我需要一個嵌套的while循環來迭代gamE,但是現在這確實不是我的問題。 我想要做的就是找回m的值,而我還沒有做

sqrt_gamma_ratio = sqrt(gam0 / gamE(1)); %1.046
squared_m_coefficient = .5 * (gamE(1) - 1); %.14
num_exponent = (gamE(1) + 1)/(2 * (gamE(1) - 1)); %4.07

注意:上面存儲的值僅來自gamE的第一次迭代,並且也會在最終產品中進行迭代,但是我對循環很滿意。 Matlab讓我頭疼!

f =((sqrt_gamma_ratio * (1/m) * ((1 + (squared_m_coefficient* 
m^2))^num_exponent))/ denom)-aRatio;
fn = fzero(matlabFunction(f),1);

當我跑步時,我得到以下信息:

Operands to the || and && operators must be convertible to logical scalar values.

老實說,我不知道這意味着什么或如何解決。 我想我至少要親近嗎?

下面只是while循環,我希望可以完成一天。 對於那些有興趣的人,我想獲取大約8000個數據點,我將它們全部存儲在一個數組中,但是基本上所有關於將m作為aRatio的函數進行查找,一旦我弄清楚了,我就擁有了迭代上面的gamE變量,這應該是小菜一碟。 附言:如果您願意,您可以嘲笑我下面令人不滿意的循環。

%{
while( count < length(compressive_area_ratio)+1 )

    sqrt_gamma_ratio = sqrt(gam0 / gamE(1));
    squared_m_coefficient = .5 * (gamE(1) - 1);
    num_exponent = (gamE(1) + 1)/(2 * (gamE(1) - 1));
    this_M = solve(compressive_area_ratio(count) == ((sqrt_gamma_ratio * 
(1/m) * ((1 + (squared_m_coefficient * m^2))^num_exponent))/ denom), m );
    disp(this_M);
    %mach_number(count) = this_M;
    count = count + 1;   
end
%}

%plot(compressive_area_ratio, mach_number);

有任何想法嗎 ?

您使用了vpasolve ,但是聲稱它不起作用,所以我決定先測試Solve,然后再測試vpa ,這就是我得到的:

gam0 = 1.4; %specific heat ratio in middle of nozzle
gamE = 1.28; %establish exit sp heat ratio variation
denom = 1.728; % this is the denominator of the given eqn, evaluated at g* = 1.4
aRatio = 1;
count = 1;
mach_number = zeros(1,length(aRatio));


sqrt_gamma_ratio = sqrt(gam0 / gamE(1)); %1.046
squared_m_coefficient = .5 * (gamE(1) - 1); %.14
num_exponent = (gamE(1) + 1)/(2 * (gamE(1) - 1)); %4.07


syms m
sol=solve(((sqrt_gamma_ratio * (1/m) * ((1 + (squared_m_coefficient * m^2))^num_exponent))/ denom)-aRatio);
vpa(sol)

   > 4.3269393310990630350495077697516i

暫無
暫無

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

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