计算方法-实习1.docx
《计算方法-实习1.docx》由会员分享,可在线阅读,更多相关《计算方法-实习1.docx(3页珍藏版)》请在冰点文库上搜索。
实习三之实习报告
一、题目
某疾病发生率y‰和年龄段x(每五年为一段,例如0-5岁为第一段,6-10岁为第二段,……)之间有形如y=aebx的关系。
试根据观测得到的如下数据表,用最小二乘法确定式中的参数a和b,并计算相应的均方误差与最大偏差。
X
1
2
3
4
5
6
7
8
9
y
0.898
2.38
3.07
1.84
2.02
1.94
2.22
2.77
4.02
X
10
11
12
13
14
15
16
17
18
19
y
4.76
5.46
6.53
10.9
16.5
22.5
35.7
50.6
61.6
81.8
二、解题的主要思想
本题采用的是最小二乘法原理对一系列的数据进行拟合,但由于此题若将其化为线性方程求解会造成均方误差较大,因此采用非线性方法求解。
由于所求得的非线性方程较为复杂,求导困难,可采用弦割法求解。
三、计算结果
a=0.236882,b=0.308978
s=8.655291,max=3.125623
其中s为均方误差,max为最大偏差
四、结果分析
从本次实习结果可以看出,本组数据进行指数型拟合效果并不是很好,其均方误差达8.655291,但从计算方法角度看,采用解非线性方程的方法在一定程度上提高了曲线的拟合程度。
虽然如此,在求解非线性方程组是由于弦割法本身存在精度不够高的缺点,只是结果精度也不够高,但相比于将非线性方程转化为线性方程的方法,无论是均方差还是最大偏差,其都有很大的改善。
因此,本次计算结果能符合要求。
五、源程序
#include
#include
#include
intmain(void){
doublex[19],y[19],a,b,m,n,c,d,s,max,s1[19],tm,tn,m1,n1,h1,k1,l1;
inti,j;
FILE*fp1,*fp2;
doublet(doubleg,doublex[],doubley[]);
if((fp1=fopen("f.txt","r+"))==NULL){
printf("Fileopenerror!
\n");
return0;
}
if((fp2=fopen("f2.txt","w+"))==NULL){
printf("Fileopenerror!
\n");
return0;
}
i=0;
while(!
feof(fp1)){
fscanf(fp1,"%lf",&x[i]);
fscanf(fp1,"%lf",&y[i]);
i++;
}
printf("Entertwonumber:
\n");
scanf("%lf%lf",&m,&n);
while(fabs(m-n)>0.00001){
b=m-t(m,x,y)*(m-n)/(t(m,x,y)-t(n,x,y));
n=m;
m=b;
}
c=d=0;
for(i=0;i<=18;i++){
c=c+y[i]*exp(m*x[i]);
d=d+exp(m*x[i]*2);
}
a=c/d;
fprintf(fp2,"a=%f,b=%f\n",a,m);
s=0;
for(i=0;i<=18;i++){
s1[i]=a*exp(m*x[i])-y[i];
s=s+s1[i]*s1[i];
}
max=s1[0];
for(i=1;i<=18;i++)
if(s1[i]>max)
max=s1[i];
s=sqrt(s);
fprintf(fp2,"s=%f,max=%f\n",s,max);
if(fclose(fp1)){
printf("Cannotclosethefile!
\n");
return0;
}
if(fclose(fp2)){
printf("Cannotclosethefile!
\n");
return0;
}
return0;
}
doublet(doubleg,doublex[],doubley[])
{
inti;
doublem,n,h,l,k,r;
m=h=l=k=0;
for(i=0;i<=18;i++){
n=exp(g*x[i]);
m=m+n*y[i];
h=h+x[i]*n*n;
l=l+x[i]*y[i]*n;
k=k+n*n;
}
r=m*h/k-l;
returnr;
}