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

合肥工业大学

计算机与信息学院

实验报告

课 程:计算方法

专业班级:

学 号:

姓 名:

Java界面

其实都不难按照程序流程图就可以完成了

实验一插值与拟合

实验目的

明确插值多项式和分段插值多项式各自的优缺点;

编程实现三次样条插值算法,分析实验结果体会高次插值产生的龙格现象;

理解最小二乘拟合,并编程实现线性拟合,掌握非线性拟合转化为线性拟合的方法

运用常用的插值和拟合方法解决实际问题。

实验内容

(1)对于f(x)=1/(1+x*x)实现三次样条插值

(2)实现最小二乘法的直线拟合

数据如下:

165

123

150

123

141

187

126

172

125

148

基本原理(计算公式)

(1)三次样条插值在每个内节点上具有2阶导数。

最小二乘法拟合直线为y=a+bx,而a,b有如下等式(N为给出的数据点的总个数)

四、算法设计与实现(流程图,关键点)

最小二乘法直线拟合:输入数据后,按照公式计算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<

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<

whi

你可能感兴趣的:(java实验报告合肥工业大学)