合肥工业大学 计算机专业 计算方法实验报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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(tempx[N]){

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;

相关文档
最新文档