首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

算法的程序

2012-02-03 
求一个算法的程序?等宽等高的长方体水箱,长度不等,各个水箱长度已知。在长度方向水箱首尾相接,水箱编序1、2、

求一个算法的程序?
等宽等高的长方体水箱,长度不等,各个水箱长度已知。在长度方向水箱首尾相接,水箱编序1、2、3、……k、k+1,在水箱相接的隔板底部安有单向水阀。初始状况,水箱分别盛不一定等高的水,各高度已知,高度均低于水箱高度。打开所有水阀,水箱k+1中的水可能会流进水箱k,遵循连通器原则;但是,水箱k中的水不会流进水箱k+1,因为水阀单向。稳定状态后,求知各个水箱中水的高度?

[解决办法]
这不是一个简单的问题
各个水箱中最终水的高度与很多方面的因素有关,比如阀的大小,阀的局部阻力系数,箱的沿程阻力,流体的流动状态,是层流,还是紊流,箱壁的粗糙度等等很多因数有关。
当然我们不能考虑每个方面,就需要作一些近似。
我建议:
1。认为水箱较多,因此把这些水箱都看作是一根水槽,注意,实际上最终的平衡状态与初始的各水箱的高度基本无关,打个比方,我们慢慢打开水龙头,与很快打开水龙头,最终水的流动状态是一样。
2。认为水的流动状态为紊流,一般水的流动速度不是很低的情况下是如此的,实验测出沿程阻力系数,因为理论计算几乎是不可能的,然后代入相关公式,求得液面高度的函数关系式,然后各阶段的高度平均记得各水箱的液面高度
具体公式查阅水力学和流体力学的书籍
[解决办法]
一个笨方法,不知是否可行:
从k+1开始,向前扫描,如果k+1的h> k的h,将两者的h设为(h[k+1]+h[k])/2,如果小于或等于,就继续向前扫描,直到3,2,1
重复上面的,直到所有的h[i+1] <=h[i]

[解决办法]
似乎问题也没有那么复杂,只需判断水箱里的水的高度,判断从哪一个开始是升序排列的然后将这些求平均值即是当前的水箱水的高度,如果在升序过程中遇到降序,则重新递归前面算法找升序的。。。前面的诸位观众整那么多没有的干嘛。。。怎么物理知识都扯上了。。。将问题理想化嘛
[解决办法]
我来发表一下我的看法:
根据连通器的原理,不管流速有多快,用时有多长,最终的结果是平衡,所以我认为这个问题和时间和流速没关.下面我说说我的解决方法.
因为是单向流通,所以最后出面的情况总是左边的水高永远是低于或等于右边的水高.那么就可以将问题简单化了,我们先将前面1,2水箱纳放我的视野,其它先不管.有人2有可能与3交流怎么能不管呢,别急我们慢慢整合,如果1水箱的水位高于或等于2水箱水位,这时我们将1和2水箱看成一个整体.并取其平均水位.做为一个标准与 3进行(1和2)操作.如果1水箱的水位低于2水箱,则将2的水位做为标准与 3进行(1和2)操作.与此推直到最后.但这时还没有得到正确答案.因为在我们别去1不管时(1的水位低于2的水位),有可能2和3的平均水位要低于1的水位.所以我们还要进行N次循环.当然这算法不是很好,应该有很好的算法.不过我认为这个问题和时间和流速关系不大.


[解决办法]
一个算法

n = 0

从n到K+1 找一个升序 到n时得到 n > n - 1 对0-n做平均

从n到K+1 找一个升序 到n时得到 n > n - 1 对0-n做平均

如果 n == k+1 令 n = 0 直到 从0到K+1无法找到升序



[解决办法]
struct box
{
int num;
int h;
} arr[n];
定义队列 queue();
for(int i=0;i <n;i++)
{

if(arr[i].h <arr[i+1].h) continue;
else enqueue(i);
}
int k=0;
while(!queue.empty())
{
sum=0;
for(int i=k;i <=queue.front();i++)
sum+=arr[i].h;
for(int i=k;i <=queue.front();i++)
arr[i].h=sum/(queue.front()-k+1);
dequeue();
k=i;
}








[解决办法]
因为水阀单向,水箱k+1中的水可能会流进水箱k,,水箱k中的水不会流进水箱k+1。所以应该就是简单的判断水箱k+1的水位有没有水箱k的高。而且最终稳定态唯一,与如何开水阀应该没关系。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int number;
struct box
{
int lastdiff;
float waterlevel;
int flag;
};
struct box *box;
float average;
int i,j,k;
printf( "input the nember of box\n ");
scanf( "%d ",&number);
box=malloc(number*sizeof(struct box));
for(i=0;i <number;i++)
{
printf( "\ninput the water level of box\nbox[%d]= ",i);
scanf( "%f ",&(box[i].waterlevel));
box[i].lastdiff=i;
if(i==0)
box[i].flag=0;
else
box[i].flag=1;
}
for(i=1;i <number;i++)
{
k=i;
while(box[k-1].waterlevel <box[k].waterlevel)
{
if(!box[k].flag)
break;
average=((k-box[k-1].lastdiff)*box[k-1].waterlevel+(i-k+1)*box[i].waterlevel)/(i-box[k-1].lastdiff+1);


for(j=box[k-1].lastdiff;j <=i;j++)
{
box[j].waterlevel=average;
box[j].lastdiff=box[k-1].lastdiff;
}
k=box[i].lastdiff;
}
}
for(i=0;i <number;i++)
printf( "\nbox[%d]=%f\n ",i,box[i].waterlevel);
system( "pause ");
}

热点排行