当前位置:文档之家› 气温变化趋势曲线

气温变化趋势曲线

D2=0.000079*Sheet1!A2*Sheet1!A2*Sheet1!A2*Sheet1!A2*Sheet1!A2-0.003497*Sheet1!A2*Sheet1!A2*Sheet1!A2*Sheet1!A2+0.034939*Sheet1!A2*Sheet1!A2*Sheet1!A2+0.169372*Sheet1!A2*Sheet1!A2-1.862502*Sheet1!A2+20.500366
为了使报告清晰明了,程序的源代码附录在本课程设计报告的最后。
程序运行结果:
2)然后将所下载的数据填入到Excel表格中:
3)分别在3、4、5列第二格中输入公式:
C2=-0.000001*Sheet1!A2*Sheet1!A2*Sheet1!A2*Sheet1!A2*Sheet1!A2*Sheet1!A2+0.000134*Sheet1!A2*Sheet1!A2*Sheet1!A2*Sheet1!A2*Sheet1!A2-0.004772*Sheet1!A2*Sheet1!A2*Sheet1!A2*Sheet1!A2+0.047766*Sheet1!A2*Sheet1!A2*Sheet1!A2+0.117442*Sheet1!A2*Sheet1!A2-1.812578*Sheet1!A2+20.525732
{
k=i;
for(j=i+1;j<=n-1;j++)
if(fabs(*(c+j*(n+1)+i))>(fabs(*(c+k*(n+1)+i))))k=j;
if(k!=i)
for(j=i;j<=n;j++)
{
p=*(c+i*(n+1)+j);
*(c+i*(n+1)+j)=*(c+k*(n+1)+j);
2、利用不同的工具,可以实现不同精度和形式的拟合曲线,比如在Excel中就可以拟合出指数等其他形式的曲线,而且多项式能够拟合出的,系统默认的最高次是6次。而通过编程基本上可以拟合出任何高次多项式函数,当然也可以拟合出其他函数形式的的曲线。
3、在数据处理中,因为涉及到精确性、以及误差处理,有时候不同的误差处理方式可能会导致结果的误差扩张,最终得到错误的结果!在本次课程设计中,在求多项式的系数时,我采用的是float类型的数据,我也尝试用double类型的数据进行数据处理,发现最终的结果并没有引起太大的误差。所以综合考虑之后我用了float类型数据,一方面对于Excel中的精确度来说,这个精度已经足够了。另外,毕竟不是需要高精度的计算采用过于精确地计算过程反而会使结果不能反映真实情况!
f(t)=0.000079*t5-0.003497*t4+0.034939*t3+0.169372*t2-1.862502*t+20.500366
9)最后得到的曲线截图(由于4点的时候温度最低,我将Y轴与X轴的交叉交叉在4点时刻):
四、算法分析
已知数据对(xj,yj)(j=1,2,…,n),求多项式P(x)=a0x0+a1x1+…+amxm(m<n),使得Φ(a0,a1,,…,am)=∑nj=1(∑mi=0aixij-yj)2为最小。注意到此时ψ(x)=xk,多项式系数a0,a1,,…,am满足下面的线性方程组:
*(c+k*(n+1)+j)=p;
}
for(j=i+1;j<=n-1;j++)
{
p=(*(c+j*(n+1)+i))/(*(c+i*(n+1)+i));
for(t=i;t<=n;t++)
二、课程设计任务与要求:
课程设计题目:气温变化趋势曲线
【问题描述】
上网下载自己家乡所在城市某一天天气预报中的气温数据(24小时,每小时一个数据),然后采用最小二乘拟合的思想和算法求解上述气温变化的趋势曲线。(需要认真观察数据,提出数据变化曲线的函数形式,建议从最低气温时间开始。)
【实现要求】
1、在处理每个题目时,要求分别从数据处理阶段和程序设计阶段两个主要阶段实现课程设计,详细的通过文字以及插图等形式,按需求分析、数据处理、算法设计、代码、计算结果和程序执行的截图等若干步骤完成题目,最终写出完整的分析报告。前期准备工作完备与否直接影响到后序上机调试工作的效率。在程序设计阶段应尽量利用已有的标准函数,加大代码的重用率。
,c[6],c[5],c[4],c[3],c[2],c[1],c[0]);
}
void Approx(float x[],float y[],int m,int n,float a[])
{
int i,j,t;
float *c=new float[(n+1)*(n+2)];
float power(int,float);
2)由于方程中的系数矩阵是对称正定的且只有2m+1元素不同,所以可以采用其他方法(改进的平方根法)求解此方程。
五、课程设计心得
1、在对离散的点进行拟合的时候,并不是使得多项式的次数越高越好,比如程序中我算到6次多项式,这个时候就会看到拟合出来的曲线与源数据之间的误差越来越大!所以必须找到一个最合适、最逼近原始离散数据点的曲线,而这就必须要拟合求出3个以上的N次多项式,然后还要将这些你喝的曲线花在同一个表中,仔细观察,才能得到最适合的曲线拟合公式!
21.1
23.9
28.4
30.7
【数据处理概要】
1、由于在两端取的是同一个时刻,但不同的天对应相同的时刻,温度是不同的,所以在表格中12点对应有两个温度。而且由于是拟合连续光滑的无线,所以这个数据对于本问题的求解是没有影响的。
2、画出的曲线X轴和Y轴的交点设置在4点的时候,因为这时候的气温是最低的。
for(j=0;j<=m-1;j++)
*(c+i*(n+2)+n+1)+=y[j]*power(i,x[j]);
}
ColPivot(c,n+1,a);
delete c;
}
void ColPivot(float *c,int n,float x[])
{
int i,j,t,k;
float p;
for(i=0;i<=n-2;i++)
Approx(x,y,25,6,c);//计算6此多项式的待定系数
for(i=0;i<=6;i++)
printf("c[%d]=%f\n",i,c[i]);
printf("拟合多项式为:\nf(t)=(%f)*t*t*t*t*t*t+(%f)*t*t*t*t*t+(%f)*t*t*t*t+(%f)*t*t*t+(%f)*t*t+(%f)*t+(%f)\n"
float y[25]={29.5,30.4,31,31.2,30.1,28.5,27,25.2,24.1,22.6,21.6,20.5,19.7,19,18.4
,18.2,17.8,17.9,17.9,18.8,21.1,23.9,28.4,30.7,32.6};//22个时刻所对应的用水率
Approx(x,y,25,4,a);//计算4此多项式的待定系数
void gongLv();
void Approx(float[],float[],int,int,float[]);
void main()
{
int i;
float a[5],b[6],c[7];//多项式的待定系数个数
float x[25]={12,13,14,15,16,17,18,19,20,21,22,23,0,1,2,3,4,5,6,7,8,9,10,11,12};//22个时刻的值
4、在制作课程设计的时候,不同的设计方式也会影响到设计的效率,所以应该多向别人请教,不断完善自己的工作。
附录:程序源代码
#include<stdio.h>
#include<math.h>
#include<iostream.h>
void yongShuiLv();
void yongShuiLiang();
三、课程设计说明书
【需求分析】
从网上下载自己所在家乡的某一日(河北省邯郸市5月2日)的气温数据(原则上应为24个小时,24个数据),然后根据这一组数据,提出合适的数学模型(函数形式),用最小二乘拟合的思想和算法求解该曲线。
【数据下载】
我采用的数据是河北省邯郸市,在5月2日的气温数据:
为了便于比较,我将最终的设计图放到这里(由于刻度的规定不同,所以要注意刻度的标示!后面还根据设计流程附图):
for(i=0;i<=4;i++)
printf("a[%d]=%f\n",i,a[i]);
printf("拟合多项式为:\nf(t)=(%f)*t*t*t*t+(%f)*t*t*t+(%f)*t*t+(%f)*t+(%f)\n",a[4],a[3],a[2],a[1],a[0]);
Approx(x,y,25,5,b);//计算5此多项式的待定系数
for(i=0;i<=5;i++)
printf("b[%d]=%f\n",i,b[i]);
printf("拟合多项式为:\nf(t)=(%f)*t*t*t*t*t+(%f)*t*t*t*t+(%f)*t*t*t+(%f)*t*t+(%f)*t+(%f)\n",b[5],b[4],b[3],b[2],b[1],b[0]);
相关主题