如下图所示:已知某游泳池的长度为50米,宽度为25米。某人的游泳速度为0.8米/秒,步行速度为1.2米/秒。现要从A点运动(步行和游泳)到C点,那么从AB边上何处下水游到C点的时间最短?
编程求解出该点距A点的长度length及所用的最短时间time。
#include<stdio.h>
#include<math.h>
#define a 50
#define b 25
#define delta 0.01//直接比较time时用到的微小增量
double derivative(double x)//导数
{
return ((x-a)*3.0/sqrt((a-x)*(a-x)+b*b))+2;//其实这里应该有系数5/12,但是无关紧要,就略去了
}
double t(double n)//时间time函数
{
return sqrt((a-n)*(a-n)+b*b)/0.8+(n/1.2);
}
int main()
{
double time,length;
double left=0,right=a; //二分法使用到的变量
int k;
printf("1 直接比较time值\n2 二分法求导数零点\n请输入:");
scanf("%d",&k);
switch(k)
{
case 1:
//迭代 直接比较time值
for(length=delta,time=t(0);time>t(length);length+=delta)
{
//初步判断时间是先减后增的函数,故比较前后两项,找出time增减性发生变化时对应的的length即可
time=t(length);
}
printf("length=%lf time=%lf",length,time);
break;
case 2:
//二分法迭代求导数零点
for(length=right/2.0;fabs(derivative(length))>1e-6;)
{
if(derivative(length)*derivative(left)>0)
{
left=length;
length=(length+right)/2;
}
else
{
right=length;
length=(length+left)/2;
}
}
time=t(length);
printf("length=%lf time=%lf",length,time);
break;
}
return 0;
}