文档详情

太原理工大学数值计算方法实验报告

ba****u
实名认证
店铺
DOCX
200.07KB
约16页
文档ID:146979092
太原理工大学数值计算方法实验报告_第1页
1/16

本科实验报告课程名称: 电脑数值方法 实验项目:方程求根、线性方程组的直接解法、线性方程组的迭代解法、代数插值和最小二乘拟合多项式实验地点:行勉楼专业班级:******** 学n一 *********学号:学生:¥¥¥¥¥¥¥¥ ********指导教师:李言志,崔冬华2016年4月8日学生实验成绩实验名称实验一方程求根实验内容和要求熟悉使用二分法、迭代法、牛顿法、割线法等方法对给定的方程进行根的求解选择上 述方法中的两种方法求方程:f(x)=x3+4x2-10=0在[1,2]内的一个实根,且要求满足精度 |x*-x X 10-5〔1〕了解非线性方程求根的常见方法,如二分法、牛顿法、割线法〔2〕加深对方程求根方法的认识,掌握算法〔3〕会进行误差分析,并能对不同方法进行比较实验原理1. 二分法:如果要求已知函数f(x) = 0的根(x的解),那先要找出一个区间[a, b], 使得f(a)与f(b)异号根据介值定理,这个区间内一定包含着方程式的根求该区间的 中点m=(a+b)/2,并找出f(m)的值假设f(m)与f(a)正负号相同,则取[m, b]为 新的区间,否则取[a, m]重复第3步和第4步,直到得到理想的精确度为止。

2. 割线法是利用牛顿迭代法的思想,在根的某个领域内,函数有直至二阶的连续导数,并 且不等于0,则在领域内选取初值x0,x1,迭代均收敛〔1)在区间[m ,n]内输入初值x0,x1.〔2〕计算 x2x2=x1-f(x1)*(x1-x0)/(f(x1)-f(x0))〔3〕 x0=x1,x1=x2〔4)判断是否到达精度,假设是输出x1,假设否 执行〔2〕主要仪器设备HP电脑实验记录//方程求根〔二分法〕.cpp :定义控制台应用程序的入口点//#include "stdafx.h"#include"iostream"using namespace std;class Text{public:float x, y, a, b, c, n = 0;void Getab(){cout << ”请输入计算区间:(以空格隔开)”<< endl;cin >> a >> b;}float GetY(float x){y = x*x*x + 4 * x*x - 10;return y;float Calculate(float a,float b)c = (a + b) / 2;n++;if (GetY(c) == 0 || ((b - a) / 2) < 0.000005)cout << c <<"为方程的解"<< endl;return 0;if (GetY(a)*GetY(c) < 0)return Calculate(a,c);if (GetY(c)*GetY(b)< 0)return Calculate(c,b);};int main()cout << ”方程组为:f(x)=xA3+4xA2-10=0" << endl;float a, b;Text text;text.Getab();a = text.a;b = text.b;text.Calculate(a, b);return 0;成 C :\VflNIDOGSem 32\rmd. Exe方程组为十请输入计算区间;(以空格隔开)1 2L胡523为方程的解请按任童键继续一一一2.割线法://方程求根〔割线法〕.cpp :定义控制台应用程序的入口点。

//#include "stdafx.h"#include"iostream"using namespace std; class A {public:float x0,x1,y;float GetY(float x) {y= x*x*x+4*x*x-10;return y;}void GetNumber(){<< endl;-x0));cout<<”请输入两个初始近似值:(以空格隔开)" cin >> x0;cin >> x1;}void Calculate(float x0,float x1){float x2;x2 = x1 - (GetY(x1) / (GetY(x1) - GetY(x0))*(x1 if (x2==x1){cout <

