作者sjgau (sjgau)
看板Fortran
标题Re: [问题] 二分法与试位法
时间Wed May 18 15:41:47 2011
#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:
[email protected]
我的课程介绍网页:
http://www.csie.ntu.edu.tw/train/teacher_display.php?num=18
AutoCAD 台湾地区菁英讲师获选
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.137.83.168
1F:推 jsb: 这是 C 语言写的吧. . . 05/18 16:05
2F:→ sjgau:使用什麽语言,并不重要。重要的是,解决问题的方法。 05/18 17:24
3F:→ Cypresslin:可以防止照抄XD 05/18 22:54
4F:→ charlesdc:好像是开版那年代的老师出的作业都要求防抄所以都会有奇 05/19 22:46
5F:→ charlesdc:特解~~XD 05/19 22:46