续第30楼:
我算错sina+cosa的最小值了,我之前直接用1是不对的因为最后结果应该是,
Vmin = (24.35/15) *(sina + cosa) //最小值 Vmax = (52.7/30) *(sina + cosa) //最大值
由此推断sina + cosa应该大于 1 吧? 推断而已……
[此贴子已经被作者于2004-07-25 15:39:08编辑过]
续第31楼:算法……
#include<iostream.h> #include<math.h> #define pi 3.1415926 //v的最小值是1.43或精度更高 void main() { int n=1; double v, a; //改类型为double const double radian=pi/180; //radian是弧度的意思 for(v=1.0;v<2.0;v+=0.01) for(a=radian;a<pi/2;a+=radian) if(v*(sin(a)+cos(a))<24.35/15) { //cout<<a<<" "<<t<<endl; n++; } cout<<n<<endl; }
用两个变量和这种精度,算到只剩下2633种符合的解,这是在排除了t变量的情况下算的。
我现在有点晕眩,差点就挂了,我的遗言是:
对不起,灌水了……(先溜掉,免得被砍死)
言归正传:首先对“神vLinux飘飘”说声——
对不起,我错了,以下是他发给我的短信(公开你的悄悄话咯):
看看这一行: (sina+cosa)2 = sin2a+2sinacosa+cos2a = 1+sin2a 你最后推导得出:sina+cosa = sqrt(1+sin2a) 的最大值为1,其实这个是错误的,可以举个例子:当a=45度时,sin(45)=cos(45)=1.414 明显大过1 其实求sina+sinb的最值是有个公式的: a*sin(A)+b*cos(B)=sqrt(a+b)*sin(a+x)
谢谢……
楼主用了三层循环,算得我的机子都发蒙,我觉得有必要化简一下! 仍旧重新开始:
vtcosa =1000 (0<a<90) ...(1) 1.89t - vtsina = 1160 (1.0<v<2.0) (600<t<1200) ...(2) //我从这里入手吧……
第一步仍旧同第23楼我的帖子: (2) - (1) = 1.89t - vtsina - vtcosa = 1160 - 1000 -> t(1.89 - v(sina + cosa)) = 160
这里开始变化: t = 160 / (1.89 - v(sina + cosa)) //就只是移动过去剩下t 由题意得 600<t<1200 => 600< 160 / (1.89 - v(sina + cosa)) <1200 这样一来剩下两个变量,化简得: 15< 4 / (1.89 - v(sina + cosa)) <30
移项: 1.89*15 - 15v(sina + cosa) < 4 < 1.89*30 - 30v(sina + cosa) 左边: 28.35 - 4 < 15v(sina + cosa) ...(3) 右边: 30v(sina + cosa) < 56.7 - 4 ...(4)
得到: 24.35/15 < v(sina + cosa) < 52.7/30 //余下两个变量 而且其中三角函数可以得到最大值最小值,这样减少一个循环节省好多时间
待续……
最终幻想篇:
在这个引用自29楼的帖子中,经过我破釜沉舟的思考后(夸张了点),得到如下结论:
24.35/15 < v(sina + cosa) < 52.7/30 //余下两个变量
令 f(a) = sina + cosa ,此时的关系是 Vmin = 24.35/15 ÷ f(a)max Vmax = 52.7/30 ÷ f(a)min
所谓最后一步骤就是讨论f(a)的最大值最小值:
方法一:27楼和28楼的方法:
根据sin2a+cos2a=1的性质, (sina+cosa)2 = sin2a+2sinacosa+cos2a = 1+2sinacosa //其中2sinacosa = sin2a f(a) = sina+cosa = sqrt(1+sin2a) 由 0<a<90 得 0<2a<180 => sin2a的最大值是1 f(a)max = sqrt(2)
于是解得 Vmin = 24.35/15 ÷ sqrt(2) = 1.14787
方法二:
f(a) = sina + cosa = sina + sin(90-a) //利用性质 sinx = cos(90-x) 再用公式sina + sinb = 2 * sin[(a+b)/2] * cos[(a-b)/2]得:
原式 = 2 * sin[(a+90-a)/2] * cos[(a-90+a)/2] = 2 * sin45 * cos[(2a-90)/2] = sqrt(2) * cos(a-45)
由于 0<a<90 得 -45<(a-45)<45 由余弦函数的曲线图得 cos(a-45) 的最大值为1 原式 = sqrt(2) * 1 = sqrt(2) 得到:f(a)max = sqrt(2)
于是解得 Vmin = 24.35/15 ÷ sqrt(2) = 1.14787
题外话:讨论Vmax!
仍用29楼的方法得到两个变量的式子:
24.35/15 < v(sina + cosa) < 52.7/30 //余下两个变量
Vmax = 52.7/30 ÷ (sina+cosa) //令 f(a) = sina + cosa
利用上面方法二得到
原式 = 2 * sin[(a+90-a)/2] * cos[(a-90+a)/2] = 2 * sin45 * cos[(2a-90)/2] = sqrt(2) * cos(a-45)
由于 0<a<90 得 -45<(a-45)<45 此时由余弦函数的曲线图得 cos(a-45) 的最大值为0
根据分母不能为0的性质, v(sina + cosa) < 52.7/30 中的sina+cosa不能取0 于是,我们说 Vmax不存在 或者 无限趋近于题目给定的范围2 //1.0<v<2.0
[此贴子已经被作者于2004-07-30 01:31:46编辑过]
是的,我一直觉得楼主的答案有点奇怪。
但是也很可能是大家没讨论到v 和 t的取值范围要同时成立。两个函数合并,很可能会造成定义域、值域的扩大或缩小
不是的,我的算法已经考虑进去了,因为我是用t = f(a,v)代入 600<t<1200, 是在的范围内求得变量a所能得到的最大值,然后…… 回头想想,也对啊!有道理,我一开始就用t的最小值来代入,这样是忽略了t变量在函数中的存在,神的话有道理,看来我要重新考虑,不过从数学角度,我觉得我的算法没错。 楼主又好久没上来,不是的话就可以讨论一下,和问一些问题……
答案:V的最小值是1.43或精度更高 //我想知道这是标准答案还是楼主算出来的答案