数值分析课程设计
——计算机1405 杨程皓 20143717
我选择的课题是城市用水量预测问题:为了节约能源和水源,某供水公司需要根据日供水量记录估计未来一时间段(未来一天或一周)的用水量,以便安排未来(该时间段)的生产调度计划。现有某城市7 年用水量的历史记录,记录中给出了日期、每日用水量(吨/日)。 1.充分利用这些数据,分别用插值法和数据拟合方法建立该城市的日用水量 随时间变化的函数近似关系,据此来预测2015 年1 月份该城市的用水量,以制 定相应的供水计划和生产调度计划。
插值法我选用的是拉格朗日插值法,但是运行出来的结果为1674.15,明显不合乎常理,考虑到此题是预测问题,朗格拉日插值法局限性比较大,当我们预测已给数据的范围内的数据时,我得到的数值是比较精确的,但是此题的所求数据并不在所给的范围内,所以结果出现比较大的误差还是可以想到的,如果想用插值法做此题,可以用下面的方法,得到的误差会相对小一些,用2008~2014年1月1日来插值法求2015年1月1日的用水量,同理求出1月的31天的用水量,加起来就是2015年1月所用水量的一个估计值,这样做的误差会相对小很多。
接下来我用了数据拟合的最小二乘法来算此题,得到的拟合曲线为y=82.3951x-161379,带入得到的结果为4647.49,而我们所期盼的结果也大致在这个结果附近,为了得到精确的结果,我用matlab编写了一下专门用来做预测的BP函数的程序,所得到的结果为4506.1,所以函数拟合算法得到的结果还是较为精确的。
2.插值法的优点是便于程序的书写,在给定数据的范围内,准确度非常高,但是如果所求的数据在所给数据的范围外,此时我们的结果就会出现较为大的偏差。 而用最小二乘法的数据拟合方法就不受数据范围的影响,但是不方便的地方在于函数模型的选取,我们多数时候无法确定函数类型。 下面是我的代码与运行结果 #include class Point //Point类的声明 { public: //外部接口 Point(float xx=0, float yy=0) {X=xx;Y=yy;} float GetX() {return X;} float GetY() {return Y;} friend void linefit(Point l_point[], int n_point); private: float X,Y; }; void linefit(Point l_point[],int n_point) //友元函数体 { float av_x,av_y; float L_xx,L_yy,L_xy; av_x=0; av_y=0; L_xx=0; L_yy=0; L_xy=0; for(int i=0;i for(int i=0;i cout<<\"This line can be fitted by y=ax+b.\"< cout<<\"请输入坐标点个数:\"< double point[100][2]; cout<<\"请输入坐标:\"< double f=0,Lu=1; for(int i=0;i Lu*=(xx-point[j][0])/(point[i][0]-point[j][0]); } Lu=Lu*point[i][1]; f=f+Lu; Lu=1; } cout<<\"拉格朗日插值法算出的结果为:\"; cout<<\"f(x)的值为:\"< cout<<\"数据拟合方法算出的结果为:\"; cout<<\"f(x)的值为:\"< 因篇幅问题不能全部显示,请点此查看更多更全内容