| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3422 人关注过本帖
标题:穷举搜索法解方程组(待高手指点)
只看楼主 加入收藏
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
收藏
得分:0 

续第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编辑过]

2004-07-25 15:20
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
收藏
得分:0 

续第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变量的情况下算的。

2004-07-25 15:33
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
收藏
得分:0 

我现在有点晕眩,差点就挂了,我的遗言是:

对不起,灌水了……(先溜掉,免得被砍死)

言归正传:首先对“神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)

谢谢……

2004-07-25 15:44
神vLinux飘飘
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:浙江杭州
等 级:贵宾
威 望:91
帖 子:6140
专家分:217
注 册:2004-7-17
收藏
得分:0 

好小子!怎么没公开要你买保险套那行!

还有这行,我不小心打错了 sin(45)=cos(45)=1.414

应该为:sin(45)+cos(45)=1.414

[此贴子已经被作者于2004-07-25 17:18:22编辑过]


淘宝杜琨
2004-07-25 17:16
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
收藏
得分:0 
以下是引用live41在2004-07-25 15:00:47的发言:

楼主用了三层循环,算得我的机子都发蒙,我觉得有必要化简一下! 仍旧重新开始:

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编辑过]

2004-07-30 01:00
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
收藏
得分:0 

上帖是我一番苦战的结果,我想讲的是,我算到的最小值是 Vmin = 1.14787

方法是没问题,但是和楼主的答案有出入,what's being?

2004-07-30 01:46
神vLinux飘飘
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:浙江杭州
等 级:贵宾
威 望:91
帖 子:6140
专家分:217
注 册:2004-7-17
收藏
得分:0 

是的,我一直觉得楼主的答案有点奇怪。

但是也很可能是大家没讨论到v 和 t的取值范围要同时成立。两个函数合并,很可能会造成定义域、值域的扩大或缩小


淘宝杜琨
2004-07-30 07:28
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
收藏
得分:0 
以下是引用神vLinux飘飘在2004-07-30 07:28:27的发言:

是的,我一直觉得楼主的答案有点奇怪。

但是也很可能是大家没讨论到v 和 t的取值范围要同时成立。两个函数合并,很可能会造成定义域、值域的扩大或缩小

不是的,我的算法已经考虑进去了,因为我是用t = f(a,v)代入 600<t<1200, 是在的范围内求得变量a所能得到的最大值,然后…… 回头想想,也对啊!有道理,我一开始就用t的最小值来代入,这样是忽略了t变量在函数中的存在,神的话有道理,看来我要重新考虑,不过从数学角度,我觉得我的算法没错。 楼主又好久没上来,不是的话就可以讨论一下,和问一些问题……

答案:V的最小值是1.43或精度更高 //我想知道这是标准答案还是楼主算出来的答案

2004-07-30 10:44
雨夜探月
Rank: 1
等 级:新手上路
帖 子:31
专家分:0
注 册:2004-7-15
收藏
得分:0 
  谢谢各位兄弟的热情指点,小弟会认真的领悟你们的思想.

http://www./jgjs/picture/photos/html/10061.htm
2004-08-01 08:58
雨夜探月
Rank: 1
等 级:新手上路
帖 子:31
专家分:0
注 册:2004-7-15
收藏
得分:0 

是标准答案.因为我的答案对不上所以才问大家.


http://www./jgjs/picture/photos/html/10061.htm
2004-08-02 23:04
快速回复:穷举搜索法解方程组(待高手指点)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020730 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved