当前位置:文档之家› 数值分析课设

数值分析课设

江苏海洋大学软件工程系实验报告书课程名:《计算方法与实习》题目:计算实习班级:学号:姓名:一、课程设计目的了解数值计算基本原理,熟悉数值计算的相关算法,并运用适当的算法解决实际问题。

二、课程设计内容在天气预报网站上获得你家乡所在城市当天24小时温度变化的数据,认真观察分析其变化趋势,在此基础上运用样条插值方法求出温度变化的三次样条插值曲线。

然后将该函数曲线打印出来并与原来的温度变化数据形成的曲线进行比较,给出结论。

写出你研究设计中的心得体会课程设计步骤1、利用最小二乘法写出题1的公式和算法;2、利用excel表格画出数据拟合后题1的图像;3、在Visual C++ 6.0中编写出相应的代码;4、搜索11月12日南通当地一天的温度变化数据;5、在Visual C++ 6.0中编写出相应的代码;6、利用excel表格画出数据拟合后题3的图像三、源程序#include<iomanip>#include"math.h"#include<iostream>using namespace std;double a[100],b[100],c[100],d[100];double aa[100],bb[100],cc[100],dd[100],M[100];void translate(double x[],double y[],int n){//根据输入数据x[]和y[]求出三对角矩阵double h[100],f[100];int i,j; int flag=1;int k; float s;for(j=0;j<n-1;j++){h[j]=x[j+1]-x[j];}for(j=0;j<n-1;j++){f[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<<setiosflags(ios::fixed)<<setprecision(5); cout<<a[i]<<" ";}cout<<endl;cout<<"c[i]"<<" ";for(i=1;i<=n-2;i++){cout<<setiosflags(ios::fixed)<<setprecision(5);cout<<c[i]<<" ";}cout<<endl;cout<<"d[i]"<<" ";for(i=1;i<=n-2;i++){cout<<setiosflags(ios::fixed)<<setprecision(4);cout<<d[i]<<" ";}cout<<endl;cout<<"b[i]"<<" ";for(i=1;i<=n-1;i++){b[i]=2;cout<<b[i]<<" ";}cout<<endl;for(i=0;i<n-2;i++){//使数组下标从0开始aa[i]=a[i+1];cc[i]=c[i+1];dd[i]=d[i+1];}for(j=0;j<n-1;j++){//使数组下标从0开始bb[j]=b[j+1];}//用追赶法求三对角矩阵for(k=0;k<n-2;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<<"此方程的解为:"<<endl;for(i=0;i<n-2;i++){cout<<"M["<<i+1<<"]="<<setiosflags(ios::showpoint)<<setprecision(4)<<M[i]<<endl;}for(k=n-1;k>=0;k--){//使数组下标从0开始M[0]=M[n-1]=0;if(k==n-1||k==0)M[k]=0;elseM[k]=M[k-1];}for(i=0;i<n;i++){cout<<M[i]<<" ";}cout<<endl;//输出三次样条差值函数for(j=0;j<n-1;j++){if(j==0){cout<<"当"<<"("<<x[j]<<"≤x≤"<<x[j+1]<<")"<<"时候:"<<endl;cout<<"S(x)="<<M[j+1]/(6*h[j])<<"*(x-"<<x[j]<<")^3"<<"+"<<(y[j]-(M[j]*h[j]* h[j])/6.0)/h[j]<<"*("<<x[j+1]<<"-x)"<<"+"<<(y[j+1]-(M[j+1]*h[j]*h[j])/6.0)/h[j]<<"*(x-"<<x[j]<<")"<<endl;}else if(j==n-2){cout<<"当"<<"("<<x[j]<<"≤x≤"<<x[j+1]<<")"<<"时候:"<<endl;cout<<"S(x)="<<M[j]/(6*h[j])<<"*("<<x[j+1]<<"-x)^3"<<"+"<<(y[j]-(M[j]*h[j]* h[j])/6.0)/h[j]<<"*("<<x[j+1]<<"-x)"<<"+"<<(y[j+1]-(M[j+1]*h[j]*h[j])/6.0)/h[j]<<"*(x-"<<x[j]<<")"<<endl;}else{cout<<"当"<<"("<<x[j]<<"≤x≤"<<x[j+1]<<")"<<"时候:"<<endl;cout<<"S(x)="<<M[j]/(6*h[j])<<"*("<<x[j+1]<<"-x)^3"<<"+"<<M[j+1]/(6*h[j])<< "*(x-"<<x[j]<<")^3"<<"+"<<(y[j]-(M[j]*h[j]*h[j])/6.0)/h[j]<<"*("<<x[j+1]<<" -x)"<<"+"<<(y[j+1]-(M[j+1]*h[j]*h[j])/6.0)/h[j]<<"*(x-"<<x[j]<<")"<<endl;}}}int main(){double x[100],y[100];int n;cout<<"请输入数据的个数n"<<endl; cin>>n;cout<<"请输入x[i]"<<endl;for(int i=0;i<=n-1;i++){cin>>x[i];}cout<<"请输入y[j]"<<endl; for(int j=0;j<=n-1;j++){ cin>>y[j];}translate(x,y,n);// run(a,b,c,d,n);return 0;}四、实验结果这是输入对应的数据:这是真实数据的气温图:这是拟合完的气温图:五、心得体会利用不同的工具,可以实现不同精度和形式的拟合曲线,比如在Excel中就可以拟合出指数等其他形式的曲线,而且多项式能够拟合出的,系统默认的最高次是6次。

相关主题