1、主要仪器设备笔记本计算机实验记录(写出实验内容中的程序代码和运行结果)(可分栏或加页)迭代法:#include stdafx.h#includestdio.hmath.hiostreamusing namespace std;float main() float a; cina; float t, x; x=a; do x=sqrt(10-x*x*x)/4); t=a; a=x; while(fabs(a-t)0.5*1e-5); printf(x=%f,a); system(pause);割线法: float c,a=1.0,b=2.0; /cinab; while(1) c=b-(b*b*
2、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.000001) break; b=c; coutc;实验结果和分析 实验结果:割线法:心得体会(遇到的问题和解决方法)使用不同的方法,可以不同程度的求得方程的解,不同的方法速度不同。实验二 线性方程组的直接求解实验内容和要求(1)了解线性方程组常见的直接解法,如Guass消元法、LU分解法、追赶法。(2)加深对线性方程组求解方法的认识,掌握算法。(3)会进行误差分析,并能对不同方法进行比较。实验原理合理利用Gauss消元法、LU分解法或追赶法求解下列方程组:1 、2、
3、3、4、(n=5,10,100,)台式或笔记本计算机 Gauss消元法: float main() float a34=1,2,3,14,0,1,2,8,2,4,1,13; float x3; float sum=0; int k,i,j; for(k=0;k2;k+) for(i=k+1;i3;i+) for(j=k+1;j4;j+)aij=aij-aik/akk*akj; for(i=0; for(j=0; printf(a%d%d=%f,i,j,aij); cout=0;k-) sum=0; for(j=k+1; sum+=akj*xj; xk=(ak3-sum)/akk; for(i=
4、0; printf (x%d=%f,i+1,xi);LU分解法:#include math.h#define L 30 double a L L , b L , l L L , u L L , x L , y L ; int main() int n, i, j, k, r; scanf( %d, &n ); for ( i = 1; i = n; +i ) for ( j = 1; j +j ) %lfa i j );b i ); +i ) for ( j = 1; +j ) l i j =0; u i j = 0.0; for ( k = 1; k +k ) for ( j = k; +j
5、 ) u k j = a k j ; for ( r = 1; r 0; -i ) x i = y i ; for ( j = i + 1; x i -= u i j * x j ; x i /= u i i ; printf( %0.2lfn, x i ); return 0;追赶法:void main() FILE *f; double a15,b15,c15,d15; double t; int i,n; f=fopen(zgf.txt,r fscanf(f,&n);%lf%lf%lfb1,&c1,&d1); for(i=2;=n-1; fscanf(f,%lf%lf%lf%lfai,&
6、bi,&ci,&di);an,&bn,&dn); fclose(f); c1=c1/b1; d1=d1/b1; t=bi-ci-1*ai; ci=ci/t; di=(di-di-1*ai)/t; dn=(dn-dn-1*an)/(bn-cn-1*an); for(i=n-1;i=1;i-) di=di-ci*di+1; printf(n*n for(i=1;=n;d%2d=%lfn,i,di);Zgf.txt文件中的内容是:52 1 -71 2 1 -5 1 2 1 -5 1 2 -5Gauss消元法:在调试过程中发现自己还是很粗心,容易犯简单错误,在今后应该多编写程序。实验三 线性方程组的迭
7、代求解学习使用雅可比迭代法或高斯-赛德尔迭代法高斯-赛德尔迭代法: float a33=10,-1,-2,-1,10,-2,-1,-1,5,b3=7.2,8.3,4.2;float x3=0,0,0,sum1,sum2;int i,j,k,n=3;for (k=0;10; for(i=0;n; sum1=0; sum2=0;for(j=0;i; sum1=sum1+aij*xj;for(j=i+1; sum2=sum2+aij*xj; xi=(bi-sum1-sum2)/aii; for(i=0;i+) printf(n 雅克比迭代: float a33=10,-1,-2,-1,10,-2,-
8、1,-1,5,b3=7.2,8.3,4.2;float x3=0,0,0,sum1; sum1=0; for(j=0; if(i=j) continue; xi=(bi-sum1)/aii;for(i=0; printf(printf(结果:分析:使用高斯-赛德尔和雅克比迭代都可以求出方程组的解,但是利用高斯-赛德尔迭代法所需的迭代次数比雅克比迭代少,能够更早的达到精度要求。高斯迭代法比雅克比迭代迭代速度快,所以在编程时选择了高斯迭代法。实验四 代数插值和最小二乘法拟合 实验内容:使用拉格朗日插值法求解:已知f(x)在6个点的函数值如下表所示,运用插值方法,求f(0.596)的近似值。x0.4
9、00.550.650.800.901.05f(x)0.410750.578150.696750.888111.026521.25386实验要求:1了解拉格朗日插值法的基本方法、基本原理。 2通过编写程序,进行算法设计和数值求解。拉格朗日基函数为:拉格朗日插值多项式为:#includeiostream.htypedef struct data float x; float y;Data;Data d20;float f(int s,int t) if(t=s+1) return (dt.y-ds.y)/(dt.x-ds.x); else return (f(s+1,t)-f(s,t-1)/(dt
10、.x-ds.x);float Newton(float x,int count) int n; cout请输入n值(即n次插值):; if(n=count-1) break;cls float t=1.0; float y=d0.y; float yt=0.0; for(int j=1; t=(x-dj-1.x)*t; yt=f(0,j)*t; y=y+yt; return y;float lagrange(float x,int count) float y=0.0; for(int k=0;count; float p=1.0; for(int j=0; if(k=j)continue;
11、p=p*(x-dj.x)/(dk.x-dj.x); y=y+p*dk.y; float x,y; int count;请输入xi,yi的组数,不得超过20组: if(count=20) for(int i=0;请输入第i+1组x的值:di.x;组y的值:di.y;请输入x的值:/获得变量x的值x; int choice=3;请您选择使用哪种插值法计算: (0):退出 (1):Lagrange (2):Newton输入你的选择:choice; if(choice=2)你选择了牛顿插值计算方法,其结果为: y=Newton(x,count);break; if(choice=1)你选择了拉格朗日插值计算方法,其结果为: y=lagrange(x,count); if(choice=0)输入错误!x , y拉格朗日插值的优点是插值多项式特别容易建立,缺点是增加节点是原有多项式不能利用,必须重新建立,即所有基函数都要重新计算,这就造成计算量的浪费。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1