完整word版数值计算方法实验报告含所有.docx
《完整word版数值计算方法实验报告含所有.docx》由会员分享,可在线阅读,更多相关《完整word版数值计算方法实验报告含所有.docx(30页珍藏版)》请在冰豆网上搜索。
完整word版数值计算方法实验报告含所有
本科实验报告
课程名称:
计算机数值方法
实验项目:
计算机数值方法实验
实验地点:
虎峪校区致远楼B401
专业班级:
软件学院1217班学号:
201200xxxx
学生姓名:
xxx
指导教师:
2014年5月21日
太原理工大学学生实验报告
学院名称
软件学院
专业班级
1217班
学号
学生姓名
xx
实验日期
2014.05.21
成绩
课程名称
数值计算方法
实验题目
实验一方程求解
一、实验目的和要求
熟悉使用、迭代法、牛顿法、割线法等方法对给定的方程进行根的求解。
选择上述方法中的两种方法求方程:
二分法f(x)=x3+4x2-10=0在[1,2]内的一个实根,且要求满足精度|x*-xn|〈0.5×10-5
二、主要设备
笔记本HPProBook6470b一台
编译软件:
VC++6。
0
三、实验内容和原理
函数f(x)在区间(x,y)上连续,先在区间(x,y)确定a与b,若f(a),f(b)异号,说明在区间(a,b)内存在零点,然后求f[(a+b)/2]。
假设F(a)<0,F(b)>0,a
1如果f[(a+b)/2]=0,该点即为零点;
2如果f[(a+b)/2]〈0,则区间((a+b)/2,b)内存在零点,(a+b)/2≥a;
3如果f[(a+b)/2]〉0,则区间(a,(a+b)/2)内存在零点,(a+b)/2≤b;
返回①重新循环,不断接近零点。
通过每次把f(x)的零点所在区间收缩一半的方法,使区间内的两个端点逐步逼近函数零点,最终求得零点近似值.
四、操作方法与实验步骤
1。
二分法:
#include
#include〈stdlib。
h〉
#includeh〉intmain(){doublea=1。0,b=2.0;doublex,s;printf("An\t\tBn\t\tF(Xn)\n”);while(1){x=(a+b)/2;s=pow(x,3)+4*x*x-10;if(—0.000005〈s&&s<0.000005){break;}elseif(s<0){a=x;}elseif(s>0){b=x;}printf(”%f\t%f\t%f\n",a,b,s);}printf("X的值为:%f\n”,x);printf(”误差:\t%f\n",s);return0;}2。割线法:#include”stdio.h"#include”math。h"intmain(){floatc,a=1.0,b=2。0;printf(”每次得到的X的近似值:\n”);while(1){c=b—(b*b*b+4*b*b-10)*(b—a)/(b*b*b+4*b*b—(a*a*a+4*a*a));if(fabs(b—c)<0。5*0。00001)break;b=c;printf(”%f\n",b);}printf(”X的值为:%f\n”,c);} 五、实验结果与分析二分法割线法分析:由程序知,使用二分法和割线法均能计算出方程的根,但利用割线法要比二分法计算的次数少,并且能够较早的达到精度要求。相比之下,割线法程序代码量较少,精简明了。六、讨论、心得本次数值计算方法程序设计实验从习题练习中跳脱出来,直接面对实用性较强的程序代码编写.效果很好,不仅加深对二分法、割线法的理解,还加强了实际用运能力.将理论知识成功地转化成实践结果. 实验地点虎峪校区致远楼B401指导教师xx太原理工大学学生实验报告学院名称软件学院专业班级1217班学号201200xxxx学生姓名xx实验日期2014。05。28成绩课程名称数值计算方法实验题目实验二线性方程组的直接解法一、实验目的和要求合理利用Gauss消元法、LU分解法、追赶法求解下列方程组:1231234(n=5,10,100,…)二、主要设备笔记本HPProBook6470b一台编译软件:VC++6。0三、实验内容和原理高斯消元法:将原方程组化为三角形方阵的方程组:lik=aik/akkaij=aij-lik*akj(k=1,2,…,n—1i=k+1,k+2,…,nj=k+1,k+2,…,n+1)由回代过程求得原方程组的解:xn=ann+1/annxk=(akn+1-∑akjxj)/akkLU分解法:将系数矩阵A转化为A=L*U,L为单位下三角矩阵,U为普通上三角矩阵,然后通过解方程组l*y=b,u*x=y,来求解x。四、操作方法与实验步骤1。完全主元素消元法:#includeh〉#include〈iostream.h>#include"math。h”floata[100][101];floatx[10];intN;voidshuchu(){for(inti=1;i<=N;i++){for(intj=1;j<=N+1;j++){cout〈}cout〈}}voidshuru(){cout〈<”请输入矩阵阶数:”<〈endl;cin〉>N;cout<〈”请输入矩阵各项:"〈〈endl;for(inti=1;i<=N;i++)for(intj=1;j〈=N+1;j++){cin〉>a[i][j];}cout〈}voidmain(){intz[10];intmaxi,maxj;shuru();for(inti=1;i<=N;i++)z[i]=i;for(intk=1;k{maxi=k;maxj=k;floatmaxv=abs(a[k][k]);for(i=k;i〈=N;i++)for(intj=k;j〈=N;j++)if(abs(a[i][j])〉maxv){maxv=abs(a[i][j]);maxi=i;maxj=j;}if(maxi!=k){for(intj=1;j<=N+1;j++){floatt=a[k][j];a[k][j]=a[maxi][j];a[maxi][j]=t;}}if(maxj!=k){for(i=1;i〈=N;i++){floatt=a[i][k];a[i][k]=a[i][maxj];a[i][maxj]=t;}intt=z[k];z[k]=z[maxj];z[maxj]=t;}for(inti=k+1;i<=N;i++){floatl=a[i][k]/a[k][k];for(intj=k;j〈=N+1;j++){a[i][j]+=—l*a[k][j];}}}for(i=N;i〉0;i—-){floats=0;for(intj=i+1;j〈=N;j++){s+=a[i][j]*x[z[j]];}x[z[i]]=(a[i][N+1]-s)/a[i][i];}cout<〈"完全主元素消去法之后的矩阵为:”〈shuchu();for(i=1;i〈=N;i++)cout〈〈"x["〈〈i〈<"]="<}2.列主元素消元法:#include”stdio.h”intmain(){floata[3][4]={{1,2,3,14},{0,1,2,8},{2,4,1,13}};floatx[3];floatsum=0;intk,i,j;for(k=0;k<2;k++)for(i=k+1;i〈3;i++)for(j=k+1;j〈4;j++)a[i][j]=a[i][j]-a[i][k]/a[k][k]*a[k][j];for(i=0;i〈3;i++){for(j=0;j〈4;j++){printf("a[%d][%d]=%f”,i,j,a[i][j]);}printf("\n”);}x[2]=a[2][3]/a[2][2];for(k=1;k〉=0;k—-){sum=0;for(j=k+1;j〈3;j++){sum+=a[k][j]*x[j];}x[k]=(a[k][3]-sum)/a[k][k];}for(i=0;i〈3;i++){printf(”x[%d]=%f\n",i+1,x[i]);}printf(”\n”);}3。LU分解法:#include〈stdio。h〉#includeh〉#defineL30doublea[L][L],b[L],l[L][L],u[L][L],x[L],y[L];intmain(){intn,i,j,k,r;printf(”请输入矩阵元次:\n”);scanf("%d”,&n);printf(”请输入矩阵各项:\n");for(i=1;i〈=n;++i){for(j=1;j<=n;++j){scanf(”%lf”,&a[i][j]);}}printf("请输入方程组的常数项:\n”);for(i=1;i<=n;++i){scanf("%lf”,&b[i]);}for(i=1;i〈=n;++i){for(j=1;j<=n;++j){l[i][j]=0;u[i][j]=0.0;}}for(k=1;k〈=n;++k){for(j=k;j<=n;++j){u[k][j]=a[k][j];for(r=1;r{u[k][j]—=l[k][r]*u[r][j];}}for(i=k+1;i〈=n;++i){l[i][k]=a[i][k];for(r=1;r{l[i][k]-=l[i][r]*u[r][k];}l[i][k]/=u[k][k];}l[k][k]=1。0;}for(i=1;i〈=n;++i){y[i]=b[i];for(j=1;j{y[i]-=l[i][j]*y[j];}}for(i=n;i〉0;-—i){x[i]=y[i];for(j=i+1;j<=n;++j){x[i]-=u[i][j]*x[j];}x[i]/=u[i][i];}for(i=1;i〈=n;++i){printf(”%0.2lf\n",x[i]);}return0;}五、实验结果与分析完全主元素消元法:列主元素消元法:LU分解法:分析:对于两种高斯解方程,完全主元素跟列主元素都是先消元、再回代,由程序段可以发现,始终消去对角线下方的元素.即,为了节约内存及时效,可以不必计算出主元素下方数据。列主元素消元法的算法设计上优于完全主元素消元法,它只需依次按列选主元素然后换行使之变到主元素位置,再进行消元即可。列主元素消元法的耗时比完全主元素法少很多,常采用之。对于LU分解法,分解矩阵为单位下三角阵L与上三角阵U的乘积,然后解方程组Ly=b,回代,解方程组Ux=y。其中的L为n阶单位下三角阵、U为上三角阵。六、讨论、心得本次试验中,感觉是最难的一次,完全主元素消元法程序编写过程相对来说花了好长时间.纠正各种语法、算法、思路错误。最后勉强成功,但还是有几处警告,不得解决之法。感到程序学习的不足,再加之对高斯的不甚了解。编写过程很是痛苦。查阅各种内外部资料,这点有利有弊。突然觉得,应该再把数据结构之类的重新学习一下才行。以后多花时间在编程吧,重在理解。必须反省一下自己的C、C++学习了,还是得多加练习,平时必须养成一种好的算法思维习惯。实验地点虎峪校区致远楼B401指导教师xx太原理工大学学生实验报告学院名称软件学院专业班级1217班学号201200xxxx学生姓名xx实验日期2014.06.04成绩课程名称数值计算方法实验题目实验三线性方程组的迭代解法一、实验目的和要求使用雅可比迭代法或高斯-赛德尔迭代法对下列方程组进行求解。二、主要设备笔记本HPProBook6470b一台编译软件:VC++6.0三、实验内容和原理设线性方程组Ax=b的系数矩阵A可逆,且主对角元素a11,a22,…,ann均不为零,令D=diag(a11,a22,…,ann)并将A分解成A=(A-D)+D从而线性方程组可写成Dx=(D—A)x+b则有迭代公式x(k+1)=B1x(k)+f1其中,B1=I-D-1A,f1=D—1b。 四、操作方法与实验步骤高斯—赛德尔迭代法#include”iostream”#include”iomanip”usingnamespacestd;intmain(){inti,j,k=0,m,n;doublet1,t2,e1,e2=0.0;cout<〈”请输入精度e:";cin〉〉e1;cout<<”请输入系数矩阵行数:”;cin〉>m;cout<〈"请输入系数矩阵列数:";cin〉〉n;cout〈〈endl;double(**a)=newdouble*[m];for(i=0;i〈=m;i++){a[i]=newdouble[n];}double(*b)=newdouble[m];double(*x)=newdouble[n];cout〈<”请输入系数矩阵:”<〈endl;cout<<"--—--—-—-—-———-———---—-——-—-————--——-—-———---—---—-—-----——-—"〈for(intnum1=0;num1{for(intnum2=0;num2{cin>〉a[num1][num2];}cout<〈endl;}cout<<"输入的系数矩阵为:"〈for(intnum3=0;num3〈m;num3++){for(intnum4=0;num4〈n;num4++){cout〈〈a[num3][num4]〈〈”";}cout<〈endl;}cout〈〈”请输入矩阵b:”〈for(intnum5=0;num5〈m;num5++){cin〉〉b[num5];}cout<<”输入的矩阵b为:”〈〈endl;for(intnum6=0;num6〈m;num6++){cout〈〈b[num6]〈〈"";}cout〈for(intnum7=0;num7{x[num7]=0.0000;}do{cout<〈”第"〈〈k<<"次迭代值:”;e2=0.0;for(i=0;i〈m;i++){doublesum=0.0;for(j=0;j{if(j!=i)sum+=a[i][j]*x[j];}t1=x[i];t2=e2;x[i]=(b[i]—sum)/a[i][i];e2=(x[i])—t1>=0?(x[i])—t1:t1-(x[i]);e2=(e2>=t2?e2:t2);cout<}cout<〈endl;k++;}while(e2>=e1&&k<30);cout〈〈”共迭代了”〈〈k〈〈”次";delete[]a;delete[]b;delete[]x;return0;} 雅克比迭代法: #includeh>#includeintmain(){floata[3][3]={{10,—1,—2},{—1,10,-2},{-1,—1,5}},b[3]={7.2,8。3,4.2};floatx[3]={0,0,0},sum;inti,j,k,n=3;printf("\t\tX[1]\t\tX[2]\t\tX[3]\n”);for(k=0;k〈8;k++){for(i=0;i<3;i++){sum=0;for(j=0;j{if(i==j)continue;sum=sum+a[i][j]*x[j];}x[i]=(b[i]-sum)/a[i][i];}printf(”第%d次迭代:\t”,k+1);for(i=0;i〈n;i++){printf("%f\t”,x[i]);}printf("\n”);}} 五、实验结果与分析高斯赛德尔迭代法: 雅克比迭代: 分析:使用高斯—赛德尔和雅克比迭代都可以求出方程组的解,但是利用高斯—赛德尔迭代法所需的迭代次数比雅克比迭代少,能够更早的达到精度要求。从程序中可以看出,雅克比定义的sum只有一个,而高斯赛德尔需要两个。时效性上后者要好些。六、讨论、心得这次试验算是比较成功,要归功于授课时候的认真听讲.程序编写之前,对书本的理论知识进行了进一步的探索。预习准备工作很彻底,自然随后的一切也都很顺利。实验地点虎峪校区致远楼B401指导教师xx太原理工大学学生实验报告学院名称软件学院专业班级1217班学号201200xxxx学生姓名xx实验日期2014.06。11成绩课程名称数值计算方法实验题目实验四代数插值和最小二乘法拟合一、实验目的和要求(1)使用拉格朗日插值法或牛顿插值法求解:已知f(x)在6个点的函数值如下表所示,运用插值方法,求f(0.596)的近似值。X0.400。550。650.800.901.05f(x)0.410750.578150。696750.888111.026521.25386(2)给定数据点(xi,yi),用最小二乘法拟合数据的多项式,并求平方误差。xi00.50.60。70。80.91。0yi11。751。962.192.442。713。00 二、主要设备笔记本HPProBook6470b一台编译软件:VC++6.0三、实验内容和原理(1)设函数在区间[a,b]上n+1互异节点x0,x1,…,xn上的函数值分别为y0,y1,…,yn,求n次插值多项式Pn(x),满足条件Pn(xj)=yj,j=0,1,…,n令Ln(x)=y0l0(x)+y1l1(x)+…+ynln(x)=∑yili(x)其中l0(x),l1(x),…,ln(x)为以x0,x1,…,xn为节点的n次插值基函数,则Ln(x)是一次数不超过n的多项式,且满足Ln(xj)=yj,L=0,1,…,n再由插值多项式的唯一性,得Pn(x)≡Ln(x)(2)建立正规方程组:∑(∑xij+k)ak=∑xijyi,j=0,1,…,n平方误差:I=∑(∑akxik—yi)2对给定数据点{(Xi,Yi)}(i=0,1,…,m),在取定的函数类Φ中,求p(x)∈Φ,使误差的平方和E2最小,E2=∑[p(Xi)—Yi]2。从几何意义上讲,就是寻求与给定点{(Xi,Yi)}(i=0,1,…,m)的距离平方和为最小的曲线y=p(x)。函数p(x)称为拟合函数或最小二乘解,求拟合函数p(x)的方法称为曲线拟合的最小二乘法.得到的两个关于a0、a1为未知数的两个方程组,解这两个方程组得出:a0=(∑Yi)/m-a1(∑Xi)/ma1=[m∑XiYi—(∑Xi∑Yi)]/[m∑Xi2-(∑Xi)2)]即最终的拟合多项式各项系数。四、操作方法与实验步骤(1)代数插值#include〈stdio.h〉#include#include〈conio.h〉#include〈alloc.h〉voiddifference(float*x,float*y,intn){float*f;intk,i;f=(floa
intmain()
{
doublea=1。
0,b=2.0;
doublex,s;
printf("An\t\tBn\t\tF(Xn)\n”);
while
(1)
{
x=(a+b)/2;
s=pow(x,3)+4*x*x-10;
if(—0.000005〈s&&s<0.000005)
break;
}
elseif(s<0)
a=x;
}
elseif(s>0)
b=x;
printf(”%f\t%f\t%f\n",a,b,s);
printf("X的值为:
%f\n”,x);
printf(”误差:
\t%f\n",s);
return0;
2。
割线法:
#include”stdio.h"
#include”math。
h"
floatc,a=1.0,b=2。
0;
printf(”每次得到的X的近似值:
\n”);
c=b—(b*b*b+4*b*b-10)*(b—a)/(b*b*b+4*b*b—(a*a*a+4*a*a));
if(fabs(b—c)<0。
5*0。
00001)break;
b=c;
printf(”%f\n",b);
printf(”X的值为:
%f\n”,c);
五、实验结果与分析
二分法割线法
分析:
由程序知,使用二分法和割线法均能计算出方程的根,但利用割线法要比二分法计算的次数少,并且能够较早的达到精度要求。
相比之下,割线法程序代码量较少,精简明了。
六、讨论、心得
本次数值计算方法程序设计实验从习题练习中跳脱出来,直接面对实用性较强的程序代码编写.效果很好,不仅加深对二分法、割线法的理解,还加强了实际用运能力.将理论知识成功地转化成实践结果.
实验地点
指导教师
2014。
05。
28
实验二线性方程组的直接解法
合理利用Gauss消元法、LU分解法、追赶法求解下列方程组:
1
2
3
4
(n=5,10,100,…)
编译软件:
高斯消元法:
将原方程组化为三角形方阵的方程组:
lik=aik/akk
aij=aij-lik*akj
(k=1,2,…,n—1i=k+1,k+2,…,nj=k+1,k+2,…,n+1)
由回代过程求得原方程组的解:
xn=ann+1/ann
xk=(akn+1-∑akjxj)/akk
LU分解法:
将系数矩阵A转化为A=L*U,L为单位下三角矩阵,U为普通上三角矩阵,然后通过解方程组l*y=b,u*x=y,来求解x。
完全主元素消元法:
#includeh〉#include〈iostream.h>#include"math。h”floata[100][101];floatx[10];intN;voidshuchu(){for(inti=1;i<=N;i++){for(intj=1;j<=N+1;j++){cout〈}cout〈}}voidshuru(){cout〈<”请输入矩阵阶数:”<〈endl;cin〉>N;cout<〈”请输入矩阵各项:"〈〈endl;for(inti=1;i<=N;i++)for(intj=1;j〈=N+1;j++){cin〉>a[i][j];}cout〈}voidmain(){intz[10];intmaxi,maxj;shuru();for(inti=1;i<=N;i++)z[i]=i;for(intk=1;k{maxi=k;maxj=k;floatmaxv=abs(a[k][k]);for(i=k;i〈=N;i++)for(intj=k;j〈=N;j++)if(abs(a[i][j])〉maxv){maxv=abs(a[i][j]);maxi=i;maxj=j;}if(maxi!=k){for(intj=1;j<=N+1;j++){floatt=a[k][j];a[k][j]=a[maxi][j];a[maxi][j]=t;}}if(maxj!=k){for(i=1;i〈=N;i++){floatt=a[i][k];a[i][k]=a[i][maxj];a[i][maxj]=t;}intt=z[k];z[k]=z[maxj];z[maxj]=t;}for(inti=k+1;i<=N;i++){floatl=a[i][k]/a[k][k];for(intj=k;j〈=N+1;j++){a[i][j]+=—l*a[k][j];}}}for(i=N;i〉0;i—-){floats=0;for(intj=i+1;j〈=N;j++){s+=a[i][j]*x[z[j]];}x[z[i]]=(a[i][N+1]-s)/a[i][i];}cout<〈"完全主元素消去法之后的矩阵为:”〈shuchu();for(i=1;i〈=N;i++)cout〈〈"x["〈〈i〈<"]="<}2.列主元素消元法:#include”stdio.h”intmain(){floata[3][4]={{1,2,3,14},{0,1,2,8},{2,4,1,13}};floatx[3];floatsum=0;intk,i,j;for(k=0;k<2;k++)for(i=k+1;i〈3;i++)for(j=k+1;j〈4;j++)a[i][j]=a[i][j]-a[i][k]/a[k][k]*a[k][j];for(i=0;i〈3;i++){for(j=0;j〈4;j++){printf("a[%d][%d]=%f”,i,j,a[i][j]);}printf("\n”);}x[2]=a[2][3]/a[2][2];for(k=1;k〉=0;k—-){sum=0;for(j=k+1;j〈3;j++){sum+=a[k][j]*x[j];}x[k]=(a[k][3]-sum)/a[k][k];}for(i=0;i〈3;i++){printf(”x[%d]=%f\n",i+1,x[i]);}printf(”\n”);}3。LU分解法:#include〈stdio。h〉#includeh〉#defineL30doublea[L][L],b[L],l[L][L],u[L][L],x[L],y[L];intmain(){intn,i,j,k,r;printf(”请输入矩阵元次:\n”);scanf("%d”,&n);printf(”请输入矩阵各项:\n");for(i=1;i〈=n;++i){for(j=1;j<=n;++j){scanf(”%lf”,&a[i][j]);}}printf("请输入方程组的常数项:\n”);for(i=1;i<=n;++i){scanf("%lf”,&b[i]);}for(i=1;i〈=n;++i){for(j=1;j<=n;++j){l[i][j]=0;u[i][j]=0.0;}}for(k=1;k〈=n;++k){for(j=k;j<=n;++j){u[k][j]=a[k][j];for(r=1;r{u[k][j]—=l[k][r]*u[r][j];}}for(i=k+1;i〈=n;++i){l[i][k]=a[i][k];for(r=1;r{l[i][k]-=l[i][r]*u[r][k];}l[i][k]/=u[k][k];}l[k][k]=1。0;}for(i=1;i〈=n;++i){y[i]=b[i];for(j=1;j{y[i]-=l[i][j]*y[j];}}for(i=n;i〉0;-—i){x[i]=y[i];for(j=i+1;j<=n;++j){x[i]-=u[i][j]*x[j];}x[i]/=u[i][i];}for(i=1;i〈=n;++i){printf(”%0.2lf\n",x[i]);}return0;}五、实验结果与分析完全主元素消元法:列主元素消元法:LU分解法:分析:对于两种高斯解方程,完全主元素跟列主元素都是先消元、再回代,由程序段可以发现,始终消去对角线下方的元素.即,为了节约内存及时效,可以不必计算出主元素下方数据。列主元素消元法的算法设计上优于完全主元素消元法,它只需依次按列选主元素然后换行使之变到主元素位置,再进行消元即可。列主元素消元法的耗时比完全主元素法少很多,常采用之。对于LU分解法,分解矩阵为单位下三角阵L与上三角阵U的乘积,然后解方程组Ly=b,回代,解方程组Ux=y。其中的L为n阶单位下三角阵、U为上三角阵。六、讨论、心得本次试验中,感觉是最难的一次,完全主元素消元法程序编写过程相对来说花了好长时间.纠正各种语法、算法、思路错误。最后勉强成功,但还是有几处警告,不得解决之法。感到程序学习的不足,再加之对高斯的不甚了解。编写过程很是痛苦。查阅各种内外部资料,这点有利有弊。突然觉得,应该再把数据结构之类的重新学习一下才行。以后多花时间在编程吧,重在理解。必须反省一下自己的C、C++学习了,还是得多加练习,平时必须养成一种好的算法思维习惯。实验地点虎峪校区致远楼B401指导教师xx太原理工大学学生实验报告学院名称软件学院专业班级1217班学号201200xxxx学生姓名xx实验日期2014.06.04成绩课程名称数值计算方法实验题目实验三线性方程组的迭代解法一、实验目的和要求使用雅可比迭代法或高斯-赛德尔迭代法对下列方程组进行求解。二、主要设备笔记本HPProBook6470b一台编译软件:VC++6.0三、实验内容和原理设线性方程组Ax=b的系数矩阵A可逆,且主对角元素a11,a22,…,ann均不为零,令D=diag(a11,a22,…,ann)并将A分解成A=(A-D)+D从而线性方程组可写成Dx=(D—A)x+b则有迭代公式x(k+1)=B1x(k)+f1其中,B1=I-D-1A,f1=D—1b。 四、操作方法与实验步骤高斯—赛德尔迭代法#include”iostream”#include”iomanip”usingnamespacestd;intmain(){inti,j,k=0,m,n;doublet1,t2,e1,e2=0.0;cout<〈”请输入精度e:";cin〉〉e1;cout<<”请输入系数矩阵行数:”;cin〉>m;cout<〈"请输入系数矩阵列数:";cin〉〉n;cout〈〈endl;double(**a)=newdouble*[m];for(i=0;i〈=m;i++){a[i]=newdouble[n];}double(*b)=newdouble[m];double(*x)=newdouble[n];cout〈<”请输入系数矩阵:”<〈endl;cout<<"--—--—-—-—-———-———---—-——-—-————--——-—-———---—---—-—-----——-—"〈for(intnum1=0;num1{for(intnum2=0;num2{cin>〉a[num1][num2];}cout<〈endl;}cout<<"输入的系数矩阵为:"〈for(intnum3=0;num3〈m;num3++){for(intnum4=0;num4〈n;num4++){cout〈〈a[num3][num4]〈〈”";}cout<〈endl;}cout〈〈”请输入矩阵b:”〈for(intnum5=0;num5〈m;num5++){cin〉〉b[num5];}cout<<”输入的矩阵b为:”〈〈endl;for(intnum6=0;num6〈m;num6++){cout〈〈b[num6]〈〈"";}cout〈for(intnum7=0;num7{x[num7]=0.0000;}do{cout<〈”第"〈〈k<<"次迭代值:”;e2=0.0;for(i=0;i〈m;i++){doublesum=0.0;for(j=0;j{if(j!=i)sum+=a[i][j]*x[j];}t1=x[i];t2=e2;x[i]=(b[i]—sum)/a[i][i];e2=(x[i])—t1>=0?(x[i])—t1:t1-(x[i]);e2=(e2>=t2?e2:t2);cout<}cout<〈endl;k++;}while(e2>=e1&&k<30);cout〈〈”共迭代了”〈〈k〈〈”次";delete[]a;delete[]b;delete[]x;return0;} 雅克比迭代法: #includeh>#includeintmain(){floata[3][3]={{10,—1,—2},{—1,10,-2},{-1,—1,5}},b[3]={7.2,8。3,4.2};floatx[3]={0,0,0},sum;inti,j,k,n=3;printf("\t\tX[1]\t\tX[2]\t\tX[3]\n”);for(k=0;k〈8;k++){for(i=0;i<3;i++){sum=0;for(j=0;j{if(i==j)continue;sum=sum+a[i][j]*x[j];}x[i]=(b[i]-sum)/a[i][i];}printf(”第%d次迭代:\t”,k+1);for(i=0;i〈n;i++){printf("%f\t”,x[i]);}printf("\n”);}} 五、实验结果与分析高斯赛德尔迭代法: 雅克比迭代: 分析:使用高斯—赛德尔和雅克比迭代都可以求出方程组的解,但是利用高斯—赛德尔迭代法所需的迭代次数比雅克比迭代少,能够更早的达到精度要求。从程序中可以看出,雅克比定义的sum只有一个,而高斯赛德尔需要两个。时效性上后者要好些。六、讨论、心得这次试验算是比较成功,要归功于授课时候的认真听讲.程序编写之前,对书本的理论知识进行了进一步的探索。预习准备工作很彻底,自然随后的一切也都很顺利。实验地点虎峪校区致远楼B401指导教师xx太原理工大学学生实验报告学院名称软件学院专业班级1217班学号201200xxxx学生姓名xx实验日期2014.06。11成绩课程名称数值计算方法实验题目实验四代数插值和最小二乘法拟合一、实验目的和要求(1)使用拉格朗日插值法或牛顿插值法求解:已知f(x)在6个点的函数值如下表所示,运用插值方法,求f(0.596)的近似值。X0.400。550。650.800.901.05f(x)0.410750.578150。696750.888111.026521.25386(2)给定数据点(xi,yi),用最小二乘法拟合数据的多项式,并求平方误差。xi00.50.60。70。80.91。0yi11。751。962.192.442。713。00 二、主要设备笔记本HPProBook6470b一台编译软件:VC++6.0三、实验内容和原理(1)设函数在区间[a,b]上n+1互异节点x0,x1,…,xn上的函数值分别为y0,y1,…,yn,求n次插值多项式Pn(x),满足条件Pn(xj)=yj,j=0,1,…,n令Ln(x)=y0l0(x)+y1l1(x)+…+ynln(x)=∑yili(x)其中l0(x),l1(x),…,ln(x)为以x0,x1,…,xn为节点的n次插值基函数,则Ln(x)是一次数不超过n的多项式,且满足Ln(xj)=yj,L=0,1,…,n再由插值多项式的唯一性,得Pn(x)≡Ln(x)(2)建立正规方程组:∑(∑xij+k)ak=∑xijyi,j=0,1,…,n平方误差:I=∑(∑akxik—yi)2对给定数据点{(Xi,Yi)}(i=0,1,…,m),在取定的函数类Φ中,求p(x)∈Φ,使误差的平方和E2最小,E2=∑[p(Xi)—Yi]2。从几何意义上讲,就是寻求与给定点{(Xi,Yi)}(i=0,1,…,m)的距离平方和为最小的曲线y=p(x)。函数p(x)称为拟合函数或最小二乘解,求拟合函数p(x)的方法称为曲线拟合的最小二乘法.得到的两个关于a0、a1为未知数的两个方程组,解这两个方程组得出:a0=(∑Yi)/m-a1(∑Xi)/ma1=[m∑XiYi—(∑Xi∑Yi)]/[m∑Xi2-(∑Xi)2)]即最终的拟合多项式各项系数。四、操作方法与实验步骤(1)代数插值#include〈stdio.h〉#include#include〈conio.h〉#include〈alloc.h〉voiddifference(float*x,float*y,intn){float*f;intk,i;f=(floa
#include〈iostream.h>
#include"math。
h”
floata[100][101];
floatx[10];
intN;
voidshuchu()
for(inti=1;i<=N;i++)
for(intj=1;j<=N+1;j++)
cout〈}cout〈}}voidshuru(){cout〈<”请输入矩阵阶数:”<〈endl;cin〉>N;cout<〈”请输入矩阵各项:"〈〈endl;for(inti=1;i<=N;i++)for(intj=1;j〈=N+1;j++){cin〉>a[i][j];}cout〈}voidmain(){intz[10];intmaxi,maxj;shuru();for(inti=1;i<=N;i++)z[i]=i;for(intk=1;k{maxi=k;maxj=k;floatmaxv=abs(a[k][k]);for(i=k;i〈=N;i++)for(intj=k;j〈=N;j++)if(abs(a[i][j])〉maxv){maxv=abs(a[i][j]);maxi=i;maxj=j;}if(maxi!=k){for(intj=1;j<=N+1;j++){floatt=a[k][j];a[k][j]=a[maxi][j];a[maxi][j]=t;}}if(maxj!=k){for(i=1;i〈=N;i++){floatt=a[i][k];a[i][k]=a[i][maxj];a[i][maxj]=t;}intt=z[k];z[k]=z[maxj];z[maxj]=t;}for(inti=k+1;i<=N;i++){floatl=a[i][k]/a[k][k];for(intj=k;j〈=N+1;j++){a[i][j]+=—l*a[k][j];}}}for(i=N;i〉0;i—-){floats=0;for(intj=i+1;j〈=N;j++){s+=a[i][j]*x[z[j]];}x[z[i]]=(a[i][N+1]-s)/a[i][i];}cout<〈"完全主元素消去法之后的矩阵为:”〈shuchu();for(i=1;i〈=N;i++)cout〈〈"x["〈〈i〈<"]="<}2.列主元素消元法:#include”stdio.h”intmain(){floata[3][4]={{1,2,3,14},{0,1,2,8},{2,4,1,13}};floatx[3];floatsum=0;intk,i,j;for(k=0;k<2;k++)for(i=k+1;i〈3;i++)for(j=k+1;j〈4;j++)a[i][j]=a[i][j]-a[i][k]/a[k][k]*a[k][j];for(i=0;i〈3;i++){for(j=0;j〈4;j++){printf("a[%d][%d]=%f”,i,j,a[i][j]);}printf("\n”);}x[2]=a[2][3]/a[2][2];for(k=1;k〉=0;k—-){sum=0;for(j=k+1;j〈3;j++){sum+=a[k][j]*x[j];}x[k]=(a[k][3]-sum)/a[k][k];}for(i=0;i〈3;i++){printf(”x[%d]=%f\n",i+1,x[i]);}printf(”\n”);}3。LU分解法:#include〈stdio。h〉#includeh〉#defineL30doublea[L][L],b[L],l[L][L],u[L][L],x[L],y[L];intmain(){intn,i,j,k,r;printf(”请输入矩阵元次:\n”);scanf("%d”,&n);printf(”请输入矩阵各项:\n");for(i=1;i〈=n;++i){for(j=1;j<=n;++j){scanf(”%lf”,&a[i][j]);}}printf("请输入方程组的常数项:\n”);for(i=1;i<=n;++i){scanf("%lf”,&b[i]);}for(i=1;i〈=n;++i){for(j=1;j<=n;++j){l[i][j]=0;u[i][j]=0.0;}}for(k=1;k〈=n;++k){for(j=k;j<=n;++j){u[k][j]=a[k][j];for(r=1;r{u[k][j]—=l[k][r]*u[r][j];}}for(i=k+1;i〈=n;++i){l[i][k]=a[i][k];for(r=1;r{l[i][k]-=l[i][r]*u[r][k];}l[i][k]/=u[k][k];}l[k][k]=1。0;}for(i=1;i〈=n;++i){y[i]=b[i];for(j=1;j{y[i]-=l[i][j]*y[j];}}for(i=n;i〉0;-—i){x[i]=y[i];for(j=i+1;j<=n;++j){x[i]-=u[i][j]*x[j];}x[i]/=u[i][i];}for(i=1;i〈=n;++i){printf(”%0.2lf\n",x[i]);}return0;}五、实验结果与分析完全主元素消元法:列主元素消元法:LU分解法:分析:对于两种高斯解方程,完全主元素跟列主元素都是先消元、再回代,由程序段可以发现,始终消去对角线下方的元素.即,为了节约内存及时效,可以不必计算出主元素下方数据。列主元素消元法的算法设计上优于完全主元素消元法,它只需依次按列选主元素然后换行使之变到主元素位置,再进行消元即可。列主元素消元法的耗时比完全主元素法少很多,常采用之。对于LU分解法,分解矩阵为单位下三角阵L与上三角阵U的乘积,然后解方程组Ly=b,回代,解方程组Ux=y。其中的L为n阶单位下三角阵、U为上三角阵。六、讨论、心得本次试验中,感觉是最难的一次,完全主元素消元法程序编写过程相对来说花了好长时间.纠正各种语法、算法、思路错误。最后勉强成功,但还是有几处警告,不得解决之法。感到程序学习的不足,再加之对高斯的不甚了解。编写过程很是痛苦。查阅各种内外部资料,这点有利有弊。突然觉得,应该再把数据结构之类的重新学习一下才行。以后多花时间在编程吧,重在理解。必须反省一下自己的C、C++学习了,还是得多加练习,平时必须养成一种好的算法思维习惯。实验地点虎峪校区致远楼B401指导教师xx太原理工大学学生实验报告学院名称软件学院专业班级1217班学号201200xxxx学生姓名xx实验日期2014.06.04成绩课程名称数值计算方法实验题目实验三线性方程组的迭代解法一、实验目的和要求使用雅可比迭代法或高斯-赛德尔迭代法对下列方程组进行求解。二、主要设备笔记本HPProBook6470b一台编译软件:VC++6.0三、实验内容和原理设线性方程组Ax=b的系数矩阵A可逆,且主对角元素a11,a22,…,ann均不为零,令D=diag(a11,a22,…,ann)并将A分解成A=(A-D)+D从而线性方程组可写成Dx=(D—A)x+b则有迭代公式x(k+1)=B1x(k)+f1其中,B1=I-D-1A,f1=D—1b。 四、操作方法与实验步骤高斯—赛德尔迭代法#include”iostream”#include”iomanip”usingnamespacestd;intmain(){inti,j,k=0,m,n;doublet1,t2,e1,e2=0.0;cout<〈”请输入精度e:";cin〉〉e1;cout<<”请输入系数矩阵行数:”;cin〉>m;cout<〈"请输入系数矩阵列数:";cin〉〉n;cout〈〈endl;double(**a)=newdouble*[m];for(i=0;i〈=m;i++){a[i]=newdouble[n];}double(*b)=newdouble[m];double(*x)=newdouble[n];cout〈<”请输入系数矩阵:”<〈endl;cout<<"--—--—-—-—-———-———---—-——-—-————--——-—-———---—---—-—-----——-—"〈for(intnum1=0;num1{for(intnum2=0;num2{cin>〉a[num1][num2];}cout<〈endl;}cout<<"输入的系数矩阵为:"〈for(intnum3=0;num3〈m;num3++){for(intnum4=0;num4〈n;num4++){cout〈〈a[num3][num4]〈〈”";}cout<〈endl;}cout〈〈”请输入矩阵b:”〈for(intnum5=0;num5〈m;num5++){cin〉〉b[num5];}cout<<”输入的矩阵b为:”〈〈endl;for(intnum6=0;num6〈m;num6++){cout〈〈b[num6]〈〈"";}cout〈for(intnum7=0;num7{x[num7]=0.0000;}do{cout<〈”第"〈〈k<<"次迭代值:”;e2=0.0;for(i=0;i〈m;i++){doublesum=0.0;for(j=0;j{if(j!=i)sum+=a[i][j]*x[j];}t1=x[i];t2=e2;x[i]=(b[i]—sum)/a[i][i];e2=(x[i])—t1>=0?(x[i])—t1:t1-(x[i]);e2=(e2>=t2?e2:t2);cout<}cout<〈endl;k++;}while(e2>=e1&&k<30);cout〈〈”共迭代了”〈〈k〈〈”次";delete[]a;delete[]b;delete[]x;return0;} 雅克比迭代法: #includeh>#includeintmain(){floata[3][3]={{10,—1,—2},{—1,10,-2},{-1,—1,5}},b[3]={7.2,8。3,4.2};floatx[3]={0,0,0},sum;inti,j,k,n=3;printf("\t\tX[1]\t\tX[2]\t\tX[3]\n”);for(k=0;k〈8;k++){for(i=0;i<3;i++){sum=0;for(j=0;j{if(i==j)continue;sum=sum+a[i][j]*x[j];}x[i]=(b[i]-sum)/a[i][i];}printf(”第%d次迭代:\t”,k+1);for(i=0;i〈n;i++){printf("%f\t”,x[i]);}printf("\n”);}} 五、实验结果与分析高斯赛德尔迭代法: 雅克比迭代: 分析:使用高斯—赛德尔和雅克比迭代都可以求出方程组的解,但是利用高斯—赛德尔迭代法所需的迭代次数比雅克比迭代少,能够更早的达到精度要求。从程序中可以看出,雅克比定义的sum只有一个,而高斯赛德尔需要两个。时效性上后者要好些。六、讨论、心得这次试验算是比较成功,要归功于授课时候的认真听讲.程序编写之前,对书本的理论知识进行了进一步的探索。预习准备工作很彻底,自然随后的一切也都很顺利。实验地点虎峪校区致远楼B401指导教师xx太原理工大学学生实验报告学院名称软件学院专业班级1217班学号201200xxxx学生姓名xx实验日期2014.06。11成绩课程名称数值计算方法实验题目实验四代数插值和最小二乘法拟合一、实验目的和要求(1)使用拉格朗日插值法或牛顿插值法求解:已知f(x)在6个点的函数值如下表所示,运用插值方法,求f(0.596)的近似值。X0.400。550。650.800.901.05f(x)0.410750.578150。696750.888111.026521.25386(2)给定数据点(xi,yi),用最小二乘法拟合数据的多项式,并求平方误差。xi00.50.60。70。80.91。0yi11。751。962.192.442。713。00 二、主要设备笔记本HPProBook6470b一台编译软件:VC++6.0三、实验内容和原理(1)设函数在区间[a,b]上n+1互异节点x0,x1,…,xn上的函数值分别为y0,y1,…,yn,求n次插值多项式Pn(x),满足条件Pn(xj)=yj,j=0,1,…,n令Ln(x)=y0l0(x)+y1l1(x)+…+ynln(x)=∑yili(x)其中l0(x),l1(x),…,ln(x)为以x0,x1,…,xn为节点的n次插值基函数,则Ln(x)是一次数不超过n的多项式,且满足Ln(xj)=yj,L=0,1,…,n再由插值多项式的唯一性,得Pn(x)≡Ln(x)(2)建立正规方程组:∑(∑xij+k)ak=∑xijyi,j=0,1,…,n平方误差:I=∑(∑akxik—yi)2对给定数据点{(Xi,Yi)}(i=0,1,…,m),在取定的函数类Φ中,求p(x)∈Φ,使误差的平方和E2最小,E2=∑[p(Xi)—Yi]2。从几何意义上讲,就是寻求与给定点{(Xi,Yi)}(i=0,1,…,m)的距离平方和为最小的曲线y=p(x)。函数p(x)称为拟合函数或最小二乘解,求拟合函数p(x)的方法称为曲线拟合的最小二乘法.得到的两个关于a0、a1为未知数的两个方程组,解这两个方程组得出:a0=(∑Yi)/m-a1(∑Xi)/ma1=[m∑XiYi—(∑Xi∑Yi)]/[m∑Xi2-(∑Xi)2)]即最终的拟合多项式各项系数。四、操作方法与实验步骤(1)代数插值#include〈stdio.h〉#include#include〈conio.h〉#include〈alloc.h〉voiddifference(float*x,float*y,intn){float*f;intk,i;f=(floa
cout〈}}voidshuru(){cout〈<”请输入矩阵阶数:”<〈endl;cin〉>N;cout<〈”请输入矩阵各项:"〈〈endl;for(inti=1;i<=N;i++)for(intj=1;j〈=N+1;j++){cin〉>a[i][j];}cout〈}voidmain(){intz[10];intmaxi,maxj;shuru();for(inti=1;i<=N;i++)z[i]=i;for(intk=1;k{maxi=k;maxj=k;floatmaxv=abs(a[k][k]);for(i=k;i〈=N;i++)for(intj=k;j〈=N;j++)if(abs(a[i][j])〉maxv){maxv=abs(a[i][j]);maxi=i;maxj=j;}if(maxi!=k){for(intj=1;j<=N+1;j++){floatt=a[k][j];a[k][j]=a[maxi][j];a[maxi][j]=t;}}if(maxj!=k){for(i=1;i〈=N;i++){floatt=a[i][k];a[i][k]=a[i][maxj];a[i][maxj]=t;}intt=z[k];z[k]=z[maxj];z[maxj]=t;}for(inti=k+1;i<=N;i++){floatl=a[i][k]/a[k][k];for(intj=k;j〈=N+1;j++){a[i][j]+=—l*a[k][j];}}}for(i=N;i〉0;i—-){floats=0;for(intj=i+1;j〈=N;j++){s+=a[i][j]*x[z[j]];}x[z[i]]=(a[i][N+1]-s)/a[i][i];}cout<〈"完全主元素消去法之后的矩阵为:”〈shuchu();for(i=1;i〈=N;i++)cout〈〈"x["〈〈i〈<"]="<}2.列主元素消元法:#include”stdio.h”intmain(){floata[3][4]={{1,2,3,14},{0,1,2,8},{2,4,1,13}};floatx[3];floatsum=0;intk,i,j;for(k=0;k<2;k++)for(i=k+1;i〈3;i++)for(j=k+1;j〈4;j++)a[i][j]=a[i][j]-a[i][k]/a[k][k]*a[k][j];for(i=0;i〈3;i++){for(j=0;j〈4;j++){printf("a[%d][%d]=%f”,i,j,a[i][j]);}printf("\n”);}x[2]=a[2][3]/a[2][2];for(k=1;k〉=0;k—-){sum=0;for(j=k+1;j〈3;j++){sum+=a[k][j]*x[j];}x[k]=(a[k][3]-sum)/a[k][k];}for(i=0;i〈3;i++){printf(”x[%d]=%f\n",i+1,x[i]);}printf(”\n”);}3。LU分解法:#include〈stdio。h〉#includeh〉#defineL30doublea[L][L],b[L],l[L][L],u[L][L],x[L],y[L];intmain(){intn,i,j,k,r;printf(”请输入矩阵元次:\n”);scanf("%d”,&n);printf(”请输入矩阵各项:\n");for(i=1;i〈=n;++i){for(j=1;j<=n;++j){scanf(”%lf”,&a[i][j]);}}printf("请输入方程组的常数项:\n”);for(i=1;i<=n;++i){scanf("%lf”,&b[i]);}for(i=1;i〈=n;++i){for(j=1;j<=n;++j){l[i][j]=0;u[i][j]=0.0;}}for(k=1;k〈=n;++k){for(j=k;j<=n;++j){u[k][j]=a[k][j];for(r=1;r{u[k][j]—=l[k][r]*u[r][j];}}for(i=k+1;i〈=n;++i){l[i][k]=a[i][k];for(r=1;r{l[i][k]-=l[i][r]*u[r][k];}l[i][k]/=u[k][k];}l[k][k]=1。0;}for(i=1;i〈=n;++i){y[i]=b[i];for(j=1;j{y[i]-=l[i][j]*y[j];}}for(i=n;i〉0;-—i){x[i]=y[i];for(j=i+1;j<=n;++j){x[i]-=u[i][j]*x[j];}x[i]/=u[i][i];}for(i=1;i〈=n;++i){printf(”%0.2lf\n",x[i]);}return0;}五、实验结果与分析完全主元素消元法:列主元素消元法:LU分解法:分析:对于两种高斯解方程,完全主元素跟列主元素都是先消元、再回代,由程序段可以发现,始终消去对角线下方的元素.即,为了节约内存及时效,可以不必计算出主元素下方数据。列主元素消元法的算法设计上优于完全主元素消元法,它只需依次按列选主元素然后换行使之变到主元素位置,再进行消元即可。列主元素消元法的耗时比完全主元素法少很多,常采用之。对于LU分解法,分解矩阵为单位下三角阵L与上三角阵U的乘积,然后解方程组Ly=b,回代,解方程组Ux=y。其中的L为n阶单位下三角阵、U为上三角阵。六、讨论、心得本次试验中,感觉是最难的一次,完全主元素消元法程序编写过程相对来说花了好长时间.纠正各种语法、算法、思路错误。最后勉强成功,但还是有几处警告,不得解决之法。感到程序学习的不足,再加之对高斯的不甚了解。编写过程很是痛苦。查阅各种内外部资料,这点有利有弊。突然觉得,应该再把数据结构之类的重新学习一下才行。以后多花时间在编程吧,重在理解。必须反省一下自己的C、C++学习了,还是得多加练习,平时必须养成一种好的算法思维习惯。实验地点虎峪校区致远楼B401指导教师xx太原理工大学学生实验报告学院名称软件学院专业班级1217班学号201200xxxx学生姓名xx实验日期2014.06.04成绩课程名称数值计算方法实验题目实验三线性方程组的迭代解法一、实验目的和要求使用雅可比迭代法或高斯-赛德尔迭代法对下列方程组进行求解。二、主要设备笔记本HPProBook6470b一台编译软件:VC++6.0三、实验内容和原理设线性方程组Ax=b的系数矩阵A可逆,且主对角元素a11,a22,…,ann均不为零,令D=diag(a11,a22,…,ann)并将A分解成A=(A-D)+D从而线性方程组可写成Dx=(D—A)x+b则有迭代公式x(k+1)=B1x(k)+f1其中,B1=I-D-1A,f1=D—1b。 四、操作方法与实验步骤高斯—赛德尔迭代法#include”iostream”#include”iomanip”usingnamespacestd;intmain(){inti,j,k=0,m,n;doublet1,t2,e1,e2=0.0;cout<〈”请输入精度e:";cin〉〉e1;cout<<”请输入系数矩阵行数:”;cin〉>m;cout<〈"请输入系数矩阵列数:";cin〉〉n;cout〈〈endl;double(**a)=newdouble*[m];for(i=0;i〈=m;i++){a[i]=newdouble[n];}double(*b)=newdouble[m];double(*x)=newdouble[n];cout〈<”请输入系数矩阵:”<〈endl;cout<<"--—--—-—-—-———-———---—-——-—-————--——-—-———---—---—-—-----——-—"〈for(intnum1=0;num1{for(intnum2=0;num2{cin>〉a[num1][num2];}cout<〈endl;}cout<<"输入的系数矩阵为:"〈for(intnum3=0;num3〈m;num3++){for(intnum4=0;num4〈n;num4++){cout〈〈a[num3][num4]〈〈”";}cout<〈endl;}cout〈〈”请输入矩阵b:”〈for(intnum5=0;num5〈m;num5++){cin〉〉b[num5];}cout<<”输入的矩阵b为:”〈〈endl;for(intnum6=0;num6〈m;num6++){cout〈〈b[num6]〈〈"";}cout〈for(intnum7=0;num7{x[num7]=0.0000;}do{cout<〈”第"〈〈k<<"次迭代值:”;e2=0.0;for(i=0;i〈m;i++){doublesum=0.0;for(j=0;j{if(j!=i)sum+=a[i][j]*x[j];}t1=x[i];t2=e2;x[i]=(b[i]—sum)/a[i][i];e2=(x[i])—t1>=0?(x[i])—t1:t1-(x[i]);e2=(e2>=t2?e2:t2);cout<}cout<〈endl;k++;}while(e2>=e1&&k<30);cout〈〈”共迭代了”〈〈k〈〈”次";delete[]a;delete[]b;delete[]x;return0;} 雅克比迭代法: #includeh>#includeintmain(){floata[3][3]={{10,—1,—2},{—1,10,-2},{-1,—1,5}},b[3]={7.2,8。3,4.2};floatx[3]={0,0,0},sum;inti,j,k,n=3;printf("\t\tX[1]\t\tX[2]\t\tX[3]\n”);for(k=0;k〈8;k++){for(i=0;i<3;i++){sum=0;for(j=0;j{if(i==j)continue;sum=sum+a[i][j]*x[j];}x[i]=(b[i]-sum)/a[i][i];}printf(”第%d次迭代:\t”,k+1);for(i=0;i〈n;i++){printf("%f\t”,x[i]);}printf("\n”);}} 五、实验结果与分析高斯赛德尔迭代法: 雅克比迭代: 分析:使用高斯—赛德尔和雅克比迭代都可以求出方程组的解,但是利用高斯—赛德尔迭代法所需的迭代次数比雅克比迭代少,能够更早的达到精度要求。从程序中可以看出,雅克比定义的sum只有一个,而高斯赛德尔需要两个。时效性上后者要好些。六、讨论、心得这次试验算是比较成功,要归功于授课时候的认真听讲.程序编写之前,对书本的理论知识进行了进一步的探索。预习准备工作很彻底,自然随后的一切也都很顺利。实验地点虎峪校区致远楼B401指导教师xx太原理工大学学生实验报告学院名称软件学院专业班级1217班学号201200xxxx学生姓名xx实验日期2014.06。11成绩课程名称数值计算方法实验题目实验四代数插值和最小二乘法拟合一、实验目的和要求(1)使用拉格朗日插值法或牛顿插值法求解:已知f(x)在6个点的函数值如下表所示,运用插值方法,求f(0.596)的近似值。X0.400。550。650.800.901.05f(x)0.410750.578150。696750.888111.026521.25386(2)给定数据点(xi,yi),用最小二乘法拟合数据的多项式,并求平方误差。xi00.50.60。70。80.91。0yi11。751。962.192.442。713。00 二、主要设备笔记本HPProBook6470b一台编译软件:VC++6.0三、实验内容和原理(1)设函数在区间[a,b]上n+1互异节点x0,x1,…,xn上的函数值分别为y0,y1,…,yn,求n次插值多项式Pn(x),满足条件Pn(xj)=yj,j=0,1,…,n令Ln(x)=y0l0(x)+y1l1(x)+…+ynln(x)=∑yili(x)其中l0(x),l1(x),…,ln(x)为以x0,x1,…,xn为节点的n次插值基函数,则Ln(x)是一次数不超过n的多项式,且满足Ln(xj)=yj,L=0,1,…,n再由插值多项式的唯一性,得Pn(x)≡Ln(x)(2)建立正规方程组:∑(∑xij+k)ak=∑xijyi,j=0,1,…,n平方误差:I=∑(∑akxik—yi)2对给定数据点{(Xi,Yi)}(i=0,1,…,m),在取定的函数类Φ中,求p(x)∈Φ,使误差的平方和E2最小,E2=∑[p(Xi)—Yi]2。从几何意义上讲,就是寻求与给定点{(Xi,Yi)}(i=0,1,…,m)的距离平方和为最小的曲线y=p(x)。函数p(x)称为拟合函数或最小二乘解,求拟合函数p(x)的方法称为曲线拟合的最小二乘法.得到的两个关于a0、a1为未知数的两个方程组,解这两个方程组得出:a0=(∑Yi)/m-a1(∑Xi)/ma1=[m∑XiYi—(∑Xi∑Yi)]/[m∑Xi2-(∑Xi)2)]即最终的拟合多项式各项系数。四、操作方法与实验步骤(1)代数插值#include〈stdio.h〉#include#include〈conio.h〉#include〈alloc.h〉voiddifference(float*x,float*y,intn){float*f;intk,i;f=(floa
voidshuru()
cout〈<”请输入矩阵阶数:
”<〈endl;
cin〉>N;
cout<〈”请输入矩阵各项:
"〈〈endl;
for(inti=1;i<=N;i++)
for(intj=1;j〈=N+1;j++)
cin〉>a[i][j];
cout〈}voidmain(){intz[10];intmaxi,maxj;shuru();for(inti=1;i<=N;i++)z[i]=i;for(intk=1;k{maxi=k;maxj=k;floatmaxv=abs(a[k][k]);for(i=k;i〈=N;i++)for(intj=k;j〈=N;j++)if(abs(a[i][j])〉maxv){maxv=abs(a[i][j]);maxi=i;maxj=j;}if(maxi!=k){for(intj=1;j<=N+1;j++){floatt=a[k][j];a[k][j]=a[maxi][j];a[maxi][j]=t;}}if(maxj!=k){for(i=1;i〈=N;i++){floatt=a[i][k];a[i][k]=a[i][maxj];a[i][maxj]=t;}intt=z[k];z[k]=z[maxj];z[maxj]=t;}for(inti=k+1;i<=N;i++){floatl=a[i][k]/a[k][k];for(intj=k;j〈=N+1;j++){a[i][j]+=—l*a[k][j];}}}for(i=N;i〉0;i—-){floats=0;for(intj=i+1;j〈=N;j++){s+=a[i][j]*x[z[j]];}x[z[i]]=(a[i][N+1]-s)/a[i][i];}cout<〈"完全主元素消去法之后的矩阵为:”〈shuchu();for(i=1;i〈=N;i++)cout〈〈"x["〈〈i〈<"]="<}2.列主元素消元法:#include”stdio.h”intmain(){floata[3][4]={{1,2,3,14},{0,1,2,8},{2,4,1,13}};floatx[3];floatsum=0;intk,i,j;for(k=0;k<2;k++)for(i=k+1;i〈3;i++)for(j=k+1;j〈4;j++)a[i][j]=a[i][j]-a[i][k]/a[k][k]*a[k][j];for(i=0;i〈3;i++){for(j=0;j〈4;j++){printf("a[%d][%d]=%f”,i,j,a[i][j]);}printf("\n”);}x[2]=a[2][3]/a[2][2];for(k=1;k〉=0;k—-){sum=0;for(j=k+1;j〈3;j++){sum+=a[k][j]*x[j];}x[k]=(a[k][3]-sum)/a[k][k];}for(i=0;i〈3;i++){printf(”x[%d]=%f\n",i+1,x[i]);}printf(”\n”);}3。LU分解法:#include〈stdio。h〉#includeh〉#defineL30doublea[L][L],b[L],l[L][L],u[L][L],x[L],y[L];intmain(){intn,i,j,k,r;printf(”请输入矩阵元次:\n”);scanf("%d”,&n);printf(”请输入矩阵各项:\n");for(i=1;i〈=n;++i){for(j=1;j<=n;++j){scanf(”%lf”,&a[i][j]);}}printf("请输入方程组的常数项:\n”);for(i=1;i<=n;++i){scanf("%lf”,&b[i]);}for(i=1;i〈=n;++i){for(j=1;j<=n;++j){l[i][j]=0;u[i][j]=0.0;}}for(k=1;k〈=n;++k){for(j=k;j<=n;++j){u[k][j]=a[k][j];for(r=1;r{u[k][j]—=l[k][r]*u[r][j];}}for(i=k+1;i〈=n;++i){l[i][k]=a[i][k];for(r=1;r{l[i][k]-=l[i][r]*u[r][k];}l[i][k]/=u[k][k];}l[k][k]=1。0;}for(i=1;i〈=n;++i){y[i]=b[i];for(j=1;j{y[i]-=l[i][j]*y[j];}}for(i=n;i〉0;-—i){x[i]=y[i];for(j=i+1;j<=n;++j){x[i]-=u[i][j]*x[j];}x[i]/=u[i][i];}for(i=1;i〈=n;++i){printf(”%0.2lf\n",x[i]);}return0;}五、实验结果与分析完全主元素消元法:列主元素消元法:LU分解法:分析:对于两种高斯解方程,完全主元素跟列主元素都是先消元、再回代,由程序段可以发现,始终消去对角线下方的元素.即,为了节约内存及时效,可以不必计算出主元素下方数据。列主元素消元法的算法设计上优于完全主元素消元法,它只需依次按列选主元素然后换行使之变到主元素位置,再进行消元即可。列主元素消元法的耗时比完全主元素法少很多,常采用之。对于LU分解法,分解矩阵为单位下三角阵L与上三角阵U的乘积,然后解方程组Ly=b,回代,解方程组Ux=y。其中的L为n阶单位下三角阵、U为上三角阵。六、讨论、心得本次试验中,感觉是最难的一次,完全主元素消元法程序编写过程相对来说花了好长时间.纠正各种语法、算法、思路错误。最后勉强成功,但还是有几处警告,不得解决之法。感到程序学习的不足,再加之对高斯的不甚了解。编写过程很是痛苦。查阅各种内外部资料,这点有利有弊。突然觉得,应该再把数据结构之类的重新学习一下才行。以后多花时间在编程吧,重在理解。必须反省一下自己的C、C++学习了,还是得多加练习,平时必须养成一种好的算法思维习惯。实验地点虎峪校区致远楼B401指导教师xx太原理工大学学生实验报告学院名称软件学院专业班级1217班学号201200xxxx学生姓名xx实验日期2014.06.04成绩课程名称数值计算方法实验题目实验三线性方程组的迭代解法一、实验目的和要求使用雅可比迭代法或高斯-赛德尔迭代法对下列方程组进行求解。二、主要设备笔记本HPProBook6470b一台编译软件:VC++6.0三、实验内容和原理设线性方程组Ax=b的系数矩阵A可逆,且主对角元素a11,a22,…,ann均不为零,令D=diag(a11,a22,…,ann)并将A分解成A=(A-D)+D从而线性方程组可写成Dx=(D—A)x+b则有迭代公式x(k+1)=B1x(k)+f1其中,B1=I-D-1A,f1=D—1b。 四、操作方法与实验步骤高斯—赛德尔迭代法#include”iostream”#include”iomanip”usingnamespacestd;intmain(){inti,j,k=0,m,n;doublet1,t2,e1,e2=0.0;cout<〈”请输入精度e:";cin〉〉e1;cout<<”请输入系数矩阵行数:”;cin〉>m;cout<〈"请输入系数矩阵列数:";cin〉〉n;cout〈〈endl;double(**a)=newdouble*[m];for(i=0;i〈=m;i++){a[i]=newdouble[n];}double(*b)=newdouble[m];double(*x)=newdouble[n];cout〈<”请输入系数矩阵:”<〈endl;cout<<"--—--—-—-—-———-———---—-——-—-————--——-—-———---—---—-—-----——-—"〈for(intnum1=0;num1{for(intnum2=0;num2{cin>〉a[num1][num2];}cout<〈endl;}cout<<"输入的系数矩阵为:"〈for(intnum3=0;num3〈m;num3++){for(intnum4=0;num4〈n;num4++){cout〈〈a[num3][num4]〈〈”";}cout<〈endl;}cout〈〈”请输入矩阵b:”〈for(intnum5=0;num5〈m;num5++){cin〉〉b[num5];}cout<<”输入的矩阵b为:”〈〈endl;for(intnum6=0;num6〈m;num6++){cout〈〈b[num6]〈〈"";}cout〈for(intnum7=0;num7{x[num7]=0.0000;}do{cout<〈”第"〈〈k<<"次迭代值:”;e2=0.0;for(i=0;i〈m;i++){doublesum=0.0;for(j=0;j{if(j!=i)sum+=a[i][j]*x[j];}t1=x[i];t2=e2;x[i]=(b[i]—sum)/a[i][i];e2=(x[i])—t1>=0?(x[i])—t1:t1-(x[i]);e2=(e2>=t2?e2:t2);cout<}cout<〈endl;k++;}while(e2>=e1&&k<30);cout〈〈”共迭代了”〈〈k〈〈”次";delete[]a;delete[]b;delete[]x;return0;} 雅克比迭代法: #includeh>#includeintmain(){floata[3][3]={{10,—1,—2},{—1,10,-2},{-1,—1,5}},b[3]={7.2,8。3,4.2};floatx[3]={0,0,0},sum;inti,j,k,n=3;printf("\t\tX[1]\t\tX[2]\t\tX[3]\n”);for(k=0;k〈8;k++){for(i=0;i<3;i++){sum=0;for(j=0;j{if(i==j)continue;sum=sum+a[i][j]*x[j];}x[i]=(b[i]-sum)/a[i][i];}printf(”第%d次迭代:\t”,k+1);for(i=0;i〈n;i++){printf("%f\t”,x[i]);}printf("\n”);}} 五、实验结果与分析高斯赛德尔迭代法: 雅克比迭代: 分析:使用高斯—赛德尔和雅克比迭代都可以求出方程组的解,但是利用高斯—赛德尔迭代法所需的迭代次数比雅克比迭代少,能够更早的达到精度要求。从程序中可以看出,雅克比定义的sum只有一个,而高斯赛德尔需要两个。时效性上后者要好些。六、讨论、心得这次试验算是比较成功,要归功于授课时候的认真听讲.程序编写之前,对书本的理论知识进行了进一步的探索。预习准备工作很彻底,自然随后的一切也都很顺利。实验地点虎峪校区致远楼B401指导教师xx太原理工大学学生实验报告学院名称软件学院专业班级1217班学号201200xxxx学生姓名xx实验日期2014.06。11成绩课程名称数值计算方法实验题目实验四代数插值和最小二乘法拟合一、实验目的和要求(1)使用拉格朗日插值法或牛顿插值法求解:已知f(x)在6个点的函数值如下表所示,运用插值方法,求f(0.596)的近似值。X0.400。550。650.800.901.05f(x)0.410750.578150。696750.888111.026521.25386(2)给定数据点(xi,yi),用最小二乘法拟合数据的多项式,并求平方误差。xi00.50.60。70。80.91。0yi11。751。962.192.442。713。00 二、主要设备笔记本HPProBook6470b一台编译软件:VC++6.0三、实验内容和原理(1)设函数在区间[a,b]上n+1互异节点x0,x1,…,xn上的函数值分别为y0,y1,…,yn,求n次插值多项式Pn(x),满足条件Pn(xj)=yj,j=0,1,…,n令Ln(x)=y0l0(x)+y1l1(x)+…+ynln(x)=∑yili(x)其中l0(x),l1(x),…,ln(x)为以x0,x1,…,xn为节点的n次插值基函数,则Ln(x)是一次数不超过n的多项式,且满足Ln(xj)=yj,L=0,1,…,n再由插值多项式的唯一性,得Pn(x)≡Ln(x)(2)建立正规方程组:∑(∑xij+k)ak=∑xijyi,j=0,1,…,n平方误差:I=∑(∑akxik—yi)2对给定数据点{(Xi,Yi)}(i=0,1,…,m),在取定的函数类Φ中,求p(x)∈Φ,使误差的平方和E2最小,E2=∑[p(Xi)—Yi]2。从几何意义上讲,就是寻求与给定点{(Xi,Yi)}(i=0,1,…,m)的距离平方和为最小的曲线y=p(x)。函数p(x)称为拟合函数或最小二乘解,求拟合函数p(x)的方法称为曲线拟合的最小二乘法.得到的两个关于a0、a1为未知数的两个方程组,解这两个方程组得出:a0=(∑Yi)/m-a1(∑Xi)/ma1=[m∑XiYi—(∑Xi∑Yi)]/[m∑Xi2-(∑Xi)2)]即最终的拟合多项式各项系数。四、操作方法与实验步骤(1)代数插值#include〈stdio.h〉#include#include〈conio.h〉#include〈alloc.h〉voiddifference(float*x,float*y,intn){float*f;intk,i;f=(floa
voidmain()
intz[10];
intmaxi,maxj;
shuru();
for(inti=1;i<=N;i++)
z[i]=i;
for(intk=1;k{maxi=k;maxj=k;floatmaxv=abs(a[k][k]);for(i=k;i〈=N;i++)for(intj=k;j〈=N;j++)if(abs(a[i][j])〉maxv){maxv=abs(a[i][j]);maxi=i;maxj=j;}if(maxi!=k){for(intj=1;j<=N+1;j++){floatt=a[k][j];a[k][j]=a[maxi][j];a[maxi][j]=t;}}if(maxj!=k){for(i=1;i〈=N;i++){floatt=a[i][k];a[i][k]=a[i][maxj];a[i][maxj]=t;}intt=z[k];z[k]=z[maxj];z[maxj]=t;}for(inti=k+1;i<=N;i++){floatl=a[i][k]/a[k][k];for(intj=k;j〈=N+1;j++){a[i][j]+=—l*a[k][j];}}}for(i=N;i〉0;i—-){floats=0;for(intj=i+1;j〈=N;j++){s+=a[i][j]*x[z[j]];}x[z[i]]=(a[i][N+1]-s)/a[i][i];}cout<〈"完全主元素消去法之后的矩阵为:”〈shuchu();for(i=1;i〈=N;i++)cout〈〈"x["〈〈i〈<"]="<}2.列主元素消元法:#include”stdio.h”intmain(){floata[3][4]={{1,2,3,14},{0,1,2,8},{2,4,1,13}};floatx[3];floatsum=0;intk,i,j;for(k=0;k<2;k++)for(i=k+1;i〈3;i++)for(j=k+1;j〈4;j++)a[i][j]=a[i][j]-a[i][k]/a[k][k]*a[k][j];for(i=0;i〈3;i++){for(j=0;j〈4;j++){printf("a[%d][%d]=%f”,i,j,a[i][j]);}printf("\n”);}x[2]=a[2][3]/a[2][2];for(k=1;k〉=0;k—-){sum=0;for(j=k+1;j〈3;j++){sum+=a[k][j]*x[j];}x[k]=(a[k][3]-sum)/a[k][k];}for(i=0;i〈3;i++){printf(”x[%d]=%f\n",i+1,x[i]);}printf(”\n”);}3。LU分解法:#include〈stdio。h〉#includeh〉#defineL30doublea[L][L],b[L],l[L][L],u[L][L],x[L],y[L];intmain(){intn,i,j,k,r;printf(”请输入矩阵元次:\n”);scanf("%d”,&n);printf(”请输入矩阵各项:\n");for(i=1;i〈=n;++i){for(j=1;j<=n;++j){scanf(”%lf”,&a[i][j]);}}printf("请输入方程组的常数项:\n”);for(i=1;i<=n;++i){scanf("%lf”,&b[i]);}for(i=1;i〈=n;++i){for(j=1;j<=n;++j){l[i][j]=0;u[i][j]=0.0;}}for(k=1;k〈=n;++k){for(j=k;j<=n;++j){u[k][j]=a[k][j];for(r=1;r{u[k][j]—=l[k][r]*u[r][j];}}for(i=k+1;i〈=n;++i){l[i][k]=a[i][k];for(r=1;r{l[i][k]-=l[i][r]*u[r][k];}l[i][k]/=u[k][k];}l[k][k]=1。0;}for(i=1;i〈=n;++i){y[i]=b[i];for(j=1;j{y[i]-=l[i][j]*y[j];}}for(i=n;i〉0;-—i){x[i]=y[i];for(j=i+1;j<=n;++j){x[i]-=u[i][j]*x[j];}x[i]/=u[i][i];}for(i=1;i〈=n;++i){printf(”%0.2lf\n",x[i]);}return0;}五、实验结果与分析完全主元素消元法:列主元素消元法:LU分解法:分析:对于两种高斯解方程,完全主元素跟列主元素都是先消元、再回代,由程序段可以发现,始终消去对角线下方的元素.即,为了节约内存及时效,可以不必计算出主元素下方数据。列主元素消元法的算法设计上优于完全主元素消元法,它只需依次按列选主元素然后换行使之变到主元素位置,再进行消元即可。列主元素消元法的耗时比完全主元素法少很多,常采用之。对于LU分解法,分解矩阵为单位下三角阵L与上三角阵U的乘积,然后解方程组Ly=b,回代,解方程组Ux=y。其中的L为n阶单位下三角阵、U为上三角阵。六、讨论、心得本次试验中,感觉是最难的一次,完全主元素消元法程序编写过程相对来说花了好长时间.纠正各种语法、算法、思路错误。最后勉强成功,但还是有几处警告,不得解决之法。感到程序学习的不足,再加之对高斯的不甚了解。编写过程很是痛苦。查阅各种内外部资料,这点有利有弊。突然觉得,应该再把数据结构之类的重新学习一下才行。以后多花时间在编程吧,重在理解。必须反省一下自己的C、C++学习了,还是得多加练习,平时必须养成一种好的算法思维习惯。实验地点虎峪校区致远楼B401指导教师xx太原理工大学学生实验报告学院名称软件学院专业班级1217班学号201200xxxx学生姓名xx实验日期2014.06.04成绩课程名称数值计算方法实验题目实验三线性方程组的迭代解法一、实验目的和要求使用雅可比迭代法或高斯-赛德尔迭代法对下列方程组进行求解。二、主要设备笔记本HPProBook6470b一台编译软件:VC++6.0三、实验内容和原理设线性方程组Ax=b的系数矩阵A可逆,且主对角元素a11,a22,…,ann均不为零,令D=diag(a11,a22,…,ann)并将A分解成A=(A-D)+D从而线性方程组可写成Dx=(D—A)x+b则有迭代公式x(k+1)=B1x(k)+f1其中,B1=I-D-1A,f1=D—1b。 四、操作方法与实验步骤高斯—赛德尔迭代法#include”iostream”#include”iomanip”usingnamespacestd;intmain(){inti,j,k=0,m,n;doublet1,t2,e1,e2=0.0;cout<〈”请输入精度e:";cin〉〉e1;cout<<”请输入系数矩阵行数:”;cin〉>m;cout<〈"请输入系数矩阵列数:";cin〉〉n;cout〈〈endl;double(**a)=newdouble*[m];for(i=0;i〈=m;i++){a[i]=newdouble[n];}double(*b)=newdouble[m];double(*x)=newdouble[n];cout〈<”请输入系数矩阵:”<〈endl;cout<<"--—--—-—-—-———-———---—-——-—-————--——-—-———---—---—-—-----——-—"〈for(intnum1=0;num1{for(intnum2=0;num2{cin>〉a[num1][num2];}cout<〈endl;}cout<<"输入的系数矩阵为:"〈for(intnum3=0;num3〈m;num3++){for(intnum4=0;num4〈n;num4++){cout〈〈a[num3][num4]〈〈”";}cout<〈endl;}cout〈〈”请输入矩阵b:”〈for(intnum5=0;num5〈m;num5++){cin〉〉b[num5];}cout<<”输入的矩阵b为:”〈〈endl;for(intnum6=0;num6〈m;num6++){cout〈〈b[num6]〈〈"";}cout〈for(intnum7=0;num7{x[num7]=0.0000;}do{cout<〈”第"〈〈k<<"次迭代值:”;e2=0.0;for(i=0;i〈m;i++){doublesum=0.0;for(j=0;j{if(j!=i)sum+=a[i][j]*x[j];}t1=x[i];t2=e2;x[i]=(b[i]—sum)/a[i][i];e2=(x[i])—t1>=0?(x[i])—t1:t1-(x[i]);e2=(e2>=t2?e2:t2);cout<}cout<〈endl;k++;}while(e2>=e1&&k<30);cout〈〈”共迭代了”〈〈k〈〈”次";delete[]a;delete[]b;delete[]x;return0;} 雅克比迭代法: #includeh>#includeintmain(){floata[3][3]={{10,—1,—2},{—1,10,-2},{-1,—1,5}},b[3]={7.2,8。3,4.2};floatx[3]={0,0,0},sum;inti,j,k,n=3;printf("\t\tX[1]\t\tX[2]\t\tX[3]\n”);for(k=0;k〈8;k++){for(i=0;i<3;i++){sum=0;for(j=0;j{if(i==j)continue;sum=sum+a[i][j]*x[j];}x[i]=(b[i]-sum)/a[i][i];}printf(”第%d次迭代:\t”,k+1);for(i=0;i〈n;i++){printf("%f\t”,x[i]);}printf("\n”);}} 五、实验结果与分析高斯赛德尔迭代法: 雅克比迭代: 分析:使用高斯—赛德尔和雅克比迭代都可以求出方程组的解,但是利用高斯—赛德尔迭代法所需的迭代次数比雅克比迭代少,能够更早的达到精度要求。从程序中可以看出,雅克比定义的sum只有一个,而高斯赛德尔需要两个。时效性上后者要好些。六、讨论、心得这次试验算是比较成功,要归功于授课时候的认真听讲.程序编写之前,对书本的理论知识进行了进一步的探索。预习准备工作很彻底,自然随后的一切也都很顺利。实验地点虎峪校区致远楼B401指导教师xx太原理工大学学生实验报告学院名称软件学院专业班级1217班学号201200xxxx学生姓名xx实验日期2014.06。11成绩课程名称数值计算方法实验题目实验四代数插值和最小二乘法拟合一、实验目的和要求(1)使用拉格朗日插值法或牛顿插值法求解:已知f(x)在6个点的函数值如下表所示,运用插值方法,求f(0.596)的近似值。X0.400。550。650.800.901.05f(x)0.410750.578150。696750.888111.026521.25386(2)给定数据点(xi,yi),用最小二乘法拟合数据的多项式,并求平方误差。xi00.50.60。70。80.91。0yi11。751。962.192.442。713。00 二、主要设备笔记本HPProBook6470b一台编译软件:VC++6.0三、实验内容和原理(1)设函数在区间[a,b]上n+1互异节点x0,x1,…,xn上的函数值分别为y0,y1,…,yn,求n次插值多项式Pn(x),满足条件Pn(xj)=yj,j=0,1,…,n令Ln(x)=y0l0(x)+y1l1(x)+…+ynln(x)=∑yili(x)其中l0(x),l1(x),…,ln(x)为以x0,x1,…,xn为节点的n次插值基函数,则Ln(x)是一次数不超过n的多项式,且满足Ln(xj)=yj,L=0,1,…,n再由插值多项式的唯一性,得Pn(x)≡Ln(x)(2)建立正规方程组:∑(∑xij+k)ak=∑xijyi,j=0,1,…,n平方误差:I=∑(∑akxik—yi)2对给定数据点{(Xi,Yi)}(i=0,1,…,m),在取定的函数类Φ中,求p(x)∈Φ,使误差的平方和E2最小,E2=∑[p(Xi)—Yi]2。从几何意义上讲,就是寻求与给定点{(Xi,Yi)}(i=0,1,…,m)的距离平方和为最小的曲线y=p(x)。函数p(x)称为拟合函数或最小二乘解,求拟合函数p(x)的方法称为曲线拟合的最小二乘法.得到的两个关于a0、a1为未知数的两个方程组,解这两个方程组得出:a0=(∑Yi)/m-a1(∑Xi)/ma1=[m∑XiYi—(∑Xi∑Yi)]/[m∑Xi2-(∑Xi)2)]即最终的拟合多项式各项系数。四、操作方法与实验步骤(1)代数插值#include〈stdio.h〉#include#include〈conio.h〉#include〈alloc.h〉voiddifference(float*x,float*y,intn){float*f;intk,i;f=(floa
maxi=k;maxj=k;floatmaxv=abs(a[k][k]);
for(i=k;i〈=N;i++)
for(intj=k;j〈=N;j++)
if(abs(a[i][j])〉maxv)
maxv=abs(a[i][j]);maxi=i;maxj=j;
if(maxi!
=k)
for(intj=1;j<=N+1;j++)
floatt=a[k][j];a[k][j]=a[maxi][j];a[maxi][j]=t;
if(maxj!
for(i=1;i〈=N;i++)
floatt=a[i][k];a[i][k]=a[i][maxj];a[i][maxj]=t;
intt=z[k];z[k]=z[maxj];z[maxj]=t;
for(inti=k+1;i<=N;i++)
floatl=a[i][k]/a[k][k];
for(intj=k;j〈=N+1;j++)
a[i][j]+=—l*a[k][j];
for(i=N;i〉0;i—-)
floats=0;
for(intj=i+1;j〈=N;j++)
s+=a[i][j]*x[z[j]];
x[z[i]]=(a[i][N+1]-s)/a[i][i];
cout<〈"完全主元素消去法之后的矩阵为:
”〈shuchu();for(i=1;i〈=N;i++)cout〈〈"x["〈〈i〈<"]="<}2.列主元素消元法:#include”stdio.h”intmain(){floata[3][4]={{1,2,3,14},{0,1,2,8},{2,4,1,13}};floatx[3];floatsum=0;intk,i,j;for(k=0;k<2;k++)for(i=k+1;i〈3;i++)for(j=k+1;j〈4;j++)a[i][j]=a[i][j]-a[i][k]/a[k][k]*a[k][j];for(i=0;i〈3;i++){for(j=0;j〈4;j++){printf("a[%d][%d]=%f”,i,j,a[i][j]);}printf("\n”);}x[2]=a[2][3]/a[2][2];for(k=1;k〉=0;k—-){sum=0;for(j=k+1;j〈3;j++){sum+=a[k][j]*x[j];}x[k]=(a[k][3]-sum)/a[k][k];}for(i=0;i〈3;i++){printf(”x[%d]=%f\n",i+1,x[i]);}printf(”\n”);}3。LU分解法:#include〈stdio。h〉#includeh〉#defineL30doublea[L][L],b[L],l[L][L],u[L][L],x[L],y[L];intmain(){intn,i,j,k,r;printf(”请输入矩阵元次:\n”);scanf("%d”,&n);printf(”请输入矩阵各项:\n");for(i=1;i〈=n;++i){for(j=1;j<=n;++j){scanf(”%lf”,&a[i][j]);}}printf("请输入方程组的常数项:\n”);for(i=1;i<=n;++i){scanf("%lf”,&b[i]);}for(i=1;i〈=n;++i){for(j=1;j<=n;++j){l[i][j]=0;u[i][j]=0.0;}}for(k=1;k〈=n;++k){for(j=k;j<=n;++j){u[k][j]=a[k][j];for(r=1;r{u[k][j]—=l[k][r]*u[r][j];}}for(i=k+1;i〈=n;++i){l[i][k]=a[i][k];for(r=1;r{l[i][k]-=l[i][r]*u[r][k];}l[i][k]/=u[k][k];}l[k][k]=1。0;}for(i=1;i〈=n;++i){y[i]=b[i];for(j=1;j{y[i]-=l[i][j]*y[j];}}for(i=n;i〉0;-—i){x[i]=y[i];for(j=i+1;j<=n;++j){x[i]-=u[i][j]*x[j];}x[i]/=u[i][i];}for(i=1;i〈=n;++i){printf(”%0.2lf\n",x[i]);}return0;}五、实验结果与分析完全主元素消元法:列主元素消元法:LU分解法:分析:对于两种高斯解方程,完全主元素跟列主元素都是先消元、再回代,由程序段可以发现,始终消去对角线下方的元素.即,为了节约内存及时效,可以不必计算出主元素下方数据。列主元素消元法的算法设计上优于完全主元素消元法,它只需依次按列选主元素然后换行使之变到主元素位置,再进行消元即可。列主元素消元法的耗时比完全主元素法少很多,常采用之。对于LU分解法,分解矩阵为单位下三角阵L与上三角阵U的乘积,然后解方程组Ly=b,回代,解方程组Ux=y。其中的L为n阶单位下三角阵、U为上三角阵。六、讨论、心得本次试验中,感觉是最难的一次,完全主元素消元法程序编写过程相对来说花了好长时间.纠正各种语法、算法、思路错误。最后勉强成功,但还是有几处警告,不得解决之法。感到程序学习的不足,再加之对高斯的不甚了解。编写过程很是痛苦。查阅各种内外部资料,这点有利有弊。突然觉得,应该再把数据结构之类的重新学习一下才行。以后多花时间在编程吧,重在理解。必须反省一下自己的C、C++学习了,还是得多加练习,平时必须养成一种好的算法思维习惯。实验地点虎峪校区致远楼B401指导教师xx太原理工大学学生实验报告学院名称软件学院专业班级1217班学号201200xxxx学生姓名xx实验日期2014.06.04成绩课程名称数值计算方法实验题目实验三线性方程组的迭代解法一、实验目的和要求使用雅可比迭代法或高斯-赛德尔迭代法对下列方程组进行求解。二、主要设备笔记本HPProBook6470b一台编译软件:VC++6.0三、实验内容和原理设线性方程组Ax=b的系数矩阵A可逆,且主对角元素a11,a22,…,ann均不为零,令D=diag(a11,a22,…,ann)并将A分解成A=(A-D)+D从而线性方程组可写成Dx=(D—A)x+b则有迭代公式x(k+1)=B1x(k)+f1其中,B1=I-D-1A,f1=D—1b。 四、操作方法与实验步骤高斯—赛德尔迭代法#include”iostream”#include”iomanip”usingnamespacestd;intmain(){inti,j,k=0,m,n;doublet1,t2,e1,e2=0.0;cout<〈”请输入精度e:";cin〉〉e1;cout<<”请输入系数矩阵行数:”;cin〉>m;cout<〈"请输入系数矩阵列数:";cin〉〉n;cout〈〈endl;double(**a)=newdouble*[m];for(i=0;i〈=m;i++){a[i]=newdouble[n];}double(*b)=newdouble[m];double(*x)=newdouble[n];cout〈<”请输入系数矩阵:”<〈endl;cout<<"--—--—-—-—-———-———---—-——-—-————--——-—-———---—---—-—-----——-—"〈for(intnum1=0;num1{for(intnum2=0;num2{cin>〉a[num1][num2];}cout<〈endl;}cout<<"输入的系数矩阵为:"〈for(intnum3=0;num3〈m;num3++){for(intnum4=0;num4〈n;num4++){cout〈〈a[num3][num4]〈〈”";}cout<〈endl;}cout〈〈”请输入矩阵b:”〈for(intnum5=0;num5〈m;num5++){cin〉〉b[num5];}cout<<”输入的矩阵b为:”〈〈endl;for(intnum6=0;num6〈m;num6++){cout〈〈b[num6]〈〈"";}cout〈for(intnum7=0;num7{x[num7]=0.0000;}do{cout<〈”第"〈〈k<<"次迭代值:”;e2=0.0;for(i=0;i〈m;i++){doublesum=0.0;for(j=0;j{if(j!=i)sum+=a[i][j]*x[j];}t1=x[i];t2=e2;x[i]=(b[i]—sum)/a[i][i];e2=(x[i])—t1>=0?(x[i])—t1:t1-(x[i]);e2=(e2>=t2?e2:t2);cout<}cout<〈endl;k++;}while(e2>=e1&&k<30);cout〈〈”共迭代了”〈〈k〈〈”次";delete[]a;delete[]b;delete[]x;return0;} 雅克比迭代法: #includeh>#includeintmain(){floata[3][3]={{10,—1,—2},{—1,10,-2},{-1,—1,5}},b[3]={7.2,8。3,4.2};floatx[3]={0,0,0},sum;inti,j,k,n=3;printf("\t\tX[1]\t\tX[2]\t\tX[3]\n”);for(k=0;k〈8;k++){for(i=0;i<3;i++){sum=0;for(j=0;j{if(i==j)continue;sum=sum+a[i][j]*x[j];}x[i]=(b[i]-sum)/a[i][i];}printf(”第%d次迭代:\t”,k+1);for(i=0;i〈n;i++){printf("%f\t”,x[i]);}printf("\n”);}} 五、实验结果与分析高斯赛德尔迭代法: 雅克比迭代: 分析:使用高斯—赛德尔和雅克比迭代都可以求出方程组的解,但是利用高斯—赛德尔迭代法所需的迭代次数比雅克比迭代少,能够更早的达到精度要求。从程序中可以看出,雅克比定义的sum只有一个,而高斯赛德尔需要两个。时效性上后者要好些。六、讨论、心得这次试验算是比较成功,要归功于授课时候的认真听讲.程序编写之前,对书本的理论知识进行了进一步的探索。预习准备工作很彻底,自然随后的一切也都很顺利。实验地点虎峪校区致远楼B401指导教师xx太原理工大学学生实验报告学院名称软件学院专业班级1217班学号201200xxxx学生姓名xx实验日期2014.06。11成绩课程名称数值计算方法实验题目实验四代数插值和最小二乘法拟合一、实验目的和要求(1)使用拉格朗日插值法或牛顿插值法求解:已知f(x)在6个点的函数值如下表所示,运用插值方法,求f(0.596)的近似值。X0.400。550。650.800.901.05f(x)0.410750.578150。696750.888111.026521.25386(2)给定数据点(xi,yi),用最小二乘法拟合数据的多项式,并求平方误差。xi00.50.60。70。80.91。0yi11。751。962.192.442。713。00 二、主要设备笔记本HPProBook6470b一台编译软件:VC++6.0三、实验内容和原理(1)设函数在区间[a,b]上n+1互异节点x0,x1,…,xn上的函数值分别为y0,y1,…,yn,求n次插值多项式Pn(x),满足条件Pn(xj)=yj,j=0,1,…,n令Ln(x)=y0l0(x)+y1l1(x)+…+ynln(x)=∑yili(x)其中l0(x),l1(x),…,ln(x)为以x0,x1,…,xn为节点的n次插值基函数,则Ln(x)是一次数不超过n的多项式,且满足Ln(xj)=yj,L=0,1,…,n再由插值多项式的唯一性,得Pn(x)≡Ln(x)(2)建立正规方程组:∑(∑xij+k)ak=∑xijyi,j=0,1,…,n平方误差:I=∑(∑akxik—yi)2对给定数据点{(Xi,Yi)}(i=0,1,…,m),在取定的函数类Φ中,求p(x)∈Φ,使误差的平方和E2最小,E2=∑[p(Xi)—Yi]2。从几何意义上讲,就是寻求与给定点{(Xi,Yi)}(i=0,1,…,m)的距离平方和为最小的曲线y=p(x)。函数p(x)称为拟合函数或最小二乘解,求拟合函数p(x)的方法称为曲线拟合的最小二乘法.得到的两个关于a0、a1为未知数的两个方程组,解这两个方程组得出:a0=(∑Yi)/m-a1(∑Xi)/ma1=[m∑XiYi—(∑Xi∑Yi)]/[m∑Xi2-(∑Xi)2)]即最终的拟合多项式各项系数。四、操作方法与实验步骤(1)代数插值#include〈stdio.h〉#include#include〈conio.h〉#include〈alloc.h〉voiddifference(float*x,float*y,intn){float*f;intk,i;f=(floa
shuchu();
for(i=1;i〈=N;i++)
cout〈〈"x["〈〈i〈<"]="<}2.列主元素消元法:#include”stdio.h”intmain(){floata[3][4]={{1,2,3,14},{0,1,2,8},{2,4,1,13}};floatx[3];floatsum=0;intk,i,j;for(k=0;k<2;k++)for(i=k+1;i〈3;i++)for(j=k+1;j〈4;j++)a[i][j]=a[i][j]-a[i][k]/a[k][k]*a[k][j];for(i=0;i〈3;i++){for(j=0;j〈4;j++){printf("a[%d][%d]=%f”,i,j,a[i][j]);}printf("\n”);}x[2]=a[2][3]/a[2][2];for(k=1;k〉=0;k—-){sum=0;for(j=k+1;j〈3;j++){sum+=a[k][j]*x[j];}x[k]=(a[k][3]-sum)/a[k][k];}for(i=0;i〈3;i++){printf(”x[%d]=%f\n",i+1,x[i]);}printf(”\n”);}3。LU分解法:#include〈stdio。h〉#includeh〉#defineL30doublea[L][L],b[L],l[L][L],u[L][L],x[L],y[L];intmain(){intn,i,j,k,r;printf(”请输入矩阵元次:\n”);scanf("%d”,&n);printf(”请输入矩阵各项:\n");for(i=1;i〈=n;++i){for(j=1;j<=n;++j){scanf(”%lf”,&a[i][j]);}}printf("请输入方程组的常数项:\n”);for(i=1;i<=n;++i){scanf("%lf”,&b[i]);}for(i=1;i〈=n;++i){for(j=1;j<=n;++j){l[i][j]=0;u[i][j]=0.0;}}for(k=1;k〈=n;++k){for(j=k;j<=n;++j){u[k][j]=a[k][j];for(r=1;r{u[k][j]—=l[k][r]*u[r][j];}}for(i=k+1;i〈=n;++i){l[i][k]=a[i][k];for(r=1;r{l[i][k]-=l[i][r]*u[r][k];}l[i][k]/=u[k][k];}l[k][k]=1。0;}for(i=1;i〈=n;++i){y[i]=b[i];for(j=1;j{y[i]-=l[i][j]*y[j];}}for(i=n;i〉0;-—i){x[i]=y[i];for(j=i+1;j<=n;++j){x[i]-=u[i][j]*x[j];}x[i]/=u[i][i];}for(i=1;i〈=n;++i){printf(”%0.2lf\n",x[i]);}return0;}五、实验结果与分析完全主元素消元法:列主元素消元法:LU分解法:分析:对于两种高斯解方程,完全主元素跟列主元素都是先消元、再回代,由程序段可以发现,始终消去对角线下方的元素.即,为了节约内存及时效,可以不必计算出主元素下方数据。列主元素消元法的算法设计上优于完全主元素消元法,它只需依次按列选主元素然后换行使之变到主元素位置,再进行消元即可。列主元素消元法的耗时比完全主元素法少很多,常采用之。对于LU分解法,分解矩阵为单位下三角阵L与上三角阵U的乘积,然后解方程组Ly=b,回代,解方程组Ux=y。其中的L为n阶单位下三角阵、U为上三角阵。六、讨论、心得本次试验中,感觉是最难的一次,完全主元素消元法程序编写过程相对来说花了好长时间.纠正各种语法、算法、思路错误。最后勉强成功,但还是有几处警告,不得解决之法。感到程序学习的不足,再加之对高斯的不甚了解。编写过程很是痛苦。查阅各种内外部资料,这点有利有弊。突然觉得,应该再把数据结构之类的重新学习一下才行。以后多花时间在编程吧,重在理解。必须反省一下自己的C、C++学习了,还是得多加练习,平时必须养成一种好的算法思维习惯。实验地点虎峪校区致远楼B401指导教师xx太原理工大学学生实验报告学院名称软件学院专业班级1217班学号201200xxxx学生姓名xx实验日期2014.06.04成绩课程名称数值计算方法实验题目实验三线性方程组的迭代解法一、实验目的和要求使用雅可比迭代法或高斯-赛德尔迭代法对下列方程组进行求解。二、主要设备笔记本HPProBook6470b一台编译软件:VC++6.0三、实验内容和原理设线性方程组Ax=b的系数矩阵A可逆,且主对角元素a11,a22,…,ann均不为零,令D=diag(a11,a22,…,ann)并将A分解成A=(A-D)+D从而线性方程组可写成Dx=(D—A)x+b则有迭代公式x(k+1)=B1x(k)+f1其中,B1=I-D-1A,f1=D—1b。 四、操作方法与实验步骤高斯—赛德尔迭代法#include”iostream”#include”iomanip”usingnamespacestd;intmain(){inti,j,k=0,m,n;doublet1,t2,e1,e2=0.0;cout<〈”请输入精度e:";cin〉〉e1;cout<<”请输入系数矩阵行数:”;cin〉>m;cout<〈"请输入系数矩阵列数:";cin〉〉n;cout〈〈endl;double(**a)=newdouble*[m];for(i=0;i〈=m;i++){a[i]=newdouble[n];}double(*b)=newdouble[m];double(*x)=newdouble[n];cout〈<”请输入系数矩阵:”<〈endl;cout<<"--—--—-—-—-———-———---—-——-—-————--——-—-———---—---—-—-----——-—"〈for(intnum1=0;num1{for(intnum2=0;num2{cin>〉a[num1][num2];}cout<〈endl;}cout<<"输入的系数矩阵为:"〈for(intnum3=0;num3〈m;num3++){for(intnum4=0;num4〈n;num4++){cout〈〈a[num3][num4]〈〈”";}cout<〈endl;}cout〈〈”请输入矩阵b:”〈for(intnum5=0;num5〈m;num5++){cin〉〉b[num5];}cout<<”输入的矩阵b为:”〈〈endl;for(intnum6=0;num6〈m;num6++){cout〈〈b[num6]〈〈"";}cout〈for(intnum7=0;num7{x[num7]=0.0000;}do{cout<〈”第"〈〈k<<"次迭代值:”;e2=0.0;for(i=0;i〈m;i++){doublesum=0.0;for(j=0;j{if(j!=i)sum+=a[i][j]*x[j];}t1=x[i];t2=e2;x[i]=(b[i]—sum)/a[i][i];e2=(x[i])—t1>=0?(x[i])—t1:t1-(x[i]);e2=(e2>=t2?e2:t2);cout<}cout<〈endl;k++;}while(e2>=e1&&k<30);cout〈〈”共迭代了”〈〈k〈〈”次";delete[]a;delete[]b;delete[]x;return0;} 雅克比迭代法: #includeh>#includeintmain(){floata[3][3]={{10,—1,—2},{—1,10,-2},{-1,—1,5}},b[3]={7.2,8。3,4.2};floatx[3]={0,0,0},sum;inti,j,k,n=3;printf("\t\tX[1]\t\tX[2]\t\tX[3]\n”);for(k=0;k〈8;k++){for(i=0;i<3;i++){sum=0;for(j=0;j{if(i==j)continue;sum=sum+a[i][j]*x[j];}x[i]=(b[i]-sum)/a[i][i];}printf(”第%d次迭代:\t”,k+1);for(i=0;i〈n;i++){printf("%f\t”,x[i]);}printf("\n”);}} 五、实验结果与分析高斯赛德尔迭代法: 雅克比迭代: 分析:使用高斯—赛德尔和雅克比迭代都可以求出方程组的解,但是利用高斯—赛德尔迭代法所需的迭代次数比雅克比迭代少,能够更早的达到精度要求。从程序中可以看出,雅克比定义的sum只有一个,而高斯赛德尔需要两个。时效性上后者要好些。六、讨论、心得这次试验算是比较成功,要归功于授课时候的认真听讲.程序编写之前,对书本的理论知识进行了进一步的探索。预习准备工作很彻底,自然随后的一切也都很顺利。实验地点虎峪校区致远楼B401指导教师xx太原理工大学学生实验报告学院名称软件学院专业班级1217班学号201200xxxx学生姓名xx实验日期2014.06。11成绩课程名称数值计算方法实验题目实验四代数插值和最小二乘法拟合一、实验目的和要求(1)使用拉格朗日插值法或牛顿插值法求解:已知f(x)在6个点的函数值如下表所示,运用插值方法,求f(0.596)的近似值。X0.400。550。650.800.901.05f(x)0.410750.578150。696750.888111.026521.25386(2)给定数据点(xi,yi),用最小二乘法拟合数据的多项式,并求平方误差。xi00.50.60。70。80.91。0yi11。751。962.192.442。713。00 二、主要设备笔记本HPProBook6470b一台编译软件:VC++6.0三、实验内容和原理(1)设函数在区间[a,b]上n+1互异节点x0,x1,…,xn上的函数值分别为y0,y1,…,yn,求n次插值多项式Pn(x),满足条件Pn(xj)=yj,j=0,1,…,n令Ln(x)=y0l0(x)+y1l1(x)+…+ynln(x)=∑yili(x)其中l0(x),l1(x),…,ln(x)为以x0,x1,…,xn为节点的n次插值基函数,则Ln(x)是一次数不超过n的多项式,且满足Ln(xj)=yj,L=0,1,…,n再由插值多项式的唯一性,得Pn(x)≡Ln(x)(2)建立正规方程组:∑(∑xij+k)ak=∑xijyi,j=0,1,…,n平方误差:I=∑(∑akxik—yi)2对给定数据点{(Xi,Yi)}(i=0,1,…,m),在取定的函数类Φ中,求p(x)∈Φ,使误差的平方和E2最小,E2=∑[p(Xi)—Yi]2。从几何意义上讲,就是寻求与给定点{(Xi,Yi)}(i=0,1,…,m)的距离平方和为最小的曲线y=p(x)。函数p(x)称为拟合函数或最小二乘解,求拟合函数p(x)的方法称为曲线拟合的最小二乘法.得到的两个关于a0、a1为未知数的两个方程组,解这两个方程组得出:a0=(∑Yi)/m-a1(∑Xi)/ma1=[m∑XiYi—(∑Xi∑Yi)]/[m∑Xi2-(∑Xi)2)]即最终的拟合多项式各项系数。四、操作方法与实验步骤(1)代数插值#include〈stdio.h〉#include#include〈conio.h〉#include〈alloc.h〉voiddifference(float*x,float*y,intn){float*f;intk,i;f=(floa
2.列主元素消元法:
#include”stdio.h”
floata[3][4]={{1,2,3,14},{0,1,2,8},{2,4,1,13}};
floatx[3];
floatsum=0;
intk,i,j;
for(k=0;k<2;k++)
for(i=k+1;i〈3;i++)
for(j=k+1;j〈4;j++)
a[i][j]=a[i][j]-a[i][k]/a[k][k]*a[k][j];
for(i=0;i〈3;i++)
for(j=0;j〈4;j++)
printf("a[%d][%d]=%f”,i,j,a[i][j]);
printf("\n”);
x[2]=a[2][3]/a[2][2];
for(k=1;k〉=0;k—-)
sum=0;
for(j=k+1;j〈3;j++)
sum+=a[k][j]*x[j];
x[k]=(a[k][3]-sum)/a[k][k];
printf(”x[%d]=%f\n",i+1,x[i]);
printf(”\n”);
3。
#include〈stdio。
#includeh〉#defineL30doublea[L][L],b[L],l[L][L],u[L][L],x[L],y[L];intmain(){intn,i,j,k,r;printf(”请输入矩阵元次:\n”);scanf("%d”,&n);printf(”请输入矩阵各项:\n");for(i=1;i〈=n;++i){for(j=1;j<=n;++j){scanf(”%lf”,&a[i][j]);}}printf("请输入方程组的常数项:\n”);for(i=1;i<=n;++i){scanf("%lf”,&b[i]);}for(i=1;i〈=n;++i){for(j=1;j<=n;++j){l[i][j]=0;u[i][j]=0.0;}}for(k=1;k〈=n;++k){for(j=k;j<=n;++j){u[k][j]=a[k][j];for(r=1;r{u[k][j]—=l[k][r]*u[r][j];}}for(i=k+1;i〈=n;++i){l[i][k]=a[i][k];for(r=1;r{l[i][k]-=l[i][r]*u[r][k];}l[i][k]/=u[k][k];}l[k][k]=1。0;}for(i=1;i〈=n;++i){y[i]=b[i];for(j=1;j{y[i]-=l[i][j]*y[j];}}for(i=n;i〉0;-—i){x[i]=y[i];for(j=i+1;j<=n;++j){x[i]-=u[i][j]*x[j];}x[i]/=u[i][i];}for(i=1;i〈=n;++i){printf(”%0.2lf\n",x[i]);}return0;}五、实验结果与分析完全主元素消元法:列主元素消元法:LU分解法:分析:对于两种高斯解方程,完全主元素跟列主元素都是先消元、再回代,由程序段可以发现,始终消去对角线下方的元素.即,为了节约内存及时效,可以不必计算出主元素下方数据。列主元素消元法的算法设计上优于完全主元素消元法,它只需依次按列选主元素然后换行使之变到主元素位置,再进行消元即可。列主元素消元法的耗时比完全主元素法少很多,常采用之。对于LU分解法,分解矩阵为单位下三角阵L与上三角阵U的乘积,然后解方程组Ly=b,回代,解方程组Ux=y。其中的L为n阶单位下三角阵、U为上三角阵。六、讨论、心得本次试验中,感觉是最难的一次,完全主元素消元法程序编写过程相对来说花了好长时间.纠正各种语法、算法、思路错误。最后勉强成功,但还是有几处警告,不得解决之法。感到程序学习的不足,再加之对高斯的不甚了解。编写过程很是痛苦。查阅各种内外部资料,这点有利有弊。突然觉得,应该再把数据结构之类的重新学习一下才行。以后多花时间在编程吧,重在理解。必须反省一下自己的C、C++学习了,还是得多加练习,平时必须养成一种好的算法思维习惯。实验地点虎峪校区致远楼B401指导教师xx太原理工大学学生实验报告学院名称软件学院专业班级1217班学号201200xxxx学生姓名xx实验日期2014.06.04成绩课程名称数值计算方法实验题目实验三线性方程组的迭代解法一、实验目的和要求使用雅可比迭代法或高斯-赛德尔迭代法对下列方程组进行求解。二、主要设备笔记本HPProBook6470b一台编译软件:VC++6.0三、实验内容和原理设线性方程组Ax=b的系数矩阵A可逆,且主对角元素a11,a22,…,ann均不为零,令D=diag(a11,a22,…,ann)并将A分解成A=(A-D)+D从而线性方程组可写成Dx=(D—A)x+b则有迭代公式x(k+1)=B1x(k)+f1其中,B1=I-D-1A,f1=D—1b。 四、操作方法与实验步骤高斯—赛德尔迭代法#include”iostream”#include”iomanip”usingnamespacestd;intmain(){inti,j,k=0,m,n;doublet1,t2,e1,e2=0.0;cout<〈”请输入精度e:";cin〉〉e1;cout<<”请输入系数矩阵行数:”;cin〉>m;cout<〈"请输入系数矩阵列数:";cin〉〉n;cout〈〈endl;double(**a)=newdouble*[m];for(i=0;i〈=m;i++){a[i]=newdouble[n];}double(*b)=newdouble[m];double(*x)=newdouble[n];cout〈<”请输入系数矩阵:”<〈endl;cout<<"--—--—-—-—-———-———---—-——-—-————--——-—-———---—---—-—-----——-—"〈for(intnum1=0;num1{for(intnum2=0;num2{cin>〉a[num1][num2];}cout<〈endl;}cout<<"输入的系数矩阵为:"〈for(intnum3=0;num3〈m;num3++){for(intnum4=0;num4〈n;num4++){cout〈〈a[num3][num4]〈〈”";}cout<〈endl;}cout〈〈”请输入矩阵b:”〈for(intnum5=0;num5〈m;num5++){cin〉〉b[num5];}cout<<”输入的矩阵b为:”〈〈endl;for(intnum6=0;num6〈m;num6++){cout〈〈b[num6]〈〈"";}cout〈for(intnum7=0;num7{x[num7]=0.0000;}do{cout<〈”第"〈〈k<<"次迭代值:”;e2=0.0;for(i=0;i〈m;i++){doublesum=0.0;for(j=0;j{if(j!=i)sum+=a[i][j]*x[j];}t1=x[i];t2=e2;x[i]=(b[i]—sum)/a[i][i];e2=(x[i])—t1>=0?(x[i])—t1:t1-(x[i]);e2=(e2>=t2?e2:t2);cout<}cout<〈endl;k++;}while(e2>=e1&&k<30);cout〈〈”共迭代了”〈〈k〈〈”次";delete[]a;delete[]b;delete[]x;return0;} 雅克比迭代法: #includeh>#includeintmain(){floata[3][3]={{10,—1,—2},{—1,10,-2},{-1,—1,5}},b[3]={7.2,8。3,4.2};floatx[3]={0,0,0},sum;inti,j,k,n=3;printf("\t\tX[1]\t\tX[2]\t\tX[3]\n”);for(k=0;k〈8;k++){for(i=0;i<3;i++){sum=0;for(j=0;j{if(i==j)continue;sum=sum+a[i][j]*x[j];}x[i]=(b[i]-sum)/a[i][i];}printf(”第%d次迭代:\t”,k+1);for(i=0;i〈n;i++){printf("%f\t”,x[i]);}printf("\n”);}} 五、实验结果与分析高斯赛德尔迭代法: 雅克比迭代: 分析:使用高斯—赛德尔和雅克比迭代都可以求出方程组的解,但是利用高斯—赛德尔迭代法所需的迭代次数比雅克比迭代少,能够更早的达到精度要求。从程序中可以看出,雅克比定义的sum只有一个,而高斯赛德尔需要两个。时效性上后者要好些。六、讨论、心得这次试验算是比较成功,要归功于授课时候的认真听讲.程序编写之前,对书本的理论知识进行了进一步的探索。预习准备工作很彻底,自然随后的一切也都很顺利。实验地点虎峪校区致远楼B401指导教师xx太原理工大学学生实验报告学院名称软件学院专业班级1217班学号201200xxxx学生姓名xx实验日期2014.06。11成绩课程名称数值计算方法实验题目实验四代数插值和最小二乘法拟合一、实验目的和要求(1)使用拉格朗日插值法或牛顿插值法求解:已知f(x)在6个点的函数值如下表所示,运用插值方法,求f(0.596)的近似值。X0.400。550。650.800.901.05f(x)0.410750.578150。696750.888111.026521.25386(2)给定数据点(xi,yi),用最小二乘法拟合数据的多项式,并求平方误差。xi00.50.60。70。80.91。0yi11。751。962.192.442。713。00 二、主要设备笔记本HPProBook6470b一台编译软件:VC++6.0三、实验内容和原理(1)设函数在区间[a,b]上n+1互异节点x0,x1,…,xn上的函数值分别为y0,y1,…,yn,求n次插值多项式Pn(x),满足条件Pn(xj)=yj,j=0,1,…,n令Ln(x)=y0l0(x)+y1l1(x)+…+ynln(x)=∑yili(x)其中l0(x),l1(x),…,ln(x)为以x0,x1,…,xn为节点的n次插值基函数,则Ln(x)是一次数不超过n的多项式,且满足Ln(xj)=yj,L=0,1,…,n再由插值多项式的唯一性,得Pn(x)≡Ln(x)(2)建立正规方程组:∑(∑xij+k)ak=∑xijyi,j=0,1,…,n平方误差:I=∑(∑akxik—yi)2对给定数据点{(Xi,Yi)}(i=0,1,…,m),在取定的函数类Φ中,求p(x)∈Φ,使误差的平方和E2最小,E2=∑[p(Xi)—Yi]2。从几何意义上讲,就是寻求与给定点{(Xi,Yi)}(i=0,1,…,m)的距离平方和为最小的曲线y=p(x)。函数p(x)称为拟合函数或最小二乘解,求拟合函数p(x)的方法称为曲线拟合的最小二乘法.得到的两个关于a0、a1为未知数的两个方程组,解这两个方程组得出:a0=(∑Yi)/m-a1(∑Xi)/ma1=[m∑XiYi—(∑Xi∑Yi)]/[m∑Xi2-(∑Xi)2)]即最终的拟合多项式各项系数。四、操作方法与实验步骤(1)代数插值#include〈stdio.h〉#include#include〈conio.h〉#include〈alloc.h〉voiddifference(float*x,float*y,intn){float*f;intk,i;f=(floa
#defineL30
doublea[L][L],b[L],l[L][L],u[L][L],x[L],y[L];
intn,i,j,k,r;
printf(”请输入矩阵元次:
\n”);
scanf("%d”,&n);
printf(”请输入矩阵各项:
\n");
for(i=1;i〈=n;++i)
for(j=1;j<=n;++j)
scanf(”%lf”,&a[i][j]);
printf("请输入方程组的常数项:
for(i=1;i<=n;++i)
scanf("%lf”,&b[i]);
for(i=1;i〈=n;++i)
l[i][j]=0;
u[i][j]=0.0;
for(k=1;k〈=n;++k)
for(j=k;j<=n;++j)
u[k][j]=a[k][j];
for(r=1;r{u[k][j]—=l[k][r]*u[r][j];}}for(i=k+1;i〈=n;++i){l[i][k]=a[i][k];for(r=1;r{l[i][k]-=l[i][r]*u[r][k];}l[i][k]/=u[k][k];}l[k][k]=1。0;}for(i=1;i〈=n;++i){y[i]=b[i];for(j=1;j{y[i]-=l[i][j]*y[j];}}for(i=n;i〉0;-—i){x[i]=y[i];for(j=i+1;j<=n;++j){x[i]-=u[i][j]*x[j];}x[i]/=u[i][i];}for(i=1;i〈=n;++i){printf(”%0.2lf\n",x[i]);}return0;}五、实验结果与分析完全主元素消元法:列主元素消元法:LU分解法:分析:对于两种高斯解方程,完全主元素跟列主元素都是先消元、再回代,由程序段可以发现,始终消去对角线下方的元素.即,为了节约内存及时效,可以不必计算出主元素下方数据。列主元素消元法的算法设计上优于完全主元素消元法,它只需依次按列选主元素然后换行使之变到主元素位置,再进行消元即可。列主元素消元法的耗时比完全主元素法少很多,常采用之。对于LU分解法,分解矩阵为单位下三角阵L与上三角阵U的乘积,然后解方程组Ly=b,回代,解方程组Ux=y。其中的L为n阶单位下三角阵、U为上三角阵。六、讨论、心得本次试验中,感觉是最难的一次,完全主元素消元法程序编写过程相对来说花了好长时间.纠正各种语法、算法、思路错误。最后勉强成功,但还是有几处警告,不得解决之法。感到程序学习的不足,再加之对高斯的不甚了解。编写过程很是痛苦。查阅各种内外部资料,这点有利有弊。突然觉得,应该再把数据结构之类的重新学习一下才行。以后多花时间在编程吧,重在理解。必须反省一下自己的C、C++学习了,还是得多加练习,平时必须养成一种好的算法思维习惯。实验地点虎峪校区致远楼B401指导教师xx太原理工大学学生实验报告学院名称软件学院专业班级1217班学号201200xxxx学生姓名xx实验日期2014.06.04成绩课程名称数值计算方法实验题目实验三线性方程组的迭代解法一、实验目的和要求使用雅可比迭代法或高斯-赛德尔迭代法对下列方程组进行求解。二、主要设备笔记本HPProBook6470b一台编译软件:VC++6.0三、实验内容和原理设线性方程组Ax=b的系数矩阵A可逆,且主对角元素a11,a22,…,ann均不为零,令D=diag(a11,a22,…,ann)并将A分解成A=(A-D)+D从而线性方程组可写成Dx=(D—A)x+b则有迭代公式x(k+1)=B1x(k)+f1其中,B1=I-D-1A,f1=D—1b。 四、操作方法与实验步骤高斯—赛德尔迭代法#include”iostream”#include”iomanip”usingnamespacestd;intmain(){inti,j,k=0,m,n;doublet1,t2,e1,e2=0.0;cout<〈”请输入精度e:";cin〉〉e1;cout<<”请输入系数矩阵行数:”;cin〉>m;cout<〈"请输入系数矩阵列数:";cin〉〉n;cout〈〈endl;double(**a)=newdouble*[m];for(i=0;i〈=m;i++){a[i]=newdouble[n];}double(*b)=newdouble[m];double(*x)=newdouble[n];cout〈<”请输入系数矩阵:”<〈endl;cout<<"--—--—-—-—-———-———---—-——-—-————--——-—-———---—---—-—-----——-—"〈for(intnum1=0;num1{for(intnum2=0;num2{cin>〉a[num1][num2];}cout<〈endl;}cout<<"输入的系数矩阵为:"〈for(intnum3=0;num3〈m;num3++){for(intnum4=0;num4〈n;num4++){cout〈〈a[num3][num4]〈〈”";}cout<〈endl;}cout〈〈”请输入矩阵b:”〈for(intnum5=0;num5〈m;num5++){cin〉〉b[num5];}cout<<”输入的矩阵b为:”〈〈endl;for(intnum6=0;num6〈m;num6++){cout〈〈b[num6]〈〈"";}cout〈for(intnum7=0;num7{x[num7]=0.0000;}do{cout<〈”第"〈〈k<<"次迭代值:”;e2=0.0;for(i=0;i〈m;i++){doublesum=0.0;for(j=0;j{if(j!=i)sum+=a[i][j]*x[j];}t1=x[i];t2=e2;x[i]=(b[i]—sum)/a[i][i];e2=(x[i])—t1>=0?(x[i])—t1:t1-(x[i]);e2=(e2>=t2?e2:t2);cout<}cout<〈endl;k++;}while(e2>=e1&&k<30);cout〈〈”共迭代了”〈〈k〈〈”次";delete[]a;delete[]b;delete[]x;return0;} 雅克比迭代法: #includeh>#includeintmain(){floata[3][3]={{10,—1,—2},{—1,10,-2},{-1,—1,5}},b[3]={7.2,8。3,4.2};floatx[3]={0,0,0},sum;inti,j,k,n=3;printf("\t\tX[1]\t\tX[2]\t\tX[3]\n”);for(k=0;k〈8;k++){for(i=0;i<3;i++){sum=0;for(j=0;j{if(i==j)continue;sum=sum+a[i][j]*x[j];}x[i]=(b[i]-sum)/a[i][i];}printf(”第%d次迭代:\t”,k+1);for(i=0;i〈n;i++){printf("%f\t”,x[i]);}printf("\n”);}} 五、实验结果与分析高斯赛德尔迭代法: 雅克比迭代: 分析:使用高斯—赛德尔和雅克比迭代都可以求出方程组的解,但是利用高斯—赛德尔迭代法所需的迭代次数比雅克比迭代少,能够更早的达到精度要求。从程序中可以看出,雅克比定义的sum只有一个,而高斯赛德尔需要两个。时效性上后者要好些。六、讨论、心得这次试验算是比较成功,要归功于授课时候的认真听讲.程序编写之前,对书本的理论知识进行了进一步的探索。预习准备工作很彻底,自然随后的一切也都很顺利。实验地点虎峪校区致远楼B401指导教师xx太原理工大学学生实验报告学院名称软件学院专业班级1217班学号201200xxxx学生姓名xx实验日期2014.06。11成绩课程名称数值计算方法实验题目实验四代数插值和最小二乘法拟合一、实验目的和要求(1)使用拉格朗日插值法或牛顿插值法求解:已知f(x)在6个点的函数值如下表所示,运用插值方法,求f(0.596)的近似值。X0.400。550。650.800.901.05f(x)0.410750.578150。696750.888111.026521.25386(2)给定数据点(xi,yi),用最小二乘法拟合数据的多项式,并求平方误差。xi00.50.60。70。80.91。0yi11。751。962.192.442。713。00 二、主要设备笔记本HPProBook6470b一台编译软件:VC++6.0三、实验内容和原理(1)设函数在区间[a,b]上n+1互异节点x0,x1,…,xn上的函数值分别为y0,y1,…,yn,求n次插值多项式Pn(x),满足条件Pn(xj)=yj,j=0,1,…,n令Ln(x)=y0l0(x)+y1l1(x)+…+ynln(x)=∑yili(x)其中l0(x),l1(x),…,ln(x)为以x0,x1,…,xn为节点的n次插值基函数,则Ln(x)是一次数不超过n的多项式,且满足Ln(xj)=yj,L=0,1,…,n再由插值多项式的唯一性,得Pn(x)≡Ln(x)(2)建立正规方程组:∑(∑xij+k)ak=∑xijyi,j=0,1,…,n平方误差:I=∑(∑akxik—yi)2对给定数据点{(Xi,Yi)}(i=0,1,…,m),在取定的函数类Φ中,求p(x)∈Φ,使误差的平方和E2最小,E2=∑[p(Xi)—Yi]2。从几何意义上讲,就是寻求与给定点{(Xi,Yi)}(i=0,1,…,m)的距离平方和为最小的曲线y=p(x)。函数p(x)称为拟合函数或最小二乘解,求拟合函数p(x)的方法称为曲线拟合的最小二乘法.得到的两个关于a0、a1为未知数的两个方程组,解这两个方程组得出:a0=(∑Yi)/m-a1(∑Xi)/ma1=[m∑XiYi—(∑Xi∑Yi)]/[m∑Xi2-(∑Xi)2)]即最终的拟合多项式各项系数。四、操作方法与实验步骤(1)代数插值#include〈stdio.h〉#include#include〈conio.h〉#include〈alloc.h〉voiddifference(float*x,float*y,intn){float*f;intk,i;f=(floa
u[k][j]—=l[k][r]*u[r][j];
for(i=k+1;i〈=n;++i)
l[i][k]=a[i][k];
for(r=1;r{l[i][k]-=l[i][r]*u[r][k];}l[i][k]/=u[k][k];}l[k][k]=1。0;}for(i=1;i〈=n;++i){y[i]=b[i];for(j=1;j{y[i]-=l[i][j]*y[j];}}for(i=n;i〉0;-—i){x[i]=y[i];for(j=i+1;j<=n;++j){x[i]-=u[i][j]*x[j];}x[i]/=u[i][i];}for(i=1;i〈=n;++i){printf(”%0.2lf\n",x[i]);}return0;}五、实验结果与分析完全主元素消元法:列主元素消元法:LU分解法:分析:对于两种高斯解方程,完全主元素跟列主元素都是先消元、再回代,由程序段可以发现,始终消去对角线下方的元素.即,为了节约内存及时效,可以不必计算出主元素下方数据。列主元素消元法的算法设计上优于完全主元素消元法,它只需依次按列选主元素然后换行使之变到主元素位置,再进行消元即可。列主元素消元法的耗时比完全主元素法少很多,常采用之。对于LU分解法,分解矩阵为单位下三角阵L与上三角阵U的乘积,然后解方程组Ly=b,回代,解方程组Ux=y。其中的L为n阶单位下三角阵、U为上三角阵。六、讨论、心得本次试验中,感觉是最难的一次,完全主元素消元法程序编写过程相对来说花了好长时间.纠正各种语法、算法、思路错误。最后勉强成功,但还是有几处警告,不得解决之法。感到程序学习的不足,再加之对高斯的不甚了解。编写过程很是痛苦。查阅各种内外部资料,这点有利有弊。突然觉得,应该再把数据结构之类的重新学习一下才行。以后多花时间在编程吧,重在理解。必须反省一下自己的C、C++学习了,还是得多加练习,平时必须养成一种好的算法思维习惯。实验地点虎峪校区致远楼B401指导教师xx太原理工大学学生实验报告学院名称软件学院专业班级1217班学号201200xxxx学生姓名xx实验日期2014.06.04成绩课程名称数值计算方法实验题目实验三线性方程组的迭代解法一、实验目的和要求使用雅可比迭代法或高斯-赛德尔迭代法对下列方程组进行求解。二、主要设备笔记本HPProBook6470b一台编译软件:VC++6.0三、实验内容和原理设线性方程组Ax=b的系数矩阵A可逆,且主对角元素a11,a22,…,ann均不为零,令D=diag(a11,a22,…,ann)并将A分解成A=(A-D)+D从而线性方程组可写成Dx=(D—A)x+b则有迭代公式x(k+1)=B1x(k)+f1其中,B1=I-D-1A,f1=D—1b。 四、操作方法与实验步骤高斯—赛德尔迭代法#include”iostream”#include”iomanip”usingnamespacestd;intmain(){inti,j,k=0,m,n;doublet1,t2,e1,e2=0.0;cout<〈”请输入精度e:";cin〉〉e1;cout<<”请输入系数矩阵行数:”;cin〉>m;cout<〈"请输入系数矩阵列数:";cin〉〉n;cout〈〈endl;double(**a)=newdouble*[m];for(i=0;i〈=m;i++){a[i]=newdouble[n];}double(*b)=newdouble[m];double(*x)=newdouble[n];cout〈<”请输入系数矩阵:”<〈endl;cout<<"--—--—-—-—-———-———---—-——-—-————--——-—-———---—---—-—-----——-—"〈for(intnum1=0;num1{for(intnum2=0;num2{cin>〉a[num1][num2];}cout<〈endl;}cout<<"输入的系数矩阵为:"〈for(intnum3=0;num3〈m;num3++){for(intnum4=0;num4〈n;num4++){cout〈〈a[num3][num4]〈〈”";}cout<〈endl;}cout〈〈”请输入矩阵b:”〈for(intnum5=0;num5〈m;num5++){cin〉〉b[num5];}cout<<”输入的矩阵b为:”〈〈endl;for(intnum6=0;num6〈m;num6++){cout〈〈b[num6]〈〈"";}cout〈for(intnum7=0;num7{x[num7]=0.0000;}do{cout<〈”第"〈〈k<<"次迭代值:”;e2=0.0;for(i=0;i〈m;i++){doublesum=0.0;for(j=0;j{if(j!=i)sum+=a[i][j]*x[j];}t1=x[i];t2=e2;x[i]=(b[i]—sum)/a[i][i];e2=(x[i])—t1>=0?(x[i])—t1:t1-(x[i]);e2=(e2>=t2?e2:t2);cout<}cout<〈endl;k++;}while(e2>=e1&&k<30);cout〈〈”共迭代了”〈〈k〈〈”次";delete[]a;delete[]b;delete[]x;return0;} 雅克比迭代法: #includeh>#includeintmain(){floata[3][3]={{10,—1,—2},{—1,10,-2},{-1,—1,5}},b[3]={7.2,8。3,4.2};floatx[3]={0,0,0},sum;inti,j,k,n=3;printf("\t\tX[1]\t\tX[2]\t\tX[3]\n”);for(k=0;k〈8;k++){for(i=0;i<3;i++){sum=0;for(j=0;j{if(i==j)continue;sum=sum+a[i][j]*x[j];}x[i]=(b[i]-sum)/a[i][i];}printf(”第%d次迭代:\t”,k+1);for(i=0;i〈n;i++){printf("%f\t”,x[i]);}printf("\n”);}} 五、实验结果与分析高斯赛德尔迭代法: 雅克比迭代: 分析:使用高斯—赛德尔和雅克比迭代都可以求出方程组的解,但是利用高斯—赛德尔迭代法所需的迭代次数比雅克比迭代少,能够更早的达到精度要求。从程序中可以看出,雅克比定义的sum只有一个,而高斯赛德尔需要两个。时效性上后者要好些。六、讨论、心得这次试验算是比较成功,要归功于授课时候的认真听讲.程序编写之前,对书本的理论知识进行了进一步的探索。预习准备工作很彻底,自然随后的一切也都很顺利。实验地点虎峪校区致远楼B401指导教师xx太原理工大学学生实验报告学院名称软件学院专业班级1217班学号201200xxxx学生姓名xx实验日期2014.06。11成绩课程名称数值计算方法实验题目实验四代数插值和最小二乘法拟合一、实验目的和要求(1)使用拉格朗日插值法或牛顿插值法求解:已知f(x)在6个点的函数值如下表所示,运用插值方法,求f(0.596)的近似值。X0.400。550。650.800.901.05f(x)0.410750.578150。696750.888111.026521.25386(2)给定数据点(xi,yi),用最小二乘法拟合数据的多项式,并求平方误差。xi00.50.60。70。80.91。0yi11。751。962.192.442。713。00 二、主要设备笔记本HPProBook6470b一台编译软件:VC++6.0三、实验内容和原理(1)设函数在区间[a,b]上n+1互异节点x0,x1,…,xn上的函数值分别为y0,y1,…,yn,求n次插值多项式Pn(x),满足条件Pn(xj)=yj,j=0,1,…,n令Ln(x)=y0l0(x)+y1l1(x)+…+ynln(x)=∑yili(x)其中l0(x),l1(x),…,ln(x)为以x0,x1,…,xn为节点的n次插值基函数,则Ln(x)是一次数不超过n的多项式,且满足Ln(xj)=yj,L=0,1,…,n再由插值多项式的唯一性,得Pn(x)≡Ln(x)(2)建立正规方程组:∑(∑xij+k)ak=∑xijyi,j=0,1,…,n平方误差:I=∑(∑akxik—yi)2对给定数据点{(Xi,Yi)}(i=0,1,…,m),在取定的函数类Φ中,求p(x)∈Φ,使误差的平方和E2最小,E2=∑[p(Xi)—Yi]2。从几何意义上讲,就是寻求与给定点{(Xi,Yi)}(i=0,1,…,m)的距离平方和为最小的曲线y=p(x)。函数p(x)称为拟合函数或最小二乘解,求拟合函数p(x)的方法称为曲线拟合的最小二乘法.得到的两个关于a0、a1为未知数的两个方程组,解这两个方程组得出:a0=(∑Yi)/m-a1(∑Xi)/ma1=[m∑XiYi—(∑Xi∑Yi)]/[m∑Xi2-(∑Xi)2)]即最终的拟合多项式各项系数。四、操作方法与实验步骤(1)代数插值#include〈stdio.h〉#include#include〈conio.h〉#include〈alloc.h〉voiddifference(float*x,float*y,intn){float*f;intk,i;f=(floa
l[i][k]-=l[i][r]*u[r][k];
l[i][k]/=u[k][k];
l[k][k]=1。
0;
for(i=1;i〈=n;++i)
y[i]=b[i];
for(j=1;j
y[i]-=l[i][j]*y[j];
for(i=n;i〉0;-—i)
x[i]=y[i];
for(j=i+1;j<=n;++j)
x[i]-=u[i][j]*x[j];
x[i]/=u[i][i];
printf(”%0.2lf\n",x[i]);
return0;
列主元素消元法:
LU分解法:
分析:
对于两种高斯解方程,完全主元素跟列主元素都是先消元、再回代,由程序段可以发现,始终消去对角线下方的元素.即,为了节约内存及时效,可以不必计算出主元素下方数据。
列主元素消元法的算法设计上优于完全主元素消元法,它只需依次按列选主元素然后换行使之变到主元素位置,再进行消元即可。
列主元素消元法的耗时比完全主元素法少很多,常采用之。
对于LU分解法,分解矩阵为单位下三角阵L与上三角阵U的乘积,然后解方程组Ly=b,回代,解方程组Ux=y。
其中的L为n阶单位下三角阵、U为上三角阵。
本次试验中,感觉是最难的一次,完全主元素消元法程序编写过程相对来说花了好长时间.纠正各种语法、算法、思路错误。
最后勉强成功,但还是有几处警告,不得解决之法。
感到程序学习的不足,再加之对高斯的不甚了解。
编写过程很是痛苦。
查阅各种内外部资料,这点有利有弊。
突然觉得,应该再把数据结构之类的重新学习一下才行。
以后多花时间在编程吧,重在理解。
必须反省一下自己的C、C++学习了,还是得多加练习,平时必须养成一种好的算法思维习惯。
2014.06.04
实验三线性方程组的迭代解法
使用雅可比迭代法或高斯-赛德尔迭代法对下列方程组进行求解。
VC++6.0
设线性方程组Ax=b
的系数矩阵A可逆,且主对角元素a11,a22,…,ann均不为零,令
D=diag(a11,a22,…,ann)
并将A分解成A=(A-D)+D
从而线性方程组可写成Dx=(D—A)x+b
则有迭代公式
x(k+1)=B1x(k)+f1
其中,B1=I-D-1A,f1=D—1b。
高斯—赛德尔迭代法
#include”iostream”
#include”iomanip”
usingnamespacestd;
inti,j,k=0,m,n;
doublet1,t2,e1,e2=0.0;
cout<〈”请输入精度e:
";
cin〉〉e1;
cout<<”请输入系数矩阵行数:
”;
cin〉>m;
cout<〈"请输入系数矩阵列数:
cin〉〉n;
cout〈〈endl;
double(**a)=newdouble*[m];
for(i=0;i〈=m;i++)
a[i]=newdouble[n];
double(*b)=newdouble[m];
double(*x)=newdouble[n];
cout〈<”请输入系数矩阵:
”<〈endl;
cout<<"--—--—-—-—-———-———---—-——-—-————--——-—-———---—---—-—-----——-—"〈for(intnum1=0;num1{for(intnum2=0;num2{cin>〉a[num1][num2];}cout<〈endl;}cout<<"输入的系数矩阵为:"〈for(intnum3=0;num3〈m;num3++){for(intnum4=0;num4〈n;num4++){cout〈〈a[num3][num4]〈〈”";}cout<〈endl;}cout〈〈”请输入矩阵b:”〈for(intnum5=0;num5〈m;num5++){cin〉〉b[num5];}cout<<”输入的矩阵b为:”〈〈endl;for(intnum6=0;num6〈m;num6++){cout〈〈b[num6]〈〈"";}cout〈for(intnum7=0;num7{x[num7]=0.0000;}do{cout<〈”第"〈〈k<<"次迭代值:”;e2=0.0;for(i=0;i〈m;i++){doublesum=0.0;for(j=0;j{if(j!=i)sum+=a[i][j]*x[j];}t1=x[i];t2=e2;x[i]=(b[i]—sum)/a[i][i];e2=(x[i])—t1>=0?(x[i])—t1:t1-(x[i]);e2=(e2>=t2?e2:t2);cout<}cout<〈endl;k++;}while(e2>=e1&&k<30);cout〈〈”共迭代了”〈〈k〈〈”次";delete[]a;delete[]b;delete[]x;return0;} 雅克比迭代法: #includeh>#includeintmain(){floata[3][3]={{10,—1,—2},{—1,10,-2},{-1,—1,5}},b[3]={7.2,8。3,4.2};floatx[3]={0,0,0},sum;inti,j,k,n=3;printf("\t\tX[1]\t\tX[2]\t\tX[3]\n”);for(k=0;k〈8;k++){for(i=0;i<3;i++){sum=0;for(j=0;j{if(i==j)continue;sum=sum+a[i][j]*x[j];}x[i]=(b[i]-sum)/a[i][i];}printf(”第%d次迭代:\t”,k+1);for(i=0;i〈n;i++){printf("%f\t”,x[i]);}printf("\n”);}} 五、实验结果与分析高斯赛德尔迭代法: 雅克比迭代: 分析:使用高斯—赛德尔和雅克比迭代都可以求出方程组的解,但是利用高斯—赛德尔迭代法所需的迭代次数比雅克比迭代少,能够更早的达到精度要求。从程序中可以看出,雅克比定义的sum只有一个,而高斯赛德尔需要两个。时效性上后者要好些。六、讨论、心得这次试验算是比较成功,要归功于授课时候的认真听讲.程序编写之前,对书本的理论知识进行了进一步的探索。预习准备工作很彻底,自然随后的一切也都很顺利。实验地点虎峪校区致远楼B401指导教师xx太原理工大学学生实验报告学院名称软件学院专业班级1217班学号201200xxxx学生姓名xx实验日期2014.06。11成绩课程名称数值计算方法实验题目实验四代数插值和最小二乘法拟合一、实验目的和要求(1)使用拉格朗日插值法或牛顿插值法求解:已知f(x)在6个点的函数值如下表所示,运用插值方法,求f(0.596)的近似值。X0.400。550。650.800.901.05f(x)0.410750.578150。696750.888111.026521.25386(2)给定数据点(xi,yi),用最小二乘法拟合数据的多项式,并求平方误差。xi00.50.60。70。80.91。0yi11。751。962.192.442。713。00 二、主要设备笔记本HPProBook6470b一台编译软件:VC++6.0三、实验内容和原理(1)设函数在区间[a,b]上n+1互异节点x0,x1,…,xn上的函数值分别为y0,y1,…,yn,求n次插值多项式Pn(x),满足条件Pn(xj)=yj,j=0,1,…,n令Ln(x)=y0l0(x)+y1l1(x)+…+ynln(x)=∑yili(x)其中l0(x),l1(x),…,ln(x)为以x0,x1,…,xn为节点的n次插值基函数,则Ln(x)是一次数不超过n的多项式,且满足Ln(xj)=yj,L=0,1,…,n再由插值多项式的唯一性,得Pn(x)≡Ln(x)(2)建立正规方程组:∑(∑xij+k)ak=∑xijyi,j=0,1,…,n平方误差:I=∑(∑akxik—yi)2对给定数据点{(Xi,Yi)}(i=0,1,…,m),在取定的函数类Φ中,求p(x)∈Φ,使误差的平方和E2最小,E2=∑[p(Xi)—Yi]2。从几何意义上讲,就是寻求与给定点{(Xi,Yi)}(i=0,1,…,m)的距离平方和为最小的曲线y=p(x)。函数p(x)称为拟合函数或最小二乘解,求拟合函数p(x)的方法称为曲线拟合的最小二乘法.得到的两个关于a0、a1为未知数的两个方程组,解这两个方程组得出:a0=(∑Yi)/m-a1(∑Xi)/ma1=[m∑XiYi—(∑Xi∑Yi)]/[m∑Xi2-(∑Xi)2)]即最终的拟合多项式各项系数。四、操作方法与实验步骤(1)代数插值#include〈stdio.h〉#include#include〈conio.h〉#include〈alloc.h〉voiddifference(float*x,float*y,intn){float*f;intk,i;f=(floa
for(intnum1=0;num1{for(intnum2=0;num2{cin>〉a[num1][num2];}cout<〈endl;}cout<<"输入的系数矩阵为:"〈for(intnum3=0;num3〈m;num3++){for(intnum4=0;num4〈n;num4++){cout〈〈a[num3][num4]〈〈”";}cout<〈endl;}cout〈〈”请输入矩阵b:”〈for(intnum5=0;num5〈m;num5++){cin〉〉b[num5];}cout<<”输入的矩阵b为:”〈〈endl;for(intnum6=0;num6〈m;num6++){cout〈〈b[num6]〈〈"";}cout〈for(intnum7=0;num7{x[num7]=0.0000;}do{cout<〈”第"〈〈k<<"次迭代值:”;e2=0.0;for(i=0;i〈m;i++){doublesum=0.0;for(j=0;j{if(j!=i)sum+=a[i][j]*x[j];}t1=x[i];t2=e2;x[i]=(b[i]—sum)/a[i][i];e2=(x[i])—t1>=0?(x[i])—t1:t1-(x[i]);e2=(e2>=t2?e2:t2);cout<}cout<〈endl;k++;}while(e2>=e1&&k<30);cout〈〈”共迭代了”〈〈k〈〈”次";delete[]a;delete[]b;delete[]x;return0;} 雅克比迭代法: #includeh>#includeintmain(){floata[3][3]={{10,—1,—2},{—1,10,-2},{-1,—1,5}},b[3]={7.2,8。3,4.2};floatx[3]={0,0,0},sum;inti,j,k,n=3;printf("\t\tX[1]\t\tX[2]\t\tX[3]\n”);for(k=0;k〈8;k++){for(i=0;i<3;i++){sum=0;for(j=0;j{if(i==j)continue;sum=sum+a[i][j]*x[j];}x[i]=(b[i]-sum)/a[i][i];}printf(”第%d次迭代:\t”,k+1);for(i=0;i〈n;i++){printf("%f\t”,x[i]);}printf("\n”);}} 五、实验结果与分析高斯赛德尔迭代法: 雅克比迭代: 分析:使用高斯—赛德尔和雅克比迭代都可以求出方程组的解,但是利用高斯—赛德尔迭代法所需的迭代次数比雅克比迭代少,能够更早的达到精度要求。从程序中可以看出,雅克比定义的sum只有一个,而高斯赛德尔需要两个。时效性上后者要好些。六、讨论、心得这次试验算是比较成功,要归功于授课时候的认真听讲.程序编写之前,对书本的理论知识进行了进一步的探索。预习准备工作很彻底,自然随后的一切也都很顺利。实验地点虎峪校区致远楼B401指导教师xx太原理工大学学生实验报告学院名称软件学院专业班级1217班学号201200xxxx学生姓名xx实验日期2014.06。11成绩课程名称数值计算方法实验题目实验四代数插值和最小二乘法拟合一、实验目的和要求(1)使用拉格朗日插值法或牛顿插值法求解:已知f(x)在6个点的函数值如下表所示,运用插值方法,求f(0.596)的近似值。X0.400。550。650.800.901.05f(x)0.410750.578150。696750.888111.026521.25386(2)给定数据点(xi,yi),用最小二乘法拟合数据的多项式,并求平方误差。xi00.50.60。70。80.91。0yi11。751。962.192.442。713。00 二、主要设备笔记本HPProBook6470b一台编译软件:VC++6.0三、实验内容和原理(1)设函数在区间[a,b]上n+1互异节点x0,x1,…,xn上的函数值分别为y0,y1,…,yn,求n次插值多项式Pn(x),满足条件Pn(xj)=yj,j=0,1,…,n令Ln(x)=y0l0(x)+y1l1(x)+…+ynln(x)=∑yili(x)其中l0(x),l1(x),…,ln(x)为以x0,x1,…,xn为节点的n次插值基函数,则Ln(x)是一次数不超过n的多项式,且满足Ln(xj)=yj,L=0,1,…,n再由插值多项式的唯一性,得Pn(x)≡Ln(x)(2)建立正规方程组:∑(∑xij+k)ak=∑xijyi,j=0,1,…,n平方误差:I=∑(∑akxik—yi)2对给定数据点{(Xi,Yi)}(i=0,1,…,m),在取定的函数类Φ中,求p(x)∈Φ,使误差的平方和E2最小,E2=∑[p(Xi)—Yi]2。从几何意义上讲,就是寻求与给定点{(Xi,Yi)}(i=0,1,…,m)的距离平方和为最小的曲线y=p(x)。函数p(x)称为拟合函数或最小二乘解,求拟合函数p(x)的方法称为曲线拟合的最小二乘法.得到的两个关于a0、a1为未知数的两个方程组,解这两个方程组得出:a0=(∑Yi)/m-a1(∑Xi)/ma1=[m∑XiYi—(∑Xi∑Yi)]/[m∑Xi2-(∑Xi)2)]即最终的拟合多项式各项系数。四、操作方法与实验步骤(1)代数插值#include〈stdio.h〉#include#include〈conio.h〉#include〈alloc.h〉voiddifference(float*x,float*y,intn){float*f;intk,i;f=(floa
for(intnum2=0;num2{cin>〉a[num1][num2];}cout<〈endl;}cout<<"输入的系数矩阵为:"〈for(intnum3=0;num3〈m;num3++){for(intnum4=0;num4〈n;num4++){cout〈〈a[num3][num4]〈〈”";}cout<〈endl;}cout〈〈”请输入矩阵b:”〈for(intnum5=0;num5〈m;num5++){cin〉〉b[num5];}cout<<”输入的矩阵b为:”〈〈endl;for(intnum6=0;num6〈m;num6++){cout〈〈b[num6]〈〈"";}cout〈for(intnum7=0;num7{x[num7]=0.0000;}do{cout<〈”第"〈〈k<<"次迭代值:”;e2=0.0;for(i=0;i〈m;i++){doublesum=0.0;for(j=0;j{if(j!=i)sum+=a[i][j]*x[j];}t1=x[i];t2=e2;x[i]=(b[i]—sum)/a[i][i];e2=(x[i])—t1>=0?(x[i])—t1:t1-(x[i]);e2=(e2>=t2?e2:t2);cout<}cout<〈endl;k++;}while(e2>=e1&&k<30);cout〈〈”共迭代了”〈〈k〈〈”次";delete[]a;delete[]b;delete[]x;return0;} 雅克比迭代法: #includeh>#includeintmain(){floata[3][3]={{10,—1,—2},{—1,10,-2},{-1,—1,5}},b[3]={7.2,8。3,4.2};floatx[3]={0,0,0},sum;inti,j,k,n=3;printf("\t\tX[1]\t\tX[2]\t\tX[3]\n”);for(k=0;k〈8;k++){for(i=0;i<3;i++){sum=0;for(j=0;j{if(i==j)continue;sum=sum+a[i][j]*x[j];}x[i]=(b[i]-sum)/a[i][i];}printf(”第%d次迭代:\t”,k+1);for(i=0;i〈n;i++){printf("%f\t”,x[i]);}printf("\n”);}} 五、实验结果与分析高斯赛德尔迭代法: 雅克比迭代: 分析:使用高斯—赛德尔和雅克比迭代都可以求出方程组的解,但是利用高斯—赛德尔迭代法所需的迭代次数比雅克比迭代少,能够更早的达到精度要求。从程序中可以看出,雅克比定义的sum只有一个,而高斯赛德尔需要两个。时效性上后者要好些。六、讨论、心得这次试验算是比较成功,要归功于授课时候的认真听讲.程序编写之前,对书本的理论知识进行了进一步的探索。预习准备工作很彻底,自然随后的一切也都很顺利。实验地点虎峪校区致远楼B401指导教师xx太原理工大学学生实验报告学院名称软件学院专业班级1217班学号201200xxxx学生姓名xx实验日期2014.06。11成绩课程名称数值计算方法实验题目实验四代数插值和最小二乘法拟合一、实验目的和要求(1)使用拉格朗日插值法或牛顿插值法求解:已知f(x)在6个点的函数值如下表所示,运用插值方法,求f(0.596)的近似值。X0.400。550。650.800.901.05f(x)0.410750.578150。696750.888111.026521.25386(2)给定数据点(xi,yi),用最小二乘法拟合数据的多项式,并求平方误差。xi00.50.60。70。80.91。0yi11。751。962.192.442。713。00 二、主要设备笔记本HPProBook6470b一台编译软件:VC++6.0三、实验内容和原理(1)设函数在区间[a,b]上n+1互异节点x0,x1,…,xn上的函数值分别为y0,y1,…,yn,求n次插值多项式Pn(x),满足条件Pn(xj)=yj,j=0,1,…,n令Ln(x)=y0l0(x)+y1l1(x)+…+ynln(x)=∑yili(x)其中l0(x),l1(x),…,ln(x)为以x0,x1,…,xn为节点的n次插值基函数,则Ln(x)是一次数不超过n的多项式,且满足Ln(xj)=yj,L=0,1,…,n再由插值多项式的唯一性,得Pn(x)≡Ln(x)(2)建立正规方程组:∑(∑xij+k)ak=∑xijyi,j=0,1,…,n平方误差:I=∑(∑akxik—yi)2对给定数据点{(Xi,Yi)}(i=0,1,…,m),在取定的函数类Φ中,求p(x)∈Φ,使误差的平方和E2最小,E2=∑[p(Xi)—Yi]2。从几何意义上讲,就是寻求与给定点{(Xi,Yi)}(i=0,1,…,m)的距离平方和为最小的曲线y=p(x)。函数p(x)称为拟合函数或最小二乘解,求拟合函数p(x)的方法称为曲线拟合的最小二乘法.得到的两个关于a0、a1为未知数的两个方程组,解这两个方程组得出:a0=(∑Yi)/m-a1(∑Xi)/ma1=[m∑XiYi—(∑Xi∑Yi)]/[m∑Xi2-(∑Xi)2)]即最终的拟合多项式各项系数。四、操作方法与实验步骤(1)代数插值#include〈stdio.h〉#include#include〈conio.h〉#include〈alloc.h〉voiddifference(float*x,float*y,intn){float*f;intk,i;f=(floa
cin>〉a[num1][num2];
cout<〈endl;
cout<<"输入的系数矩阵为:
"〈for(intnum3=0;num3〈m;num3++){for(intnum4=0;num4〈n;num4++){cout〈〈a[num3][num4]〈〈”";}cout<〈endl;}cout〈〈”请输入矩阵b:”〈for(intnum5=0;num5〈m;num5++){cin〉〉b[num5];}cout<<”输入的矩阵b为:”〈〈endl;for(intnum6=0;num6〈m;num6++){cout〈〈b[num6]〈〈"";}cout〈for(intnum7=0;num7{x[num7]=0.0000;}do{cout<〈”第"〈〈k<<"次迭代值:”;e2=0.0;for(i=0;i〈m;i++){doublesum=0.0;for(j=0;j{if(j!=i)sum+=a[i][j]*x[j];}t1=x[i];t2=e2;x[i]=(b[i]—sum)/a[i][i];e2=(x[i])—t1>=0?(x[i])—t1:t1-(x[i]);e2=(e2>=t2?e2:t2);cout<}cout<〈endl;k++;}while(e2>=e1&&k<30);cout〈〈”共迭代了”〈〈k〈〈”次";delete[]a;delete[]b;delete[]x;return0;} 雅克比迭代法: #includeh>#includeintmain(){floata[3][3]={{10,—1,—2},{—1,10,-2},{-1,—1,5}},b[3]={7.2,8。3,4.2};floatx[3]={0,0,0},sum;inti,j,k,n=3;printf("\t\tX[1]\t\tX[2]\t\tX[3]\n”);for(k=0;k〈8;k++){for(i=0;i<3;i++){sum=0;for(j=0;j{if(i==j)continue;sum=sum+a[i][j]*x[j];}x[i]=(b[i]-sum)/a[i][i];}printf(”第%d次迭代:\t”,k+1);for(i=0;i〈n;i++){printf("%f\t”,x[i]);}printf("\n”);}} 五、实验结果与分析高斯赛德尔迭代法: 雅克比迭代: 分析:使用高斯—赛德尔和雅克比迭代都可以求出方程组的解,但是利用高斯—赛德尔迭代法所需的迭代次数比雅克比迭代少,能够更早的达到精度要求。从程序中可以看出,雅克比定义的sum只有一个,而高斯赛德尔需要两个。时效性上后者要好些。六、讨论、心得这次试验算是比较成功,要归功于授课时候的认真听讲.程序编写之前,对书本的理论知识进行了进一步的探索。预习准备工作很彻底,自然随后的一切也都很顺利。实验地点虎峪校区致远楼B401指导教师xx太原理工大学学生实验报告学院名称软件学院专业班级1217班学号201200xxxx学生姓名xx实验日期2014.06。11成绩课程名称数值计算方法实验题目实验四代数插值和最小二乘法拟合一、实验目的和要求(1)使用拉格朗日插值法或牛顿插值法求解:已知f(x)在6个点的函数值如下表所示,运用插值方法,求f(0.596)的近似值。X0.400。550。650.800.901.05f(x)0.410750.578150。696750.888111.026521.25386(2)给定数据点(xi,yi),用最小二乘法拟合数据的多项式,并求平方误差。xi00.50.60。70。80.91。0yi11。751。962.192.442。713。00 二、主要设备笔记本HPProBook6470b一台编译软件:VC++6.0三、实验内容和原理(1)设函数在区间[a,b]上n+1互异节点x0,x1,…,xn上的函数值分别为y0,y1,…,yn,求n次插值多项式Pn(x),满足条件Pn(xj)=yj,j=0,1,…,n令Ln(x)=y0l0(x)+y1l1(x)+…+ynln(x)=∑yili(x)其中l0(x),l1(x),…,ln(x)为以x0,x1,…,xn为节点的n次插值基函数,则Ln(x)是一次数不超过n的多项式,且满足Ln(xj)=yj,L=0,1,…,n再由插值多项式的唯一性,得Pn(x)≡Ln(x)(2)建立正规方程组:∑(∑xij+k)ak=∑xijyi,j=0,1,…,n平方误差:I=∑(∑akxik—yi)2对给定数据点{(Xi,Yi)}(i=0,1,…,m),在取定的函数类Φ中,求p(x)∈Φ,使误差的平方和E2最小,E2=∑[p(Xi)—Yi]2。从几何意义上讲,就是寻求与给定点{(Xi,Yi)}(i=0,1,…,m)的距离平方和为最小的曲线y=p(x)。函数p(x)称为拟合函数或最小二乘解,求拟合函数p(x)的方法称为曲线拟合的最小二乘法.得到的两个关于a0、a1为未知数的两个方程组,解这两个方程组得出:a0=(∑Yi)/m-a1(∑Xi)/ma1=[m∑XiYi—(∑Xi∑Yi)]/[m∑Xi2-(∑Xi)2)]即最终的拟合多项式各项系数。四、操作方法与实验步骤(1)代数插值#include〈stdio.h〉#include#include〈conio.h〉#include〈alloc.h〉voiddifference(float*x,float*y,intn){float*f;intk,i;f=(floa
for(intnum3=0;num3〈m;num3++)
for(intnum4=0;num4〈n;num4++)
cout〈〈a[num3][num4]〈〈”";
cout〈〈”请输入矩阵b:
”〈for(intnum5=0;num5〈m;num5++){cin〉〉b[num5];}cout<<”输入的矩阵b为:”〈〈endl;for(intnum6=0;num6〈m;num6++){cout〈〈b[num6]〈〈"";}cout〈for(intnum7=0;num7{x[num7]=0.0000;}do{cout<〈”第"〈〈k<<"次迭代值:”;e2=0.0;for(i=0;i〈m;i++){doublesum=0.0;for(j=0;j{if(j!=i)sum+=a[i][j]*x[j];}t1=x[i];t2=e2;x[i]=(b[i]—sum)/a[i][i];e2=(x[i])—t1>=0?(x[i])—t1:t1-(x[i]);e2=(e2>=t2?e2:t2);cout<}cout<〈endl;k++;}while(e2>=e1&&k<30);cout〈〈”共迭代了”〈〈k〈〈”次";delete[]a;delete[]b;delete[]x;return0;} 雅克比迭代法: #includeh>#includeintmain(){floata[3][3]={{10,—1,—2},{—1,10,-2},{-1,—1,5}},b[3]={7.2,8。3,4.2};floatx[3]={0,0,0},sum;inti,j,k,n=3;printf("\t\tX[1]\t\tX[2]\t\tX[3]\n”);for(k=0;k〈8;k++){for(i=0;i<3;i++){sum=0;for(j=0;j{if(i==j)continue;sum=sum+a[i][j]*x[j];}x[i]=(b[i]-sum)/a[i][i];}printf(”第%d次迭代:\t”,k+1);for(i=0;i〈n;i++){printf("%f\t”,x[i]);}printf("\n”);}} 五、实验结果与分析高斯赛德尔迭代法: 雅克比迭代: 分析:使用高斯—赛德尔和雅克比迭代都可以求出方程组的解,但是利用高斯—赛德尔迭代法所需的迭代次数比雅克比迭代少,能够更早的达到精度要求。从程序中可以看出,雅克比定义的sum只有一个,而高斯赛德尔需要两个。时效性上后者要好些。六、讨论、心得这次试验算是比较成功,要归功于授课时候的认真听讲.程序编写之前,对书本的理论知识进行了进一步的探索。预习准备工作很彻底,自然随后的一切也都很顺利。实验地点虎峪校区致远楼B401指导教师xx太原理工大学学生实验报告学院名称软件学院专业班级1217班学号201200xxxx学生姓名xx实验日期2014.06。11成绩课程名称数值计算方法实验题目实验四代数插值和最小二乘法拟合一、实验目的和要求(1)使用拉格朗日插值法或牛顿插值法求解:已知f(x)在6个点的函数值如下表所示,运用插值方法,求f(0.596)的近似值。X0.400。550。650.800.901.05f(x)0.410750.578150。696750.888111.026521.25386(2)给定数据点(xi,yi),用最小二乘法拟合数据的多项式,并求平方误差。xi00.50.60。70。80.91。0yi11。751。962.192.442。713。00 二、主要设备笔记本HPProBook6470b一台编译软件:VC++6.0三、实验内容和原理(1)设函数在区间[a,b]上n+1互异节点x0,x1,…,xn上的函数值分别为y0,y1,…,yn,求n次插值多项式Pn(x),满足条件Pn(xj)=yj,j=0,1,…,n令Ln(x)=y0l0(x)+y1l1(x)+…+ynln(x)=∑yili(x)其中l0(x),l1(x),…,ln(x)为以x0,x1,…,xn为节点的n次插值基函数,则Ln(x)是一次数不超过n的多项式,且满足Ln(xj)=yj,L=0,1,…,n再由插值多项式的唯一性,得Pn(x)≡Ln(x)(2)建立正规方程组:∑(∑xij+k)ak=∑xijyi,j=0,1,…,n平方误差:I=∑(∑akxik—yi)2对给定数据点{(Xi,Yi)}(i=0,1,…,m),在取定的函数类Φ中,求p(x)∈Φ,使误差的平方和E2最小,E2=∑[p(Xi)—Yi]2。从几何意义上讲,就是寻求与给定点{(Xi,Yi)}(i=0,1,…,m)的距离平方和为最小的曲线y=p(x)。函数p(x)称为拟合函数或最小二乘解,求拟合函数p(x)的方法称为曲线拟合的最小二乘法.得到的两个关于a0、a1为未知数的两个方程组,解这两个方程组得出:a0=(∑Yi)/m-a1(∑Xi)/ma1=[m∑XiYi—(∑Xi∑Yi)]/[m∑Xi2-(∑Xi)2)]即最终的拟合多项式各项系数。四、操作方法与实验步骤(1)代数插值#include〈stdio.h〉#include#include〈conio.h〉#include〈alloc.h〉voiddifference(float*x,float*y,intn){float*f;intk,i;f=(floa
for(intnum5=0;num5〈m;num5++)
cin〉〉b[num5];
cout<<”输入的矩阵b为:
”〈〈endl;
for(intnum6=0;num6〈m;num6++)
cout〈〈b[num6]〈〈"";
cout〈for(intnum7=0;num7{x[num7]=0.0000;}do{cout<〈”第"〈〈k<<"次迭代值:”;e2=0.0;for(i=0;i〈m;i++){doublesum=0.0;for(j=0;j{if(j!=i)sum+=a[i][j]*x[j];}t1=x[i];t2=e2;x[i]=(b[i]—sum)/a[i][i];e2=(x[i])—t1>=0?(x[i])—t1:t1-(x[i]);e2=(e2>=t2?e2:t2);cout<}cout<〈endl;k++;}while(e2>=e1&&k<30);cout〈〈”共迭代了”〈〈k〈〈”次";delete[]a;delete[]b;delete[]x;return0;} 雅克比迭代法: #includeh>#includeintmain(){floata[3][3]={{10,—1,—2},{—1,10,-2},{-1,—1,5}},b[3]={7.2,8。3,4.2};floatx[3]={0,0,0},sum;inti,j,k,n=3;printf("\t\tX[1]\t\tX[2]\t\tX[3]\n”);for(k=0;k〈8;k++){for(i=0;i<3;i++){sum=0;for(j=0;j{if(i==j)continue;sum=sum+a[i][j]*x[j];}x[i]=(b[i]-sum)/a[i][i];}printf(”第%d次迭代:\t”,k+1);for(i=0;i〈n;i++){printf("%f\t”,x[i]);}printf("\n”);}} 五、实验结果与分析高斯赛德尔迭代法: 雅克比迭代: 分析:使用高斯—赛德尔和雅克比迭代都可以求出方程组的解,但是利用高斯—赛德尔迭代法所需的迭代次数比雅克比迭代少,能够更早的达到精度要求。从程序中可以看出,雅克比定义的sum只有一个,而高斯赛德尔需要两个。时效性上后者要好些。六、讨论、心得这次试验算是比较成功,要归功于授课时候的认真听讲.程序编写之前,对书本的理论知识进行了进一步的探索。预习准备工作很彻底,自然随后的一切也都很顺利。实验地点虎峪校区致远楼B401指导教师xx太原理工大学学生实验报告学院名称软件学院专业班级1217班学号201200xxxx学生姓名xx实验日期2014.06。11成绩课程名称数值计算方法实验题目实验四代数插值和最小二乘法拟合一、实验目的和要求(1)使用拉格朗日插值法或牛顿插值法求解:已知f(x)在6个点的函数值如下表所示,运用插值方法,求f(0.596)的近似值。X0.400。550。650.800.901.05f(x)0.410750.578150。696750.888111.026521.25386(2)给定数据点(xi,yi),用最小二乘法拟合数据的多项式,并求平方误差。xi00.50.60。70。80.91。0yi11。751。962.192.442。713。00 二、主要设备笔记本HPProBook6470b一台编译软件:VC++6.0三、实验内容和原理(1)设函数在区间[a,b]上n+1互异节点x0,x1,…,xn上的函数值分别为y0,y1,…,yn,求n次插值多项式Pn(x),满足条件Pn(xj)=yj,j=0,1,…,n令Ln(x)=y0l0(x)+y1l1(x)+…+ynln(x)=∑yili(x)其中l0(x),l1(x),…,ln(x)为以x0,x1,…,xn为节点的n次插值基函数,则Ln(x)是一次数不超过n的多项式,且满足Ln(xj)=yj,L=0,1,…,n再由插值多项式的唯一性,得Pn(x)≡Ln(x)(2)建立正规方程组:∑(∑xij+k)ak=∑xijyi,j=0,1,…,n平方误差:I=∑(∑akxik—yi)2对给定数据点{(Xi,Yi)}(i=0,1,…,m),在取定的函数类Φ中,求p(x)∈Φ,使误差的平方和E2最小,E2=∑[p(Xi)—Yi]2。从几何意义上讲,就是寻求与给定点{(Xi,Yi)}(i=0,1,…,m)的距离平方和为最小的曲线y=p(x)。函数p(x)称为拟合函数或最小二乘解,求拟合函数p(x)的方法称为曲线拟合的最小二乘法.得到的两个关于a0、a1为未知数的两个方程组,解这两个方程组得出:a0=(∑Yi)/m-a1(∑Xi)/ma1=[m∑XiYi—(∑Xi∑Yi)]/[m∑Xi2-(∑Xi)2)]即最终的拟合多项式各项系数。四、操作方法与实验步骤(1)代数插值#include〈stdio.h〉#include#include〈conio.h〉#include〈alloc.h〉voiddifference(float*x,float*y,intn){float*f;intk,i;f=(floa
for(intnum7=0;num7{x[num7]=0.0000;}do{cout<〈”第"〈〈k<<"次迭代值:”;e2=0.0;for(i=0;i〈m;i++){doublesum=0.0;for(j=0;j{if(j!=i)sum+=a[i][j]*x[j];}t1=x[i];t2=e2;x[i]=(b[i]—sum)/a[i][i];e2=(x[i])—t1>=0?(x[i])—t1:t1-(x[i]);e2=(e2>=t2?e2:t2);cout<}cout<〈endl;k++;}while(e2>=e1&&k<30);cout〈〈”共迭代了”〈〈k〈〈”次";delete[]a;delete[]b;delete[]x;return0;} 雅克比迭代法: #includeh>#includeintmain(){floata[3][3]={{10,—1,—2},{—1,10,-2},{-1,—1,5}},b[3]={7.2,8。3,4.2};floatx[3]={0,0,0},sum;inti,j,k,n=3;printf("\t\tX[1]\t\tX[2]\t\tX[3]\n”);for(k=0;k〈8;k++){for(i=0;i<3;i++){sum=0;for(j=0;j{if(i==j)continue;sum=sum+a[i][j]*x[j];}x[i]=(b[i]-sum)/a[i][i];}printf(”第%d次迭代:\t”,k+1);for(i=0;i〈n;i++){printf("%f\t”,x[i]);}printf("\n”);}} 五、实验结果与分析高斯赛德尔迭代法: 雅克比迭代: 分析:使用高斯—赛德尔和雅克比迭代都可以求出方程组的解,但是利用高斯—赛德尔迭代法所需的迭代次数比雅克比迭代少,能够更早的达到精度要求。从程序中可以看出,雅克比定义的sum只有一个,而高斯赛德尔需要两个。时效性上后者要好些。六、讨论、心得这次试验算是比较成功,要归功于授课时候的认真听讲.程序编写之前,对书本的理论知识进行了进一步的探索。预习准备工作很彻底,自然随后的一切也都很顺利。实验地点虎峪校区致远楼B401指导教师xx太原理工大学学生实验报告学院名称软件学院专业班级1217班学号201200xxxx学生姓名xx实验日期2014.06。11成绩课程名称数值计算方法实验题目实验四代数插值和最小二乘法拟合一、实验目的和要求(1)使用拉格朗日插值法或牛顿插值法求解:已知f(x)在6个点的函数值如下表所示,运用插值方法,求f(0.596)的近似值。X0.400。550。650.800.901.05f(x)0.410750.578150。696750.888111.026521.25386(2)给定数据点(xi,yi),用最小二乘法拟合数据的多项式,并求平方误差。xi00.50.60。70。80.91。0yi11。751。962.192.442。713。00 二、主要设备笔记本HPProBook6470b一台编译软件:VC++6.0三、实验内容和原理(1)设函数在区间[a,b]上n+1互异节点x0,x1,…,xn上的函数值分别为y0,y1,…,yn,求n次插值多项式Pn(x),满足条件Pn(xj)=yj,j=0,1,…,n令Ln(x)=y0l0(x)+y1l1(x)+…+ynln(x)=∑yili(x)其中l0(x),l1(x),…,ln(x)为以x0,x1,…,xn为节点的n次插值基函数,则Ln(x)是一次数不超过n的多项式,且满足Ln(xj)=yj,L=0,1,…,n再由插值多项式的唯一性,得Pn(x)≡Ln(x)(2)建立正规方程组:∑(∑xij+k)ak=∑xijyi,j=0,1,…,n平方误差:I=∑(∑akxik—yi)2对给定数据点{(Xi,Yi)}(i=0,1,…,m),在取定的函数类Φ中,求p(x)∈Φ,使误差的平方和E2最小,E2=∑[p(Xi)—Yi]2。从几何意义上讲,就是寻求与给定点{(Xi,Yi)}(i=0,1,…,m)的距离平方和为最小的曲线y=p(x)。函数p(x)称为拟合函数或最小二乘解,求拟合函数p(x)的方法称为曲线拟合的最小二乘法.得到的两个关于a0、a1为未知数的两个方程组,解这两个方程组得出:a0=(∑Yi)/m-a1(∑Xi)/ma1=[m∑XiYi—(∑Xi∑Yi)]/[m∑Xi2-(∑Xi)2)]即最终的拟合多项式各项系数。四、操作方法与实验步骤(1)代数插值#include〈stdio.h〉#include#include〈conio.h〉#include〈alloc.h〉voiddifference(float*x,float*y,intn){float*f;intk,i;f=(floa
x[num7]=0.0000;
do
cout<〈”第"〈〈k<<"次迭代值:
”;
e2=0.0;
for(i=0;i〈m;i++)
doublesum=0.0;
for(j=0;j{if(j!=i)sum+=a[i][j]*x[j];}t1=x[i];t2=e2;x[i]=(b[i]—sum)/a[i][i];e2=(x[i])—t1>=0?(x[i])—t1:t1-(x[i]);e2=(e2>=t2?e2:t2);cout<}cout<〈endl;k++;}while(e2>=e1&&k<30);cout〈〈”共迭代了”〈〈k〈〈”次";delete[]a;delete[]b;delete[]x;return0;} 雅克比迭代法: #includeh>#includeintmain(){floata[3][3]={{10,—1,—2},{—1,10,-2},{-1,—1,5}},b[3]={7.2,8。3,4.2};floatx[3]={0,0,0},sum;inti,j,k,n=3;printf("\t\tX[1]\t\tX[2]\t\tX[3]\n”);for(k=0;k〈8;k++){for(i=0;i<3;i++){sum=0;for(j=0;j{if(i==j)continue;sum=sum+a[i][j]*x[j];}x[i]=(b[i]-sum)/a[i][i];}printf(”第%d次迭代:\t”,k+1);for(i=0;i〈n;i++){printf("%f\t”,x[i]);}printf("\n”);}} 五、实验结果与分析高斯赛德尔迭代法: 雅克比迭代: 分析:使用高斯—赛德尔和雅克比迭代都可以求出方程组的解,但是利用高斯—赛德尔迭代法所需的迭代次数比雅克比迭代少,能够更早的达到精度要求。从程序中可以看出,雅克比定义的sum只有一个,而高斯赛德尔需要两个。时效性上后者要好些。六、讨论、心得这次试验算是比较成功,要归功于授课时候的认真听讲.程序编写之前,对书本的理论知识进行了进一步的探索。预习准备工作很彻底,自然随后的一切也都很顺利。实验地点虎峪校区致远楼B401指导教师xx太原理工大学学生实验报告学院名称软件学院专业班级1217班学号201200xxxx学生姓名xx实验日期2014.06。11成绩课程名称数值计算方法实验题目实验四代数插值和最小二乘法拟合一、实验目的和要求(1)使用拉格朗日插值法或牛顿插值法求解:已知f(x)在6个点的函数值如下表所示,运用插值方法,求f(0.596)的近似值。X0.400。550。650.800.901.05f(x)0.410750.578150。696750.888111.026521.25386(2)给定数据点(xi,yi),用最小二乘法拟合数据的多项式,并求平方误差。xi00.50.60。70。80.91。0yi11。751。962.192.442。713。00 二、主要设备笔记本HPProBook6470b一台编译软件:VC++6.0三、实验内容和原理(1)设函数在区间[a,b]上n+1互异节点x0,x1,…,xn上的函数值分别为y0,y1,…,yn,求n次插值多项式Pn(x),满足条件Pn(xj)=yj,j=0,1,…,n令Ln(x)=y0l0(x)+y1l1(x)+…+ynln(x)=∑yili(x)其中l0(x),l1(x),…,ln(x)为以x0,x1,…,xn为节点的n次插值基函数,则Ln(x)是一次数不超过n的多项式,且满足Ln(xj)=yj,L=0,1,…,n再由插值多项式的唯一性,得Pn(x)≡Ln(x)(2)建立正规方程组:∑(∑xij+k)ak=∑xijyi,j=0,1,…,n平方误差:I=∑(∑akxik—yi)2对给定数据点{(Xi,Yi)}(i=0,1,…,m),在取定的函数类Φ中,求p(x)∈Φ,使误差的平方和E2最小,E2=∑[p(Xi)—Yi]2。从几何意义上讲,就是寻求与给定点{(Xi,Yi)}(i=0,1,…,m)的距离平方和为最小的曲线y=p(x)。函数p(x)称为拟合函数或最小二乘解,求拟合函数p(x)的方法称为曲线拟合的最小二乘法.得到的两个关于a0、a1为未知数的两个方程组,解这两个方程组得出:a0=(∑Yi)/m-a1(∑Xi)/ma1=[m∑XiYi—(∑Xi∑Yi)]/[m∑Xi2-(∑Xi)2)]即最终的拟合多项式各项系数。四、操作方法与实验步骤(1)代数插值#include〈stdio.h〉#include#include〈conio.h〉#include〈alloc.h〉voiddifference(float*x,float*y,intn){float*f;intk,i;f=(floa
if(j!
=i)
sum+=a[i][j]*x[j];
t1=x[i];
t2=e2;
x[i]=(b[i]—sum)/a[i][i];
e2=(x[i])—t1>=0?
(x[i])—t1:
t1-(x[i]);
e2=(e2>=t2?
e2:
t2);
cout<}cout<〈endl;k++;}while(e2>=e1&&k<30);cout〈〈”共迭代了”〈〈k〈〈”次";delete[]a;delete[]b;delete[]x;return0;} 雅克比迭代法: #includeh>#includeintmain(){floata[3][3]={{10,—1,—2},{—1,10,-2},{-1,—1,5}},b[3]={7.2,8。3,4.2};floatx[3]={0,0,0},sum;inti,j,k,n=3;printf("\t\tX[1]\t\tX[2]\t\tX[3]\n”);for(k=0;k〈8;k++){for(i=0;i<3;i++){sum=0;for(j=0;j{if(i==j)continue;sum=sum+a[i][j]*x[j];}x[i]=(b[i]-sum)/a[i][i];}printf(”第%d次迭代:\t”,k+1);for(i=0;i〈n;i++){printf("%f\t”,x[i]);}printf("\n”);}} 五、实验结果与分析高斯赛德尔迭代法: 雅克比迭代: 分析:使用高斯—赛德尔和雅克比迭代都可以求出方程组的解,但是利用高斯—赛德尔迭代法所需的迭代次数比雅克比迭代少,能够更早的达到精度要求。从程序中可以看出,雅克比定义的sum只有一个,而高斯赛德尔需要两个。时效性上后者要好些。六、讨论、心得这次试验算是比较成功,要归功于授课时候的认真听讲.程序编写之前,对书本的理论知识进行了进一步的探索。预习准备工作很彻底,自然随后的一切也都很顺利。实验地点虎峪校区致远楼B401指导教师xx太原理工大学学生实验报告学院名称软件学院专业班级1217班学号201200xxxx学生姓名xx实验日期2014.06。11成绩课程名称数值计算方法实验题目实验四代数插值和最小二乘法拟合一、实验目的和要求(1)使用拉格朗日插值法或牛顿插值法求解:已知f(x)在6个点的函数值如下表所示,运用插值方法,求f(0.596)的近似值。X0.400。550。650.800.901.05f(x)0.410750.578150。696750.888111.026521.25386(2)给定数据点(xi,yi),用最小二乘法拟合数据的多项式,并求平方误差。xi00.50.60。70。80.91。0yi11。751。962.192.442。713。00 二、主要设备笔记本HPProBook6470b一台编译软件:VC++6.0三、实验内容和原理(1)设函数在区间[a,b]上n+1互异节点x0,x1,…,xn上的函数值分别为y0,y1,…,yn,求n次插值多项式Pn(x),满足条件Pn(xj)=yj,j=0,1,…,n令Ln(x)=y0l0(x)+y1l1(x)+…+ynln(x)=∑yili(x)其中l0(x),l1(x),…,ln(x)为以x0,x1,…,xn为节点的n次插值基函数,则Ln(x)是一次数不超过n的多项式,且满足Ln(xj)=yj,L=0,1,…,n再由插值多项式的唯一性,得Pn(x)≡Ln(x)(2)建立正规方程组:∑(∑xij+k)ak=∑xijyi,j=0,1,…,n平方误差:I=∑(∑akxik—yi)2对给定数据点{(Xi,Yi)}(i=0,1,…,m),在取定的函数类Φ中,求p(x)∈Φ,使误差的平方和E2最小,E2=∑[p(Xi)—Yi]2。从几何意义上讲,就是寻求与给定点{(Xi,Yi)}(i=0,1,…,m)的距离平方和为最小的曲线y=p(x)。函数p(x)称为拟合函数或最小二乘解,求拟合函数p(x)的方法称为曲线拟合的最小二乘法.得到的两个关于a0、a1为未知数的两个方程组,解这两个方程组得出:a0=(∑Yi)/m-a1(∑Xi)/ma1=[m∑XiYi—(∑Xi∑Yi)]/[m∑Xi2-(∑Xi)2)]即最终的拟合多项式各项系数。四、操作方法与实验步骤(1)代数插值#include〈stdio.h〉#include#include〈conio.h〉#include〈alloc.h〉voiddifference(float*x,float*y,intn){float*f;intk,i;f=(floa
k++;
}while(e2>=e1&&k<30);
cout〈〈”共迭代了”〈〈k〈〈”次";
delete[]a;
delete[]b;
delete[]x;
雅克比迭代法:
#includeh>#includeintmain(){floata[3][3]={{10,—1,—2},{—1,10,-2},{-1,—1,5}},b[3]={7.2,8。3,4.2};floatx[3]={0,0,0},sum;inti,j,k,n=3;printf("\t\tX[1]\t\tX[2]\t\tX[3]\n”);for(k=0;k〈8;k++){for(i=0;i<3;i++){sum=0;for(j=0;j{if(i==j)continue;sum=sum+a[i][j]*x[j];}x[i]=(b[i]-sum)/a[i][i];}printf(”第%d次迭代:\t”,k+1);for(i=0;i〈n;i++){printf("%f\t”,x[i]);}printf("\n”);}} 五、实验结果与分析高斯赛德尔迭代法: 雅克比迭代: 分析:使用高斯—赛德尔和雅克比迭代都可以求出方程组的解,但是利用高斯—赛德尔迭代法所需的迭代次数比雅克比迭代少,能够更早的达到精度要求。从程序中可以看出,雅克比定义的sum只有一个,而高斯赛德尔需要两个。时效性上后者要好些。六、讨论、心得这次试验算是比较成功,要归功于授课时候的认真听讲.程序编写之前,对书本的理论知识进行了进一步的探索。预习准备工作很彻底,自然随后的一切也都很顺利。实验地点虎峪校区致远楼B401指导教师xx太原理工大学学生实验报告学院名称软件学院专业班级1217班学号201200xxxx学生姓名xx实验日期2014.06。11成绩课程名称数值计算方法实验题目实验四代数插值和最小二乘法拟合一、实验目的和要求(1)使用拉格朗日插值法或牛顿插值法求解:已知f(x)在6个点的函数值如下表所示,运用插值方法,求f(0.596)的近似值。X0.400。550。650.800.901.05f(x)0.410750.578150。696750.888111.026521.25386(2)给定数据点(xi,yi),用最小二乘法拟合数据的多项式,并求平方误差。xi00.50.60。70。80.91。0yi11。751。962.192.442。713。00 二、主要设备笔记本HPProBook6470b一台编译软件:VC++6.0三、实验内容和原理(1)设函数在区间[a,b]上n+1互异节点x0,x1,…,xn上的函数值分别为y0,y1,…,yn,求n次插值多项式Pn(x),满足条件Pn(xj)=yj,j=0,1,…,n令Ln(x)=y0l0(x)+y1l1(x)+…+ynln(x)=∑yili(x)其中l0(x),l1(x),…,ln(x)为以x0,x1,…,xn为节点的n次插值基函数,则Ln(x)是一次数不超过n的多项式,且满足Ln(xj)=yj,L=0,1,…,n再由插值多项式的唯一性,得Pn(x)≡Ln(x)(2)建立正规方程组:∑(∑xij+k)ak=∑xijyi,j=0,1,…,n平方误差:I=∑(∑akxik—yi)2对给定数据点{(Xi,Yi)}(i=0,1,…,m),在取定的函数类Φ中,求p(x)∈Φ,使误差的平方和E2最小,E2=∑[p(Xi)—Yi]2。从几何意义上讲,就是寻求与给定点{(Xi,Yi)}(i=0,1,…,m)的距离平方和为最小的曲线y=p(x)。函数p(x)称为拟合函数或最小二乘解,求拟合函数p(x)的方法称为曲线拟合的最小二乘法.得到的两个关于a0、a1为未知数的两个方程组,解这两个方程组得出:a0=(∑Yi)/m-a1(∑Xi)/ma1=[m∑XiYi—(∑Xi∑Yi)]/[m∑Xi2-(∑Xi)2)]即最终的拟合多项式各项系数。四、操作方法与实验步骤(1)代数插值#include〈stdio.h〉#include#include〈conio.h〉#include〈alloc.h〉voiddifference(float*x,float*y,intn){float*f;intk,i;f=(floa
h>
#include
floata[3][3]={{10,—1,—2},{—1,10,-2},{-1,—1,5}},b[3]={7.2,8。
3,4.2};
floatx[3]={0,0,0},sum;
inti,j,k,n=3;
printf("\t\tX[1]\t\tX[2]\t\tX[3]\n”);
for(k=0;k〈8;k++)
for(i=0;i<3;i++)
sum=0;
for(j=0;j{if(i==j)continue;sum=sum+a[i][j]*x[j];}x[i]=(b[i]-sum)/a[i][i];}printf(”第%d次迭代:\t”,k+1);for(i=0;i〈n;i++){printf("%f\t”,x[i]);}printf("\n”);}} 五、实验结果与分析高斯赛德尔迭代法: 雅克比迭代: 分析:使用高斯—赛德尔和雅克比迭代都可以求出方程组的解,但是利用高斯—赛德尔迭代法所需的迭代次数比雅克比迭代少,能够更早的达到精度要求。从程序中可以看出,雅克比定义的sum只有一个,而高斯赛德尔需要两个。时效性上后者要好些。六、讨论、心得这次试验算是比较成功,要归功于授课时候的认真听讲.程序编写之前,对书本的理论知识进行了进一步的探索。预习准备工作很彻底,自然随后的一切也都很顺利。实验地点虎峪校区致远楼B401指导教师xx太原理工大学学生实验报告学院名称软件学院专业班级1217班学号201200xxxx学生姓名xx实验日期2014.06。11成绩课程名称数值计算方法实验题目实验四代数插值和最小二乘法拟合一、实验目的和要求(1)使用拉格朗日插值法或牛顿插值法求解:已知f(x)在6个点的函数值如下表所示,运用插值方法,求f(0.596)的近似值。X0.400。550。650.800.901.05f(x)0.410750.578150。696750.888111.026521.25386(2)给定数据点(xi,yi),用最小二乘法拟合数据的多项式,并求平方误差。xi00.50.60。70。80.91。0yi11。751。962.192.442。713。00 二、主要设备笔记本HPProBook6470b一台编译软件:VC++6.0三、实验内容和原理(1)设函数在区间[a,b]上n+1互异节点x0,x1,…,xn上的函数值分别为y0,y1,…,yn,求n次插值多项式Pn(x),满足条件Pn(xj)=yj,j=0,1,…,n令Ln(x)=y0l0(x)+y1l1(x)+…+ynln(x)=∑yili(x)其中l0(x),l1(x),…,ln(x)为以x0,x1,…,xn为节点的n次插值基函数,则Ln(x)是一次数不超过n的多项式,且满足Ln(xj)=yj,L=0,1,…,n再由插值多项式的唯一性,得Pn(x)≡Ln(x)(2)建立正规方程组:∑(∑xij+k)ak=∑xijyi,j=0,1,…,n平方误差:I=∑(∑akxik—yi)2对给定数据点{(Xi,Yi)}(i=0,1,…,m),在取定的函数类Φ中,求p(x)∈Φ,使误差的平方和E2最小,E2=∑[p(Xi)—Yi]2。从几何意义上讲,就是寻求与给定点{(Xi,Yi)}(i=0,1,…,m)的距离平方和为最小的曲线y=p(x)。函数p(x)称为拟合函数或最小二乘解,求拟合函数p(x)的方法称为曲线拟合的最小二乘法.得到的两个关于a0、a1为未知数的两个方程组,解这两个方程组得出:a0=(∑Yi)/m-a1(∑Xi)/ma1=[m∑XiYi—(∑Xi∑Yi)]/[m∑Xi2-(∑Xi)2)]即最终的拟合多项式各项系数。四、操作方法与实验步骤(1)代数插值#include〈stdio.h〉#include#include〈conio.h〉#include〈alloc.h〉voiddifference(float*x,float*y,intn){float*f;intk,i;f=(floa
if(i==j)continue;
sum=sum+a[i][j]*x[j];
x[i]=(b[i]-sum)/a[i][i];
printf(”第%d次迭代:
\t”,k+1);
for(i=0;i〈n;i++)
printf("%f\t”,x[i]);
高斯赛德尔迭代法:
雅克比迭代:
使用高斯—赛德尔和雅克比迭代都可以求出方程组的解,但是利用高斯—赛德尔迭代法所需的迭代次数比雅克比迭代少,能够更早的达到精度要求。
从程序中可以看出,雅克比定义的sum只有一个,而高斯赛德尔需要两个。
时效性上后者要好些。
这次试验算是比较成功,要归功于授课时候的认真听讲.程序编写之前,对书本的理论知识进行了进一步的探索。
预习准备工作很彻底,自然随后的一切也都很顺利。
2014.06。
11
实验四代数插值和最小二乘法拟合
(1)使用拉格朗日插值法或牛顿插值法求解:
已知f(x)在6个点的函数值如下表所示,运用插值方法,求f(0.596)的近似值。
X
0.40
0。
55
65
0.80
0.90
1.05
f(x)
0.41075
0.57815
69675
0.88811
1.02652
1.25386
(2)给定数据点(xi,yi),用最小二乘法拟合数据的多项式,并求平方误差。
xi
0.5
0.6
7
8
0.9
yi
75
96
2.19
2.44
71
00
(1)设函数在区间[a,b]上n+1互异节点x0,x1,…,xn上的函数值分别为y0,y1,…,yn,求n次插值多项式Pn(x),满足条件
Pn(xj)=yj,j=0,1,…,n
令
Ln(x)=y0l0(x)+y1l1(x)+…+ynln(x)=∑yili(x)
其中l0(x),l1(x),…,ln(x)为以x0,x1,…,xn为节点的n次插值基函数,
则Ln(x)是一次数不超过n的多项式,且满足
Ln(xj)=yj,L=0,1,…,n
再由插值多项式的唯一性,得
Pn(x)≡Ln(x)
(2)建立正规方程组:
∑(∑xij+k)ak=∑xijyi,j=0,1,…,n
平方误差:
I=∑(∑akxik—yi)2
对给定数据点{(Xi,Yi)}(i=0,1,…,m),在取定的函数类Φ中,求p(x)∈Φ,使误差的平方和E2最小,E2=∑[p(Xi)—Yi]2。
从几何意义上讲,就是寻求与给定点{(Xi,Yi)}(i=0,1,…,m)的距离平方和为最小的曲线y=p(x)。
函数p(x)称为拟合函数或最小二乘解,求拟合函数p(x)的方法称为曲线拟合的最小二乘法.
得到的两个关于a0、a1为未知数的两个方程组,解这两个方程组得出:
a0=(∑Yi)/m-a1(∑Xi)/m
a1=[m∑XiYi—(∑Xi∑Yi)]/[m∑Xi2-(∑Xi)2)]
即最终的拟合多项式各项系数。
(1)代数插值
#include〈stdio.h〉
#include〈conio.h〉
#include〈alloc.h〉
voiddifference(float*x,float*y,intn)
float*f;
intk,i;
f=(floa
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1