您的当前位置:首页正文

数值分析课程设计

2020-09-28 来源:华佗小知识
 数值分析课程设计

——计算机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 #include #include #include #include using namespace std; double ra,rb;

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;iav_x+=l_point[i].X/n_point; av_y+=l_point[i].Y/n_point; }

for(int i=0;iL_xx+=(l_point[i].X-av_x)*(l_point[i].X-av_x); L_yy+=(l_point[i].Y-av_y)*(l_point[i].Y-av_y); L_xy+=(l_point[i].X-av_x)*(l_point[i].Y-av_y); }

cout<<\"This line can be fitted by y=ax+b.\"<cout<<\" b=\"<int main() {

cout<<\"请输入坐标点个数:\"<>n;

double point[100][2];

cout<<\"请输入坐标:\"<cin>>point[i][0]>>point[i][1]; cout<<\"计算f(x)请输入x:\"<>xx;

double f=0,Lu=1; for(int i=0;ifor(int j=0;jif(j==i) continue;

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)的值为:\"<l_p[5]={Point(x[0],y[0]),Point(x[1],y[1]),Point(x[2],y[2]),Point(x[3],y[3]),Point(x[4],y[4])}; linefit(l_p,5);

cout<<\"数据拟合方法算出的结果为:\"; cout<<\"f(x)的值为:\"<return 0; }

因篇幅问题不能全部显示,请点此查看更多更全内容