[問題] ㄧ個在跑誤差的程式有問題

看板C_and_CPP (C/C++)作者 (huchihauu)時間15年前 (2010/11/10 22:48), 編輯推噓0(008)
留言8則, 3人參與, 最新討論串1/1
( *[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
你的答案我跑得出來耶.(你的main少了一個 { )
11/10 23:07, 1F

11/10 23:08, , 2F
Xr=0.0314613,T1=311.665k, T6a=981.272k, | 0.03
11/10 23:08, 2F

11/10 23:12, , 3F
main下面有{阿@@ 這裡面的程式碼是OK的 我放錯了 囧
11/10 23:12, 3F

11/10 23:12, , 4F
問題是在於 指要改成e和f>0.0001就會跑不出來ˊˋ
11/10 23:12, 4F

11/10 23:31, , 5F
演算法的問題,你的 e = 0.0158188, f = 0.0209653 收斂
11/10 23:31, 5F

11/10 23:33, , 6F
!!! 感謝樓上 請受我一拜(跪)
11/10 23:33, 6F

11/10 23:59, , 7F
請問m大如何得知?是設e1 e2, f1, f2 嗎?
11/10 23:59, 7F

11/11 17:25, , 8F
改變原po e, f > 0.03的條件, 每一圈都把e, f 印出來即可
11/11 17:25, 8F
文章代碼(AID): #1Csh3Fww (C_and_CPP)
文章代碼(AID): #1Csh3Fww (C_and_CPP)