数值分析课程设计.docx
《数值分析课程设计.docx》由会员分享,可在线阅读,更多相关《数值分析课程设计.docx(15页珍藏版)》请在冰豆网上搜索。
数值分析课程设计
淮海工学院计算机工程学院
课程设计报告书
课程名:
《数值分析》
题目:
数值分析课程设计
班级:
学号:
姓名:
数值分析课程设计
课程设计要求
1、研究第一导丝盘速度y与电流周波x的关系。
2、数据拟合问题运用样条差值方法求出温度变化的拟合曲线。
课程设计目的
1、通过编程加深对三次样条插值及曲线拟合的最小二乘法的理解;
2、学习用计算机解决工程问题,主要包括数据处理与分析。
课程设计环境
visualC++6.0
课程设计内容
课程设计题目1:
合成纤维抽丝工段中第一导丝盘的速度对丝的质量有很大的影响,第一丝盘的速度和电流周波有重要关系。
下面是一组实例数据:
X
49.2
50.0
49.3
49.0
49.0
49.5
49.6
49.9
50.2
50.2
y
16.7
17.0
16.8
16.6
16.7
16.8
16.9
17.0
17.0
17.1
其中x代表电流周波,y代表第一导丝盘的速度
课程设计题目3:
在天气预报网站上获得你家乡所在城市当天24小时温度变化的数据,认真观察分析其变化趋势,在此基础上运用样条差值方法求出温度变化的拟合曲线。
然后将该函数曲线打印出来并与原来的温度变化数据形成的曲线进行比较,给出结论。
写出你研究的心得体会。
课程设计步骤
1、利用最小二乘法写出题1的公式和算法;
2、利用excel表格画出数据拟合后题1的图像;
3、在VisualC++6.0中编写出相应的代码;
4、搜索11月12日南通当地一天的温度变化数据;
5、在VisualC++6.0中编写出相应的代码;
6、利用excel表格画出数据拟合后题3的图像
课程设计结果
课程设计题目1
数值拟合
解:
根据所给数据,在excel窗口运行:
x=[49.250.049.349.049.049.549.849.950.250.2]
y=[16.717.016.816.616.716.816.917.017.017.1]
课程设计题目3
数据为:
X=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23];
Y=[12,12,11,12,12,12,12,12,13,15,16,17,17,18,17,17,17,16,15,15,15,15,14,14];
源代码为:
第一题:
#include
#include"math.h"
usingnamespacestd;
//doublex[100],y[100];
intmain(){
inti;
doublek,b;
doublesum1=0,sum2=0,sum3=0,sum4=0;
doublex[10]={49.2,50.0,49.3,49.0,49.0,49.5,49.8,49.9,50.2,50.2};
doubley[10]={16.7,17.0,16.8,16.6,16.7,16.8,16.9,17.0,17.0,17.1};
for(i=0;i<10;i++){
sum1+=x[i]*y[i];
sum2+=x[i];
sum3+=y[i];
sum4+=x[i]*x[i];
}
//cout<k=sum1/sum4;
b=(sum3-sum2*k)/10;
cout<<"k="<cout<<"y="<doublestart=x[0],end=x[9],result;
for(doublej=start;jresult=k*j+b;
cout<<"x="<}
return0;
}
第三题:
#include
#include"math.h"
#include
usingnamespacestd;
doublea[100],b[100],c[100],d[100];
doubleaa[100],bb[100],cc[100],dd[100],M[100];
voidtranslate(doublex[],doubley[],intn){//根据输入数据x[]和y[]求出三对角矩阵
doubleh[100],f[100];
inti,j;
intflag=1;
intk;
floats;
for(j=0;jh[j]=x[j+1]-x[j];
}
for(j=0;jf[j]=(y[j+1]-y[j])/h[j];
}
for(j=1;j<=n-2;j++){
a[j]=h[j-1]/(h[j-1]+h[j]);
c[j]=h[j]/(h[j-1]+h[j]);
d[j]=6*(f[j]-f[j-1])/(h[j-1]+h[j]);
}
cout<<"a[i]"<<"";
for(i=1;i<=n-2;i++){
cout<:
fixed)<cout<}
cout<cout<<"c[i]"<<"";
for(i=1;i<=n-2;i++){
cout<:
fixed)<cout<}
cout<cout<<"d[i]"<<"";
for(i=1;i<=n-2;i++){
cout<:
fixed)<cout<}
cout<cout<<"b[i]"<<"";
for(i=1;i<=n-1;i++){
b[i]=2;
cout<
}
cout<for(i=0;iaa[i]=a[i+1];
cc[i]=c[i+1];
dd[i]=d[i+1];
}
for(j=0;jbb[j]=b[j+1];
}
//用追赶法求三对角矩阵
for(k=0;k//注意此处不用循环,与高斯消去法不同。
因为存在许多零
bb[k+1]=bb[k+1]-(aa[k+1]/bb[k])*cc[k];
dd[k+1]=dd[k+1]-(aa[k+1]/bb[k])*dd[k];
//a[i]=0.000000;
}
M[n-2]=dd[n-2]/bb[n-2];
for(i=n-3;i>=0;i--)
{
s=dd[i];
s=s-cc[i]*M[i+1];
//此处也不用循环
M[i]=s/bb[i];
}
cout<<"此方程的解为:
"<for(i=0;i{
cout<<"M["<
:
showpoint)<}
for(k=n-1;k>=0;k--){//使数组下标从0开始M[0]=M[n-1]=0;
if(k==n-1||k==0)
M[k]=0;
else
M[k]=M[k-1];
}
for(i=0;icout<}
cout<//输出三次样条差值函数
for(j=0;jif(j==0){
cout<<"当"<<"("<"<cout<<"S(x)="<<<"+"<<(y[j+1]-(M[j+1]*h[j]*h[j])/6.0)/h[j]<<"*(x-"<}
elseif(j==n-2){
cout<<"当"<<"("<"<cout<<"S(x)="<<<"+"<<(y[j+1]-(M[j+1]*h[j]*h[j])/6.0)/h[j]<<"*(x-"<}
else{
cout<<"当"<<"("<"<cout<<"S(x)="<<<"+"<<(y[j+1]-(M[j+1]*h[j]*h[j])/6.0)/h[j]<<"*(x-"<}
}
}
intmain(){
doublex[100],y[100];
intn;
cout<<"请输入数据的个数n"<cin>>n;
cout<<"请输入x[i]"<for(inti=0;i<=n-1;i++){
cin>>x[i];
}
cout<<"请输入y[j]"<for(intj=0;j<=n-1;j++){
cin>>y[j];
}
translate(x,y,n);
//run(a,b,c,d,n);
return0;
}
运行结果为:
图一
图二
图三
图四
图五
图六
图七
图八
课程设计体会