Variable range gives a wrong answer
2 次查看(过去 30 天)
显示 更早的评论
Greetings everyone, I have the following code, and my issue with it is that when I use a range of Pc from 400 to 600 then my mdot at 400 is 0.0002383 but it has to be as in mdotc equation = 0.0001987. There is a significant difference. Any idea why?
Equations with extra c is check equations which gives the right answer and equations below are those where I tried to use a range from 400 to 600.
Any help woud be useful. :)
clc; clear all; close all
%Variables
g=5/3;
g1=(g-1)/2;
g2=(1-g)/2;
Ac=1.267*10^-4;
Pc=400:600; % Pc range from 400 to 600
Pcc= 400; %Variable check
T0=350;
P0=615;
Rg=207.85;
Tcc = T0*(Pcc/P0)^((g-1)/g)-1 %Check at Pcc=400
mc= sqrt((1/g1)*((P0/Pcc)^((g-1)/g)-1))%Check at Pcc=400
mdotc = (Pcc/(sqrt(Tcc))*mc*sqrt(g/Rg)*Ac)%Check at Pcc=400
Tc = T0*(Pc/P0).^((g-1)/g)-1;
m = sqrt((1/g1)*((P0./Pc).^((g-1)/g)-1));
mdot = (Pc/(sqrt(Tc))*m*sqrt(g/Rg)*Ac);
plot(Pc,mdot)
xlabel('Background Pressure (Pc)')
ylabel('Mass flow rate (kg/s)')
0 个评论
采纳的回答
Walter Roberson
2021-11-8
Vectorize, Vectorize, Vectorize!
I recommend that you get in the habit of always using .* and ./ and .^ for everything (except perhaps when using scalar numeric constants as the first or last thing at the same artithmetic priority). Even if you are writing with variables you know are scalar now, if later you extend the variable to non-scalar, if you are in the habit of using the dot versions of the operators then you will not need to debug the failures later.
The exception, of course, being for cases where you are deliberately doing inner product (algebraic matrix multiplication) or deliberately doing matrix left divide \ or deliberately doing matrix right divide /
Even when using scalar numerics, keep in mind that 1/x with scalar x works the same as 1./x but that if you extend x to be non-scalar then 1/x suddenly will do something completely different. It is always safe to use / to divide by a scalar numeric value (unless the numeric value is being raised to a power, as power has higher priority)
It is safe to have expression * scalar_numeric . It is safe to have scalar_numeric * variable. However, expression * scalar_numeric * variable is not always safe, since expression * scalar_numeric might be non-scalar and non-scalar * variable could be a problem...
%Variables
g=5/3;
g1=(g-1)/2;
g2=(1-g)/2;
Ac=1.267*10^-4;
Pc=400:600; % Pc range from 400 to 600
Pcc= 400; %Variable check
T0=350;
P0=615;
Rg=207.85;
Tcc = T0*(Pcc/P0)^((g-1)/g)-1 %Check at Pcc=400
mc= sqrt((1/g1)*((P0/Pcc)^((g-1)/g)-1))%Check at Pcc=400
mdotc = (Pcc/(sqrt(Tcc))*mc*sqrt(g/Rg)*Ac)%Check at Pcc=400
Tc = T0.*(Pc./P0).^((g-1)./g)-1;
m = sqrt((1./g1).*((P0./Pc).^((g-1)./g)-1));
mdot = (Pc./(sqrt(Tc)).*m.*sqrt(g./Rg).*Ac);
plot(Pc,mdot)
xlabel('Background Pressure (Pc)')
ylabel('Mass flow rate (kg/s)')
更多回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Whos 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!