Re: [問題] 二分法與試位法
#if 0
mm= 60.000000, ym= 6.835040e-002
mm= 50.000000, ym= -4.528713e+000
mm= 55.000000, ym= -2.153420e+000
mm= 57.500000, ym= -1.023832e+000
mm= 58.750000, ym= -4.731318e-001
mm= 59.375000, ym= -2.012471e-001
mm= 59.687500, ym= -6.616356e-002
mm= 59.843750, ym= 1.164482e-003
mm= 59.765625, ym= -3.248176e-002
mm= 59.804688, ym= -1.565419e-002
mm= 59.824219, ym= -7.243745e-003
mm= 59.833984, ym= -3.039354e-003
mm= 59.838867, ym= -9.373667e-004
mm= 59.841309, ym= 1.135749e-004
mm= 59.840088, ym= -4.118916e-004
mm= 59.840698, ym= -1.491573e-004
mm= 59.841003, ym= -1.779091e-005
mm= 59.841156, ym= 4.789206e-005
mm= 59.841080, ym= 1.505059e-005
*** exit the loop, 8310, answer is: 59.841042, -1.370158e-006
請按任意鍵繼續 . . .
#endif
// ------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
// ----------------------------------------------
double abs_diff(double x, double y)
{
// 兩個浮點數的 絕對誤差=
return(fabs(x - y));
}
// ----------------------------------------------
double rel_diff(double x, double y)
{
// 兩個浮點數的 相對誤差=
double ax, ay, max;
ax= fabs(x);
ay= fabs(y);
max= ((ax>=ay)?ax:ay);
if (max > 0) {
return(abs_diff(x, y)/max);
}
else {// max == 0.0
return(max);
}
}// end of rel_diff()
// ----------------------------------------------
int main()
{
double t= 9.0, m1, m2, mm, y1, y2, ym;
double g= 9.8, c= 15.0, mm_old;
m1= 40.0;
m2= 80.0;
y1= (g*m1/c)*(1.0 - exp(-(c/m1)*t)) - 35.0;
y2= (g*m2/c)*(1.0 - exp(-(c/m2)*t)) - 35.0;
int flag= 0;
// ----------------------------------------------------
for (;;) {
mm= (m1 + m2)/2.0;
ym= (g*mm/c)*(1.0 - exp(-(c/mm)*t)) - 35.0;
if (flag == 0) {
flag= 1;
}
else {
if (rel_diff(mm, mm_old) < 1.0e-6) {
// get the answer
break;
}
}
mm_old= mm;
printf("mm= %.6lf, ym= %.6le \n", mm, ym);
if ((y1*ym) < 0.0) {// y1 - ym 中間,有答案
// y2, 移動到 ym
m2= mm;
y2= ym;
}
else if ((ym*y2) < 0.0) {// ym - y2 中間,有答案
// y1, 移動到 ym
y1= ym;
m1= mm;
}
else {// == 0.0, 其中的 ㄧ個,剛好是答案
printf("\n *** get the answer, 0338, mm= %.6le, ym= %.6le \n", mm, ym);
system("pause");
break;
}
}
printf("\n\n *** exit the loop, 8310, answer is: %.6lf, %.6le \n", mm, ym);
system("pause");
return(0);
}// end of main()
※ 引述《asmalljulie (chu)》之銘言:
: 很想認真學數值
: 可是我怎麼看都不懂
: 老師給的作業想了好幾天好幾夜ˊˋ
: 迫在眉梢了~~
: 還是要來找強手...QQ
: Q:
: 降落中傘兵速度v為
: v=(g*m/c)*(1-EXP(-(c/m)*t))
: 其中g=9.8m/s2,c=15kg/s
: 算出使得t=9秒時速度為v=35m/s的質量m
: 誤差=0.1%的水準
: 要用二分法或試位法~~
: 好難....
--
e-mail: sjgau4311@gmail.com
我的課程介紹網頁:
http://www.csie.ntu.edu.tw/train/teacher_display.php?num=18
AutoCAD 台灣地區菁英講師獲選
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.137.83.168
推
05/18 16:05, , 1F
05/18 16:05, 1F
→
05/18 17:24, , 2F
05/18 17:24, 2F
→
05/18 22:54, , 3F
05/18 22:54, 3F
→
05/19 22:46, , 4F
05/19 22:46, 4F
→
05/19 22:46, , 5F
05/19 22:46, 5F
討論串 (同標題文章)
Fortran 近期熱門文章
PTT數位生活區 即時熱門文章