气温变化趋势曲线
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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]);
二、课程设计任务与要求:
课程设计题目:气温变化趋势曲线
【问题描述】
上网下载自己家乡所在城市某一天天气预报中的气温数据(24小时,每小时一个数据),然后采用最小二乘拟合的思想和算法求解上述气温变化的趋势曲线。(需要认真观察数据,提出数据变化曲线的函数形式,建议从最低气温时间开始。)
【实现要求】
1、在处理每个题目时,要求分别从数据处理阶段和程序设计阶段两个主要阶段实现课程设计,详细的通过文字以及插图等形式,按需求分析、数据处理、算法设计、代码、计算结果和程序执行的截图等若干步骤完成题目,最终写出完整的分析报告。前期准备工作完备与否直接影响到后序上机调试工作的效率。在程序设计阶段应尽量利用已有的标准函数,加大代码的重用率。
2)由于方程中的系数矩阵是对称正定的且只有2m+1元素不同,所以可以采用其他方法(改进的平方根法)求解此方程。
五、课程设计心得
1、在对离散的点进行拟合的时候,并不是使得多项式的次数越高越好,比如程序中我算到6次多项式,这个时候就会看到拟合出来的曲线与源数据之间的误差越来越大!所以必须找到一个最合适、最逼近原始离散数据点的曲线,而这就必须要拟合求出3个以上的N次多项式,然后还要将这些你喝的曲线花在同一个表中,仔细观察,才能得到最适合的曲线拟合公式!
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++)
void ColPivot(float *,int,float[]);
for(i=0;i<=n;i++)
{
for(j=0;j<=n;j++)
{
*(c+i*(n+2)+j)=0;
for(t=0;t<=m-1;t++)
*(c+i*(n+2)+j)+=power(i+j,x[t]);
}
*(c+i*(n+2)+n+1)=0;
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此多项式的待定系数
,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);
5)将以上得到的3个多项式的图形画在Excel中(1散点图):
6)为了便于区分,上面的图形要经过一定的处理,处理后结果为:
7)经过仔细的比较之后可以知道,6次多项式就和原始数据的差距大了,误差超出可接受范围!4次多项式和5次多项式都比较逼近原始数据,但仔细观察会发现,5此多项式更加逼近原始数据!
8)根据以上的综合分析可以确定拟合函数是一个5次多项式:
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个时刻的值
3、函数形式采用多项式,最高项次数由程序计算得出3-4组数据(即3-4组不同最高次幂的待定系数),然后再Excel中将这3-4个多项式方程的曲线画出来,取最为逼近各整点时刻的气温曲线。
【详细设计】
1)因为这个设计中要先算出几组多项式的系数,我计算的是3组,分别是6次多项式、5次多项式和4次多项式。
程序源代码:
4、在制作课程设计的时候,不同的设计方式也会影响到设计的效率,所以应该多向别人请教,不断完善自己的工作。
附录:程序源代码
#include<stdio.h>
#include<math.h>
#include<iostream.h>
void yongShuiLv();
void yongShuiLiang();
21.1
23.9
28.4
30.7
【数据处理概要】
1、由于在两端取的是同一个时刻,但不同的天对应相同的时刻,温度是不同的,所以在表格中12点对应有两个温度。而且由于是拟合连续光滑的无线,所以这个数据对于本问题的求解是没有影响的。
2、画出的曲线X轴和Y轴的交点设置在4点的时候,因为这时候的气温是最低的。
2、设计的题目要求达到一定工作量,并具有一定的深度和难度。
3、程序设计语言推荐使用C/C++,程序书写规范,源程序需加必要的注释;
4、每位同学需提交可独立运行的程序;
5、每位同学需独立提交设计报告书(每人一份),要求编排格式统一、规范、内容充实;
6、课程设计实践作为培养学生动手能力的一种手段,单独考核。
┌s0s1…sm┐┌a0┐┌T0┐
│s1s2…sm+1││a1││T1│
│┆┆┆││┆│=│┆│
└smsm+1…s2m┘└am┘└Tm┘
其中
sk=∑nj=1xkj(k=0,1,2,…,2m)
Tk=∑nj=1yixkj(k=0,1,2,…,m)
然后只要调用解线性方程组的函数程序即可。
1)方程中的系数矩阵当阶数较大时是坏条件的,会产生很大的误差;
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满足下面的线性方程组:
{
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中的精确度来说,这个精度已经足够了。另外,毕竟不是需要高精度的计算采用过于精确地计算过程反而会使结果不能反映真实情况!
为了使报告清晰明了,程序的源代码附录在本课程设计报告的最后。
程序运行结果:
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
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此多项式的待定系数
三、课程设计说明书
【需求分析】
从网上下载自己所在家乡的某一日(河北省邯郸市5月2日)的气温数据(原则上应为24个小时,24个数据),然后根据这一组数据,提出合适的数学模型(函数形式),用最小二乘拟合的思想和算法求解该曲线。
【数据下载】
我采用的数据是河北省邯郸市,在5月2日的气温数据:
为了便于比较,我将最终的设计图放到这里(由于刻度的规定不同,所以要注意刻度的标示!后面还根据设计流程附图):
一、课程设计目的:
1.训练学生灵活应用所学数值分析知识,独立完成问题分析,结合数值分析理论知识,编写程序求解指定问题。
2.初步掌握解决实际问题过程中的对问题的分析、系统设计、程序编码、测试等基本方法和技能;
3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力;
4.训练用数值分析的思想方法和编程应用技能模拟解决实际问题,巩固、深化学生的理论知识,提高学生对数值分析的认知水平和编程水平,并在此过程中培养他们严谨的科学态度和良好的工作作风
*(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++)
E2=0.001037*Sheet1!A2*Sheet1!A2*Sheet1!A2*Sheet1!A2-0.056838*Sheet1!A2*Sheet1!A2*Sheet1!A2+0.93784*Sheet1!A2*Sheet1!A2-4.185178*Sheet1!A2+21.751972
4)根据以上公式填满所需的数据:
整点的数据信息为:
时刻(h)
12
13
14
15
16
17
18
19
20
21
22
23
气温(℃)
29.5
32.6
3百度文库.4
31.0
31.2
30.1
28.5
27.0
25.2
24.1
22.6
21.6
20.5
时刻(h)
0
1
2
3
4
5
6
7
8
9
10
11
气温(℃)
19.7
19.0
18.4
18.2
17.8
17.9
17.9
18.8
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"
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
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]);
二、课程设计任务与要求:
课程设计题目:气温变化趋势曲线
【问题描述】
上网下载自己家乡所在城市某一天天气预报中的气温数据(24小时,每小时一个数据),然后采用最小二乘拟合的思想和算法求解上述气温变化的趋势曲线。(需要认真观察数据,提出数据变化曲线的函数形式,建议从最低气温时间开始。)
【实现要求】
1、在处理每个题目时,要求分别从数据处理阶段和程序设计阶段两个主要阶段实现课程设计,详细的通过文字以及插图等形式,按需求分析、数据处理、算法设计、代码、计算结果和程序执行的截图等若干步骤完成题目,最终写出完整的分析报告。前期准备工作完备与否直接影响到后序上机调试工作的效率。在程序设计阶段应尽量利用已有的标准函数,加大代码的重用率。
2)由于方程中的系数矩阵是对称正定的且只有2m+1元素不同,所以可以采用其他方法(改进的平方根法)求解此方程。
五、课程设计心得
1、在对离散的点进行拟合的时候,并不是使得多项式的次数越高越好,比如程序中我算到6次多项式,这个时候就会看到拟合出来的曲线与源数据之间的误差越来越大!所以必须找到一个最合适、最逼近原始离散数据点的曲线,而这就必须要拟合求出3个以上的N次多项式,然后还要将这些你喝的曲线花在同一个表中,仔细观察,才能得到最适合的曲线拟合公式!
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++)
void ColPivot(float *,int,float[]);
for(i=0;i<=n;i++)
{
for(j=0;j<=n;j++)
{
*(c+i*(n+2)+j)=0;
for(t=0;t<=m-1;t++)
*(c+i*(n+2)+j)+=power(i+j,x[t]);
}
*(c+i*(n+2)+n+1)=0;
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此多项式的待定系数
,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);
5)将以上得到的3个多项式的图形画在Excel中(1散点图):
6)为了便于区分,上面的图形要经过一定的处理,处理后结果为:
7)经过仔细的比较之后可以知道,6次多项式就和原始数据的差距大了,误差超出可接受范围!4次多项式和5次多项式都比较逼近原始数据,但仔细观察会发现,5此多项式更加逼近原始数据!
8)根据以上的综合分析可以确定拟合函数是一个5次多项式:
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个时刻的值
3、函数形式采用多项式,最高项次数由程序计算得出3-4组数据(即3-4组不同最高次幂的待定系数),然后再Excel中将这3-4个多项式方程的曲线画出来,取最为逼近各整点时刻的气温曲线。
【详细设计】
1)因为这个设计中要先算出几组多项式的系数,我计算的是3组,分别是6次多项式、5次多项式和4次多项式。
程序源代码:
4、在制作课程设计的时候,不同的设计方式也会影响到设计的效率,所以应该多向别人请教,不断完善自己的工作。
附录:程序源代码
#include<stdio.h>
#include<math.h>
#include<iostream.h>
void yongShuiLv();
void yongShuiLiang();
21.1
23.9
28.4
30.7
【数据处理概要】
1、由于在两端取的是同一个时刻,但不同的天对应相同的时刻,温度是不同的,所以在表格中12点对应有两个温度。而且由于是拟合连续光滑的无线,所以这个数据对于本问题的求解是没有影响的。
2、画出的曲线X轴和Y轴的交点设置在4点的时候,因为这时候的气温是最低的。
2、设计的题目要求达到一定工作量,并具有一定的深度和难度。
3、程序设计语言推荐使用C/C++,程序书写规范,源程序需加必要的注释;
4、每位同学需提交可独立运行的程序;
5、每位同学需独立提交设计报告书(每人一份),要求编排格式统一、规范、内容充实;
6、课程设计实践作为培养学生动手能力的一种手段,单独考核。
┌s0s1…sm┐┌a0┐┌T0┐
│s1s2…sm+1││a1││T1│
│┆┆┆││┆│=│┆│
└smsm+1…s2m┘└am┘└Tm┘
其中
sk=∑nj=1xkj(k=0,1,2,…,2m)
Tk=∑nj=1yixkj(k=0,1,2,…,m)
然后只要调用解线性方程组的函数程序即可。
1)方程中的系数矩阵当阶数较大时是坏条件的,会产生很大的误差;
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满足下面的线性方程组:
{
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中的精确度来说,这个精度已经足够了。另外,毕竟不是需要高精度的计算采用过于精确地计算过程反而会使结果不能反映真实情况!
为了使报告清晰明了,程序的源代码附录在本课程设计报告的最后。
程序运行结果:
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
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此多项式的待定系数
三、课程设计说明书
【需求分析】
从网上下载自己所在家乡的某一日(河北省邯郸市5月2日)的气温数据(原则上应为24个小时,24个数据),然后根据这一组数据,提出合适的数学模型(函数形式),用最小二乘拟合的思想和算法求解该曲线。
【数据下载】
我采用的数据是河北省邯郸市,在5月2日的气温数据:
为了便于比较,我将最终的设计图放到这里(由于刻度的规定不同,所以要注意刻度的标示!后面还根据设计流程附图):
一、课程设计目的:
1.训练学生灵活应用所学数值分析知识,独立完成问题分析,结合数值分析理论知识,编写程序求解指定问题。
2.初步掌握解决实际问题过程中的对问题的分析、系统设计、程序编码、测试等基本方法和技能;
3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力;
4.训练用数值分析的思想方法和编程应用技能模拟解决实际问题,巩固、深化学生的理论知识,提高学生对数值分析的认知水平和编程水平,并在此过程中培养他们严谨的科学态度和良好的工作作风
*(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++)
E2=0.001037*Sheet1!A2*Sheet1!A2*Sheet1!A2*Sheet1!A2-0.056838*Sheet1!A2*Sheet1!A2*Sheet1!A2+0.93784*Sheet1!A2*Sheet1!A2-4.185178*Sheet1!A2+21.751972
4)根据以上公式填满所需的数据:
整点的数据信息为:
时刻(h)
12
13
14
15
16
17
18
19
20
21
22
23
气温(℃)
29.5
32.6
3百度文库.4
31.0
31.2
30.1
28.5
27.0
25.2
24.1
22.6
21.6
20.5
时刻(h)
0
1
2
3
4
5
6
7
8
9
10
11
气温(℃)
19.7
19.0
18.4
18.2
17.8
17.9
17.9
18.8
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"
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