合肥工业大学 计算机专业 计算方法实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
合肥工业大学计算机与信息学院
实验报告
课程:计算方法
专业班级:
学号:
姓名:
Java界面
其实都不难按照程序流程图就可以完成了
实验一 插值与拟合
一、实验目的
(1) 明确插值多项式和分段插值多项式各自的优缺点;
(2) 编程实现三次样条插值算法,分析实验结果体会高次插值产生的龙格现象;
(3) 理解最小二乘拟合,并编程实现线性拟合,掌握非线性拟合转化为线性拟合的方法
(4) 运用常用的插值和拟合方法解决实际问题。
二、实验内容
(1)对于f(x)=1/(1+x*x)实现三次样条插值
(2)实现最小二乘法的直线拟合 数据如下:
j x
165 123 150 123 141 j y
187 126 172 125 148
三、基本原理(计算公式)
(1)三次样条插值在每个内节点上具有2阶导数。
(2)最小二乘法拟合直线为y=a+bx ,而a ,b 有如下等式(N 为给出的数据点的总个数) i i y x b N =+∑a ; ∑∑∑=+i i i i y x x b x 2a
四、算法设计与实现(流程图,关键点)
最小二乘法直线拟合:输入数据后,按照公式计算a,b。用得到的拟合直线计算预测点的近似函数值。
五、输入与输出
(1)三次样条插值
输入:区间长度,n+1个数据点,预测点
输出:预测点的近似函数值,精确值,及误差
(2)最小二乘法直线拟合
输入:n个数据点,预测点
输出:预测点的近似函数值
六、结果讨论和分析
代码
三次样条插值
#include
#include
#define N 10
using namespace std;
double u0(double x){
return (x-1)*(x-1)*(2*x+1);
}
double u1(double x){
return x*x*(3-2*x);
}
double v0(double x){
return x*(x-1)*(x-1);
}
double v1(double x){
return x*x*(x-1);
}
double s3(double x,double y,double y1,double m,double m1,double h){ return u0(x)*y+u1(x)*y1+h*v0(x)*m+h*v1(x)*m1;
}
double f(double x){
return 1/(1+x*x);
}
int main(){
ifstream fin;
fin.open("E:\\t.txt");
if(!fin){
cout<<"error opening input stream"< system("pause"); return 0; } double x[N+1],y[N+1],m[N+1],A[N],B[N],C[N]; double h[N]; double a[N],b[N]; double f0,fn; double temp; int i; for(i=0;i<=N;i++){ fin>>x[i]>>y[i]; } fin>>f0>>fn; h[0]=x[1]-x[0]; for(i=1;i h[i]=x[i+1]-x[i]; a[i]=h[i-1]/(h[i-1]+h[i]); b[i]=3*((1-a[i])*(y[i]-y[i-1])/h[i-1]+a[i]*(y[i+1]-y[i])/h[i]); } m[1]=b[1]-(1-a[1])*f0; m[N-1]=b[N-1]-a[N-1]*fn; for(i=2;i m[i]=b[i]; } for(i=1;i B[i]=2; C[i]=a[i]; } for(i=2;i A[i]=1-a[i]; } C[1]=C[1]/B[1]; m[1]=m[1]/B[1]; double t; for(i=2;i!=N-2;i++){ t=B[i]-C[i-1]*A[i]; C[i]=C[i]/t; m[i]=(m[i]-m[i-1]*A[i])/t; } m[N-1]=(m[N-1]-m[N-2]*A[N-1])/(B[N-1]-C[N-2]*A[N-1]); for(i=N-2;i>0;i--){ m[i]=m[i]-C[i]*m[i+1]; } cout<<"please:(输入插值节点在"< while(cin>>temp){ double tt=temp; if(temp cout<<"插值节点为"< continue; } for(i=1;i<=N;i++){ if(temp } temp=(temp-x[i-1])/h[i-1]; temp=s3(temp,y[i-1],y[i],m[i-1],m[i],h[i-1]); cout<<"插值节点为"< } system("pause"); fin.close(); return 0; } 最小二乘法的直线拟合 #include #include #define n 5 using namespace std; double sum(double x[],int k){ int i; double sum=0; for(i=0;i sum=sum+x[i]; return sum; } double sum2(double x[],int k){ int i; double sum=0; for(i=0;i sum=sum+x[i]*x[i]; return sum; } double sumxy(double x[],double y[],int k){ int i;