计算数值实验报告(太原理工大学)
- 格式:doc
- 大小:309.50 KB
- 文档页数:29
本科实验报告
课程名称: 计算数值方法
实验地点: 综合楼五层506室
专业班级:计科1002 学号: 2010001414
学生姓名: xxx
指导教师: 王峥
2012 年 6 月 20 太原理工大学学生实验报告
学院名称 计算机科学与技术 专业班级 计科 1002 学号 2010001414
学生姓名 xxx 实验日期 2012.6.5 成绩
课程名称 计算数值方法 实验题目 实验一 方程求根
一、课题名称
方程求根:熟悉使用、迭代法、牛顿法、割线法等方法对给定的方程进行根的求解。选择上述方法中的两种方法求方程:二分法f(x)=x3+4x2-10=0在[1,2]内的一个实根,且要求满足精度|x*-xn|<0.5×10-5
迭代法:用迭代公式x=f(x)进行迭代计算,直到满足|x*-xn|<0.5×10-5 为止 。
二分法:设f(x)在[a,b]上连续,且f(a1)*f(x1)<0,记(a2,b2)=(x1,b1)带入计算式进行计算 直到 |x*-xn|<0.5×10-5 为止 。
二、目的和意义
(1)了解非线性方程求根的常见方法,如二分法、迭代法、牛顿法、割线法。
(2)加深对方程求根方法的认识,掌握算法。会进行误差分析,并能对不同方法进行比较。
三、计算公式
(1)迭代法
1).首先对给定的计算公式进行变形使其能够迭代或者找出相应迭代速度较快的式子。
2).带入求好的式子到循环中去比如:
(2)二分法:
f(x)在区间(x,y)上连续
1).先找到a、b属于区间(x,y),使f(a),f(b)异号,说明在区间(a,b)内一定有零点,然后求f[(a+b)/2],
2).如果f[(a+b)/2]=0,该点就是零点,
如果f[(a+b)/2]<0,则在区间((a+b)/2,b)内有零点,反之在(a,(a+b)/2)内有零点 带入1)中继续。
四、主要仪器设备
Vc++ 9.0 C-free CodeBlocks
1()(0,1,2,)kkxxk
五、结构程序设计
迭代法:
#include
#include
main()
{
int i;
double xn[15],y,x1,x2,m ;
printf("请输入x1,x2的值:\n" );
scanf("%lf%lf",&x1,&x2);
printf("请输入精度要求:\n" );
scanf("%lf",&m);
printf(" n xn\n");
i=0;
do{
xn[0]=(x1+x2)/2 ;
xn[i+1]= sqrt(10/(4+xn[i])); //迭代
printf("%5d %5lf\n",i,xn[i]);
y= fabs(xn[i+1]-xn[i]) ; i++;
if(y
}while(1);
}
二分法:
#include
#include
main()
{
int m,n,o,p;
double a,b,l;
printf("请输入x^3, x^2, x的系数和常数p:\n");
scanf("%d%d%d%d",&m,&n,&o,&p); //1 4 0 -10
printf("请输入x1,x2:\n");
scanf("%lf%lf",&a,&b); //1 2
printf("请输入精度要求:\n");
scanf("%lf",&l); //0.5x10^5
printf(" n an bn xn f(xn)\n");
double x,fx;
int i=1;
do
{
x=(b+a)/2;
fx=m*x*x*x+n*x*x+o*x+p; printf("%5d %5f %5f %5f %5f\n",i,a,b,x,fx);
i++;
if(fx==0) break;
if(fx>0) b=x;
else if(fx<0) a=x;
if((b-a)
break; //进行计算并返值
}while(1);
}
六、结果讨论和分析
二分法:
迭代法:
分析讨论:
使用不同的方法,可以不同程度的求得方程的解,不同的方法速度不同,求得的结果也稍有区别,当然和要求精度也有关系。刚开始的时候用数组对二分法进行求解,发现 循环到第二次 就无法实现值的传递,于是换了另外一种方法代替了数组。
流程图:
实验地点 综合楼五层506室 指导教师 王峥
太原理工大学学生实验报告
学院名称 计算机科学与技术 专业班级 计科 1002 学号 2010001414
学生姓名 xxx 实验日期 2012.6.5 成绩
课程名称 计算数值方法 实验题目 实验二 线性方程组的直接解法
一、课题名称
线性方程组的直接解法
合理利用Gauss消元法、LU分解法、追赶法求解下列方程组:
①
13814142210321321xxx ②
2178.4617.5911212592.1121130.6291.51314.59103.0432115xxxx
③3772201161263841027851244321xxxx ④55572112112112121nnxxxx(n=5,10,100…)
二、目的和意义
(1)了解线性方程组常见的直接解法,如Guass消元法、LU分解法、追赶法。
(2)加深对线性方程组求解方法的认识,掌握算法。
(3)会进行误差分析,并能对不同方法进行比较。
三、计算公式
高斯分解法:
⑴将原方程组化为三角形方阵的方程组:
lik=aik/akk
aij= aij- lik* akj k=1,2,…,n-1
i=k+1,k+2, …,n j=k+1,k+2, …,n+1
⑵由回代过程求得原方程组的解:
xn= ann+1/ ann
xk=( akn+1-∑akj xj)/ akk (k=n-1,n-2, …,2,1)
LU分解法: 将系数矩阵A转化为A=L*U, L为单位下三角矩阵,U为普通上三角矩阵,然后通过解方程组l*y=b,u*x=y,来求解x.
追赶法:
用来求对角方程组;将系数矩阵A转化为A=L*U, L为普通下n-1对角矩阵,U为单位上n-1对角矩阵,然后通过解方程组l*y=b,u*x=y,来求解x.
四、主要仪器设备
Vc++ 9.0 C-free CodeBlocks
五、结构程序设计
Gauss消元法:
#include
#include
using namespace std;
int main()
{
int n,i,j,k;
double a[100][100],b[100],o;
cout<<"输入未知数个数:"<
cin>>n;
cout<<"输入数列:"<
for (i=1;i<=n;i++)
for (j=1;j<=n+1;j++)
cin>>a[i][j];
for (i=1;i<=n;i++)
for (j=i+1;j<=n;j++)
if (fabs(a[j][i])>1e-7)
{
o=a[i][i]/a[j][i];
for (k=i;k<=n+1;k++)
a[j][k]=a[j][k]*o-a[i][k];
}
for (i=n;i>0;i--)
{
b[i]=a[i][n+1]/a[i][i];
for (j=i-1;j>0;j--)
a[j][n+1]=a[j][n+1]-b[i]*a[j][i];