[問題] ㄧ個在跑誤差的程式有問題
( *[1m *[m 為色碼,可以按 Ctrl+V 預覽會顯示的顏色 )
( 未必需要依照此格式,文章條理清楚即可 )
遇到的問題: (題意請描述清楚)
當我在運算誤差時,所設的容許誤差只要太小,輸出的值就會變成nan
希望得到的正確結果:
可以縮小誤差到0.001以下(程式中的e和f)
程式跑出來的錯誤結果:
Xr和T1算出來變成nan
開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux)
DEV C++
有問題的code: (請善用置底文標色功能)
#include <iostream>
#include <math.h>
#include <cmath>
using namespace std;
int main()
{
long double Vd=0.000625,Vc=0.0000822,Rc=8.6,B=0.0919,S=0.0942;
long double Xr=0.04,P1=100,T1=333,R=0.287,k=1.35,Qhv=44300,Cv=0.821;
long double e=1,f=1,T11,Xr1,T6a;
while (e>0.03||f>0.03)
{
//state 1
long double V1=Vd+Vc;
long double Mm=(P1*V1)/(R*T1);
//state 2
long double P2=P1*pow(Rc,k);
long double T2=T1*pow(Rc,k-1);
long double V2=Vc;
long double Mf=0.0625*(1-Xr)*Mm; //1/16=0.0625
//state 3
long double T3=(Mf*Qhv+Mm*Cv*T2)/(Mm*Cv);
long double V3=V2;
long double P3=P2*T3/T2;
//state 4
long double T4=T3*pow(1/Rc,k-1);
long double P4=P3*pow(1/Rc,k);
long double V4=V1;
//exhaust process
long double P7=100;
long double T7=T3*pow(P7/P3,(k-1)/k);
Xr1=(1/Rc)*(T4/T7)*(P7/P4);
long double Ta=(T1-Xr*T7)/(1-Xr);
//part throttle
long double P6a=50,P6=P1;
T6a=T7*pow(P6a/P6,(k-1)/k);
T11=Xr1*T6a+(1-Xr)*Ta;
//誤差運算
e=abs((Xr1-Xr)/Xr1);
f=abs((T11-T1)/T1);
if (e>0.03)
{Xr=Xr1;}
if (f>0.03)
{T1=T11;}
}
cout <<"Xr="<<Xr1<<"\nT1="<<T11<<"k\nT6a="<<T6a<<"k\n";
system("pause");
return 0;
}
補充說明:
這題是我在算內燃機的題目。主要問題是在誤差運算那邊,原本希望可以使用到e>0.0001
和f>0.0001,但經過多次運算...發現只要誤差容許範圍小於0.03就會出現nan,就算將
double改成long double也不能解決這個問題,煩請大大幫忙ˊˋ
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.113.90.82
→
11/10 23:07, , 1F
11/10 23:07, 1F
→
11/10 23:08, , 2F
11/10 23:08, 2F
→
11/10 23:12, , 3F
11/10 23:12, 3F
→
11/10 23:12, , 4F
11/10 23:12, 4F
→
11/10 23:31, , 5F
11/10 23:31, 5F
→
11/10 23:33, , 6F
11/10 23:33, 6F
→
11/10 23:59, , 7F
11/10 23:59, 7F
→
11/11 17:25, , 8F
11/11 17:25, 8F
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章