用数值求解非线性方程

时间:2018-03-08 13:01:44

标签: matlab loops iteration numerical-methods equation-solving

我有以下等式来解决:

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

变量aRatiosqrt_gamma_ratiosquared_m_coefficientnum_exponentdenom都是已知常量(1,1.046,.14,4.07和分别为1.728)。就在上面的代码之前,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.这样我可以(希望)生成aRatio与{{m的关系图。 1}}。这将通过使用while循环迭代来完成。我打算改变一些其他变量,但我想如果我能解决这个问题的一部分,那么它可能会有很长的路要走。

我的问题是为什么Matlab不能象征性地解决这个相对简单的等式以及我有哪些替代方案?我广泛搜索了这篇文章,我感到非常困惑。

编辑:这是相关代码

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);

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您使用vpasolve,但声称它不起作用,所以我决定测试求解,然后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