面对一个复杂的问题,要学会简化处理步骤,分步骤 一点一点的循序处理,只有这样,才能高效的解决一个复杂问题实验名称实验二线性方程组的直接求解实验内容和要求合理选择利用Gau「1 2 3]「广10 1 2 X22 4 1 x1- 」*- 3」〔1〕了解线中〔2〕加深对〔3〕会进行tss消兀法、主兀素消兀法、LU分解法、追赶法求解以下方程组:「14]二813」生方程组常见的直接解法,如Guass消元法、LU分解法、追赶法专性方程组求解方法的认识,掌握算法吴差分析,并能对不同方法进行比较实验原理1. 高斯分解法:⑴将原方程组化为三角形方阵的方程组:lik=aik/akka = a - l** ak. k=1,2,…,n-1i=k+1,k+2, …,n j=k+1,k+2, -^,n+1⑵由回代过程求得原方程组的解:Xn= " %xk=( ak +1-Eak. x.)/ akk (k=n-1,n-2, •••,2,1)2. LU分解法:将系数矩阵A转化为A=L*U, L为单位下三角矩阵,U为普通上三角矩阵,然后 通过解方程组l*y=b,u*x=y,来求解x.主要仪器设备HP电脑实验记录1.高斯消兀法:#include "stdio.h"#include "math.h"#include double a[5][6],a0[5][6];double l[5],tmp;void Exchange(int i){int j,l,k;double max=a0[i][i],temp;j=i;for(k=i;k<=3;k++){if(a0[k][i]>max){max=a0[k][i];j=k;for(l=i;l<=4;l++)temp=a0[i][l];a0[i][l]=a0[j][l];a0[j][l]=temp;for(i=1;i<=3;i++)for(j=1;j<=4;j++)a[i][j]=a0[i][j];void displayA()int i,j;printf("\n");for(j=1;j<=3;j++)for(i=1;i<=4;i++) printf("%lf ",a[j][i]); printf("\n");void main()int i,j,k;for(i=1;i<=3;i++)for(j=1;j<=4;j++){ scanf("%lf",&a[i][j]);a0[i][j]=a[i][j];displayA(); printf(',列主元素消元法如下”);//消元过程k=1;doExchange(k);_(EIT=UW$HM£X=)扫upd(++SHV二.llHE f 二兰MM(d§,sguHgI BI*sgH+d§(++K TVM +mh££oHdtu-l—' )lM 二 hcm$hm)j£..ss^ssx^回/'((Mqlf 巨BH5S0U (++K 彳V二.llMOJ)(++$hvmh££章jq (TM)七++Mfov 富 ds_p f sg0u*5rB30UHB写)(++罕 hvkmaje i(E3T=Mg4lI£=£h)扫updiggo^gEOHEI) (++WHV二+M.IIMEovmldswm=m+a[k][r]*a[r][j];} a[k][j]=a[k][j]-m;m=0;} for(i=k+1;i<=2;i++)( { for(r=0;r<=k-1;r++)p=p+a[i][r]*a[r][k];} a[i][k]=(a[i][k]-p)/a[k][k]; p=0; } } }void main() {static double a[3][3]={{1,2,3},{0,1,2},{2,4,1}};static double b[3]={14,8,13};double c[3];double d[3];double f[3][3];double m=0;double n=0;int r;int i,j;lu(a);printf("输出U的矩阵为\n");for(i=0;i<=2;i++){ for(j=i;j<=2;j++) {f[i][j]=a[i][j];printf(- %f",f[i][j]);} printf("\n");}printf("输出L的矩阵为\n");for(i=0;i<=2;i++) {for(j=0;j<=i;j++){ if(i==j) {a[i][j]=1; printf(- %f",a[i][j]);} elseprintf(- %f",a[i][j]); }printf("\n");} c[0]=b[0];for(i=1;i<=2;i++){for(r=0;r<=i-1;r=r+1)m=m+a[i][r]*c[r];c[i]=b[i]-m;m=0;}d[2]=c[2]/f[2][2];for(i=1;i>=0;i=i-1){for(r=2;r>i;r=r-1)n=n+f[i][r]*d[r];d[i]=(c[i]-n)/f[i][i];n=0;}printf("所求方程组解为x1=%f, x2=%f, x3=%f”,d[0],d[1],d⑵);/*根据LU分解所得两 个矩阵及求解步骤计算所求X 一组解*/ },刖H|U削担阡刃1.000000 2.00Q090 3.0000001.000000 2.000000-5.000000葡出L的矩阵为1.000000Q.000000 1.2.000000 0.000000 1.000000防求方程组解为.曲丽丽,x2 =2 -000080, x3 =3.000000Press any key to conti nue心得体会对于求解线性方程组的各种直接方法来说各有优缺点,在所有的求解方法中都应 该注意其解的精度。

注意不同求解方法的不同误差求法编写程序的时候需要一步一步 慢慢来,逐步增加自己的算法知识水平和解决问题的能力实验名称实验三线性方程组的迭代求解实验内容和要求[101 - x - 2x = 7.2{-x +10x -2x = 8.3—x — x + 5 x = 4.2 l 1 2 3使用雅可比迭代法或高斯-赛德尔迭代法对以下方程组进行求解实验原理雅可比迭代法:设线性方程组Ax=b的系数矩阵A可逆且主对角元素a”,%,…,ann均不为零,令 D=diag(an,a22,^,ann)并将A分解成A=(A-D)+D从而线性方程组可写成Dx=(D-A) x+b则有迭代公式x(k+1)=B1x (k)+f1其中,B =I-D-1A,f =D-1bo主要仪器设备HP电脑实验记录#include #includeint main(){int i;double x1[20],x2[20],x3[20];double x10,x20,x30;printf("please input x1,x2,x3:\n");scanf("%lf%lf%lf”,&x10,&x20,&x30);printf(" n x1[n] x2[n] x3[n]\n");for(i=0;i<18;i++){x1[0]=x10;x2[0]=x20;x3[0]=x30;x1[i+1]=*x2[i]+*x3[i]+;x2[i+1]=*x1[i]+*x3[i]+;x3[i+1]=*x1[i]+*x2[i]+;printf("%5d %5lf %5lf %5lf\n”,i,x1[i],x2[i],x3[i]);}return 0;}nplease input xl ,x2 ,x3 :M 0 0nxl[n]y2[n]x3Ln]06.0000000.00909016.8300009.84909021.0700001.15999931.1571001.24829941.1853401.28282951.1950991.294138G1.0983381.1983371.29803971.0994421.1994421.29933581.0998111.1998111.29977791.0999361.1999361.299924101.0999791.1999791.299975111.0999931.1999931.299991121.0999981.1999981.299997131.0999991.1999991.299999141.2000001.399999151.2000001.3999991G1.2000001.39999917■1.2000001.399999心得体会在编写算法是不熟悉,查阅了很多资料,经过反复研究和试验后实现了题目的要求,使 用雅克比迭代法和高斯-赛德尔都可以得到方程的解,但相比之下,高斯-赛德尔的迭代次 数要比雅克比的迭代次数少,能够更快的到达所求的解的精度。

实验名称实验四代数插值和最小二乘法拟合实验内容和要求1. 学习使用拉格朗日插值法或牛顿插值法求解方法2. 了解最小二乘法的多项式拟合的具体计算方法并且注意克服正规方程组的病态给定数据点〔X, ,yj如下: , , , , ,x.0y.i1(1) 使用拉格朗日插值法或牛顿插值法,求f(0.856)的近似值.(2) 用最小二乘法拟合数据的(n次)多项式,求f(0.856)的近似值.(3) 比照、分析上两结果实验原理设函数在区间[a,b]上n+1互异节点x ,x,…,x上的函数值分别为y ,y ,…,y , 0 1 n 0 1 n求n次插值多项式Pn(x),满足条件P (x.)=y., j=0,1,…,n令 "J JL (x)=y l (x)+y l (x)+—+y l (x)= Ey l (x)n 0 0 1 1 n n ii其中l (x),l (x),…,l (x)为以x,x,…,x为节点的n次插值基函数, 0 1 n 0 1 n则Ln(x)是一次数不超过n的多项式,且满足Ln (x.)=y., L=0,1,…,n再由插值多项式的唯一性,得J JPn(x)三Ln(x)主要仪器设备 HP电脑 " "实验记录(写出实验内容中的程序代码和运行结果)(可分栏或加页)拉格朗日插值法:#include "stdio.h"int main(){double m=1.0,a=0.856,l=0;int i,j;double x[6]={0.50,0.60,0.70,0.80,0.90,1.00};double y[6]={1.75,1.96,2.19,2.44,2.71,3.00};for(i=0;i<=5;i++){for(j=0;j<=5;j++){if(i==j) continue;m=m*((a-x[j])/(x[i]-x[j]));}l+=y[i]*m;m=1;}printf("结果为%1仁1);return 0;}结果为2-S88刀EPt'ess ant/ Ley to cont inue最小二乘法:#inc1ude "stdio.h"#inc1ude "math.h"int main(){double x[7]={0,0.5,0.6,0.7,0.8,0.9,1.0}, y[7]={1,1.75,1.96,2.19,2.44,2.71,3.00}, a0,a1,sum1=0,sum2=0,sum3=0,sum4=0,sum5=0,l,r;int m=6,i,k;for(i=0;i<7;i++){sum1+=x[i];sum2+=x[i]*x[i];sum3+=y[i];sum4+=x[i]*y[i];sum5+=y[i]*y[i];}l=sum1/(m+1);a1=(sum4-l*sum3)/(sum2-l*sum1);a0=(sum3-sum1*a1)/(m+1);double s=sum3*a0+sum4*a1;r=sum5-s;printf("y=a0+a1*x\n");printf("a0=%f a1=%f\t\n",a0,a1,r);double q=0.856,p;p=a0+a1*q;printf("y=%f\n”,p);return 0;}心得体会拉格朗日插值的优点是插值多项式特别容易建立,缺点是增加节点是原有多项 式不能利用,必须重新建立,即所有基函数都要重新计算,这就造成计算量的浪费。

牛顿插值多项式的优点是增加节点时,原先的差商仍旧不变,仍可以使用数据拟合的具体作法是:对给定的数据〔%,*〕〔i=0,1,・・・,m〕,在取定的函 数类中,求p(x)属于此函数类,使误差ri=p(xi)- yi (i=0,1,…,m)的平方和最小, 即: 1 1 1Er 2=EfEp(x )-yJ 2=min从几何意义上讲,就是寻求与给定点〔Xj ,y「〔i=0,1,…,m〕的距离平方和为最小 的曲线y=p(x) 1 1。

下载提示
相关文档
正为您匹配相似的精品文档