线性方程组的直接解法 实验报告
- 格式:doc
- 大小:157.50 KB
- 文档页数:8
本科实验报告
课程名称:数值计算方法B
实验项目:线性方程组的直接解法
最小二乘拟合多项式
实验地点:ZSA401
专业班级:学号:201000
学生姓名:
指导教师:李志
2012年4月13日
线性方程组的直接解法
一、实验目的和要求
实验目的:合理利用Gauss 消元法、LU 分解法或追赶法求解方程组。
实验要求:利用高斯消元法,LU 分解法或追赶法进行编程,求解题中所给的方程组。
二、实验内容和原理
实验内容:合理利用Gauss 消元法、LU 分解法或追赶法求解下列方程组:
① ⎥⎥
⎥⎦
⎤
⎢⎢⎢⎣⎡=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡13814142210321321x x x ②⎥⎥⎥
⎥
⎦⎤
⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡⎥⎥⎥⎥⎥⎦⎤⎢⎢
⎢⎢
⎢
⎣⎡--⨯-2178.4617.5911212592.1121130.6291.513
14
.59103.043
2115x x x x ③⎥⎥
⎥⎥⎥
⎥⎦⎤
⎢
⎢⎢⎢⎢⎢⎣⎡----=⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡-55572112112112121 n n x x x x (n=5,10,100,…)
实验原理:这个实验我选用的是高斯消元法。高斯消元法:先按照 L ik =a ik^(k-1)/a kk^(k-1) ,
a ij^(k)=a ij^(k-1)-l ik a kj^(k-1)
[其中k=1,2,…,n-1;i=k+1,k+2,…,n;j=k+1,k+2,…,n+1]
将方程组变为上三角矩阵,再经过回代,即可求解出方程组的解。
三.计算公式
通过消元、再回代的求解方法称为高斯消元法。特点是始终消去主对角线 下方的元素。
四、操作方法与实验步骤
#include "Stdio.h"
#define N 3 main() {
double a[N][N+1],b[N]; int i,j,k,x=0; for(i=0;i { for(j=0;j<=N;j++) { scanf("%lf",&a[i][j]); } } for(k=0;k { for(i=x;i { for(j=N;j>=0;j--) { a[i+1][j]=a[i+1][j]-a[x][j]*a[i+1][x]/a[x][x]; } } x++; } for(i=0;i { for(j=0;j<=N;j++) { printf("%lf ",a[i][j]); } printf("\n"); } b[2]=a[2][3]/a[2][2]; b[1]=(a[1][3]-a[1][2]*b[2])/a[1][1]; b[0]=(a[0][3]-a[0][2]*b[2]-a[0][1]*b[1])/a[0][0]; for(i=0;i { printf("x(%d)=%lf\n",i+1,b[i]); } getch(); } 五、实验数据记录和处理 实验结果: 六、实验结果与分析 大体来说,实现了课程设计的算法要求及功能,有很多还不能很好的处理的问题,需要我们在改进中不断完善。做本次实验中有些地方有困难,就是获得数组中各元素的值,要用到for循环来输入各个元素的值。还有就是将方程组化为上三角矩阵,也要用到好几个for 循环,比较容易出错。 七、讨论、心得 做实验要求我们把基础学扎实,上机实验让我又重新巩固了C语言知识。 我的实验是线性方程组的直接解法,刚开始调试代码的时候有时候就是很小的错误导致整个程序不能运行,需要我们一步一步慢慢来,经过无数次的检查程序错误的原因,以及在老师的帮助下,完成了这次实验。 最小二乘拟合多项式 一、实验内容 给定数据点(x i ,y i),用最小二乘法拟合数据的多项式,并求平方误差。 x i0 0.5 0.6 0.7 0.8 0.9 1.0 y i 1 1.75 1.96 2.19 2.44 2.71 3.00 二、计算公式 y=a0+a1x 三、结构程序设计 //最小二乘法拟合 //本程序包含两个函数,主函数与Gauss消元函数 #include #include #define N 10 #define M 20 double A[N][N+1]; void Gauss_eliminate(int n,double* answer){ int k,i,j,sum; /*消元重构矩阵使之成为上三角矩阵*/ for(k=1;k for(i=k+1;i<=n;i++) A[i][k]=A[i][k]/A[k][k]; for(i=k+1;i<=n;i++) for(j=k+1;j<=n+1;j++) A[i][j]=A[i][j]-A[k][j]*A[i][k]; } for(i=2;i<=n;i++) for(j=1;j A[i][j]=0; /*回代求解*/ answer[n]=A[n][n+1]/A[n][n]; //x[n]可直接解出 for(i=n-1;i>=1;i--){ sum=0; for(j=i+1;j<=n;j++) sum+=A[i][j]*answer[j];