今天上数学建模的时候了解到的两车相遇的问题,还是挺有意思的,就是不要想的太深,就想些表面上的很容易就算出来的
问题大概阐述 :相距有100公里的两辆车,分别记为红和绿,红车以10公里/h的速度往右行驶,绿车以8公里/h的速度往左行驶,现在有一个摩托车来实时观测这辆车的距离,在这两车之间往返行驶,速度是60公里/h,问题是当两车之间的距离小于0.2公里的时候,就默认相遇,并求出摩托车来回了多少趟?
看起来的一个小学生问题,但是很容易想多,这个时候其实画画图想想还是比较好的,以后再遇到这类似的问题就直接套模板了
注意精度问题
package ApproachingQuestion; import org.junit.Test; /* * 问题大概阐述 :相距有100公里的两辆车,分别记为红和绿,红车以10公里/h的速度往右行驶,绿车以8公里/h的速度往左行驶,现在有一个摩托车来实时观测这辆车的距离,在这两车之间往返行驶,速度是60公里/h, * 问题是当两车之间的距离小于0.2公里的时候,就默认相遇,并求出摩托车来回了多少趟? * */ /* * 主要的解题思路就是 : 其实每一趟就是一次距离的缩短,那怎么来记录当前的距离,肯定就是要想到时间的问题了,那时间又要怎么算,那就是小学时就学过的相遇问题求时间了,也就是每一次缩短的距离可以看作一帧,每次都要改变相应的距离和时间值, * 这里还有注意到的是,摩托车往返时的相对速度是不一样的,则可以用一个正反变量来不断改变每一趟的速度来回 * */ public class Approach { double Aspeed = 10; double Bspeed = 8; double motor = 60; double distance = 100; double ALocation = 0; //这里最好是就按照题意来表示他们所在的位置,不要都设置成0来算距离 double BLocation = 100; int count = 0; // 来记录摩托车与两车相遇的次数 int flag = 1; // 来标志每一趟后要改变速度的标识 double t= 0; @Test public void RoundTrip(){ while((BLocation - ALocation) > 0.2){ // 最后相距变成0.2就相遇了 System.out.println("BLocation"+BLocation); System.out.println("ALocation"+ALocation); if(flag == 1){ // motor先从A开往B // 相遇时间 t = (BLocation - ALocation) * 0.1/ (motor+Bspeed) ; }else{ t = (BLocation - ALocation) * 0.1 / (motor+Aspeed); } System.out.println("t"+t); // 更新距离 BLocation = BLocation - Bspeed*t; ALocation = ALocation + Aspeed*t; // motor 反向 flag = -flag; count ++; } System.out.println(count); //return count; } public static void main(String[] args) { ///int c = new Approach().RoundTrip(); //System.out.println(c); } }