太原理工大学数值计算实验报告.docx

上传人:b****4 文档编号:24162818 上传时间:2023-05-24 格式:DOCX 页数:45 大小:961.85KB
下载 相关 举报
太原理工大学数值计算实验报告.docx_第1页
第1页 / 共45页
太原理工大学数值计算实验报告.docx_第2页
第2页 / 共45页
太原理工大学数值计算实验报告.docx_第3页
第3页 / 共45页
太原理工大学数值计算实验报告.docx_第4页
第4页 / 共45页
太原理工大学数值计算实验报告.docx_第5页
第5页 / 共45页
点击查看更多>>
下载资源
资源描述

太原理工大学数值计算实验报告.docx

《太原理工大学数值计算实验报告.docx》由会员分享,可在线阅读,更多相关《太原理工大学数值计算实验报告.docx(45页珍藏版)》请在冰豆网上搜索。

太原理工大学数值计算实验报告.docx

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

实验由本人当时亲自完成

仅供参考,希望可以帮助大家

本科实验报告

 

课程名称:

计算机数值方法B

实验项目:

Gauss消元法,迭代法,方程求根,拉格朗日插值法,幂法,最小二乘法,追赶法

实验地点:

中区ZSA301

专业班级:

0000学号:

0000000000

学生姓名:

氣宇軒昂

指导教师:

2012年13月13日

实验一:

Gauss消元法实验

一、实验目的

《数值计算方法》是一门实践性和实用性都很强的课程,学习的目的在于应用已有的理论基础和技术方法,实现对实际计算问题的计算机求解。

本实验配合《计算数值方法》课堂教学,通过上机实践实验环节,巩固课堂和书本上所学的知识、加强实践能力、提高解决实际计算问题的水平、启发创新思想。

其基本目的是:

(1)培养理论联系实际的思路,训练综合运用已经学过的理论和实际知识去分析和解决实际问题的能力。

(2)帮助学生全面消化已学的相关课程内容,深刻理解计算数值方法课程的内涵,培养使用电子计算机进行科学计算和解决问题的能力。

(3)进行基本技能训练和巩固。

使学生得到选择算法、编写程序、分析数值结果、写数值试验报告、课堂讨论等环节的综合训练。

二、实验内容

合理利用Gauss消元法、LU分解法或追赶法求解下列方程组:

(n=5,10,100,…)

3、主要仪器设备

1.笔记本电脑;

2.软件vc++6.0;

4、操作方法与实验步骤(代码)

1.Guass消元法;

#include"Stdio.h"

#defineN3

voidGauss_eliminant(doublea[N][N+1])/*建立系数及常数项的二维数组*/

{

doubleb[N];/*建立解的一位数组*/

doubles;/*计算解系时的变量*/

inti,j,k;

for(k=0;k

{

for(i=k;i

{

for(j=N;j>=0;j--)

{

a[i+1][j]=a[i+1][j]-a[k][j]*a[i+1][k]/a[k][k];

}

}

}

printf("消元后得到上三角矩阵:

");

printf("\n");

for(i=0;i

{

for(j=0;j<=N;j++)

{

printf("%lf",a[i][j]);

}

printf("\n");

}

printf("回代求得原方程组的解为:

");

printf("\n");

for(i=N-1;i>=0;i--)/*回代过程*/

{

s=0;

for(j=N-1;j>i;j--)

{

s=a[i][j]*b[j]+s;

}

b[i]=(a[i][N]-s)/a[i][i];

}

for(i=0;i

{

printf("x(%d)=%lf\n",i+1,b[i]);

}

}

main()

{

inti,j;

doublea[N][N+1];

printf("输入系数及常数项矩阵:

");

printf("\n");

for(i=0;i

{

for(j=0;j<=N;j++)

{

scanf("%lf",&a[i][j]);

}

}

Gauss_eliminant(a);

 

getch();

 

}

实验结果与分析

宏定义的N代表了N维矩阵改变N可以解决n维矩阵;

先给出N=3,解决第一个方程组;

1.第一步执行如下:

2.输入矩阵后执行如下:

再给出N=4,解决第三个方程;

1.第一步执行如下:

2,输入矩阵执行如下:

2.Gauss_列主元消元法;

#include"Stdio.h"

#defineN2

voidGauss_eliminant(doublea[N][N+1])/*建立系数及常数项的二维数组*/

{

doubleb[N];/*建立解的一位数组*/

doubles;/*计算解系时的变量*/

inti,j,k,m,n;

for(k=0;k

{

for(m=N-1;m>0;m--)

{

for(n=N-m;n

{

if(a[n][k]

{

s=a[n][k];

a[n][k]=a[n+1][k];

a[n+1][k]=s;

}

}

}

for(i=k;i

{

for(j=N;j>=0;j--)

{

a[i+1][j]=a[i+1][j]-a[k][j]*a[i+1][k]/a[k][k];

}

}

}

printf("消元后得到上三角矩阵:

");

printf("\n");

for(i=0;i

{

for(j=0;j<=N;j++)

{

printf("%lf",a[i][j]);

}

printf("\n");

}

printf("回代求得原方程组的解为:

");

printf("\n");

for(i=N-1;i>=0;i--)/*回代过程*/

{

s=0;

for(j=N-1;j>i;j--)

{

s=a[i][j]*b[j]+s;

}

b[i]=(a[i][N]-s)/a[i][i];

}

for(i=0;i

{

printf("x(%d)=%lf\n",i+1,b[i]);

}

}

main()

{

inti,j;

doublea[N][N+1];

printf("输入系数及常数项矩阵:

");

printf("\n");

for(i=0;i

{

for(j=0;j<=N;j++)

{

scanf("%lf",&a[i][j]);

}

}

Gauss_eliminant(a);

 

getch();

 

}

 

}

实验结果与分析

宏定义的N代表了N维矩阵改变N可以解决n维矩阵;

先给出N=4,解决第二个方程组;

5、第一步执行如下:

2,输入矩阵执行如下:

3.①追赶法(n=5)

#include"Stdio.h"

#defineN5

main()

{

doublea[3*N-2];/*三角矩阵行的一维数组*/

doublel[2*N-1];/*l(ij)行的一维数组*/

doubleu[N-1];/*u(ij)行的一维数组*/

doubleb[N];/*常数项数组*/

doubleb1[N];/*ly=b中的y数组*/

doubleb2[N];/*ux=y中的y数组*/

inti,j,k,m;

printf("输入N维三对角矩阵的行的一维数组:

");

printf("\n");

for(i=0;i<3*N-2;i++)/*输入三对角矩阵的行的一维数组*/

{

scanf("%lf",&a[i]);

}

l[0]=a[0];

u[0]=a[1]/l[0];

i=1,j=1,k=2;/*计算l(ij)和u(ij)*/

do{

l[i]=a[k];

k++;

i++;

l[i]=a[k]-u[j-1]*l[i-1];

k++;

u[j]=a[k]/l[i];

j++;

k++;

i++;

}while(i<2*N-1);

printf("输出一维行的l(ij):

");

printf("\n");

l[0]=a[0];

for(k=0;k<2*N-1;k++)

printf("%lf",l[k]);

printf("\n");

printf("输出一维行的u(ij):

");

printf("\n");

for(k=0;k

printf("%lf",u[k]);

printf("\n");

printf("输入常数项数组:

");

printf("\n");

for(i=0;i

{

scanf("%lf",&b[i]);

}

printf("输出y:

");

printf("\n");

b1[0]=b[0]/l[0];/*计算y*/

printf("y(0)=%lf",b1[0]);

for(i=1,j=1;i

{

m=j+1;

b1[i]=(b[i]-l[j]*b1[i-1])/l[m];

j++;

j++;

printf("y(%d)=%lf",i,b1[i]);

}

printf("\n");

printf("输出解x:

");

printf("\n");

b2[N-1]=b1[N-1];/*计算x*/

for(i=N-2;i>=0;i--)

{

b2[i]=b1[i]-u[i]*b2[i+1];

}

for(i=0;i

{

printf("x(%d)=%lf\n",i,b2[i]);

}

getch();

}

实验结果与分析

宏定义的N代表了N维矩阵改变N可以解决n维矩阵;

先给出N=5,解决第四个方程组的n=5;

1.第一步执行结果如下:

2.输入三对角行的矩阵后执行结果如下:

3.输入常数项数组后执行结果如下:

②追赶法(n=任意有规律的整数);

#include"Stdio.h"

#defineN10

main()

{

doublea[3*N-2];/*三角矩阵行的一维数组*/

doublel[2*N-1];/*l(ij)行的一维数组*/

doubleu[N-1];/*u(ij)行的一维数组*/

doubleb[N];/*常数项数组*/

doubleb1[N];/*ly=b中的y数组*/

doubleb2[N];/*ux=y中的y数组*/

inti,j,k,m;

printf("输入N维三对角矩阵第一行的矩阵:

");

printf("\n");

for(i=0;i<2;i++)/*输入三对角矩阵的行的一维数组*/

{

scanf("%lf",&a[i]);

}

for(i=2;i<3*N-2;i++)

{

a[i]=a[1];

i++;

a[i]=a[0];

i++;

if(i<3*N-2)

{

a[i]=a[1];

}

}

l[0]=a[0];

u[0]=a[1]/l[0];

i=1,j=1,k=2;/*计算l(ij)和u(ij)*/

do{

l[i]=a[k];

k++;

i++;

l[i]=a[k]-u[j-1]*l[i-1];

k++;

u[j]=a[k]/l[i];

j++;

k++;

i++;

}while(i<2*N-1);

l[0]=a[0];

printf("输入常数项的前两个:

");

printf("\n");

for(i=0;i<2;i++)/*输入常数项*/

{

scanf("%lf",&b[i]);

}

for(i=2;i

{

b[i]=b[1];

}

b1[0]=b[0]/l[0];/*计算y*/

for(i=1,j=1;i

{

m=j+1;

b1[i]=(b[i]-l[j]*b1[i-1])/l[m];

j++;

j++;

}

printf("输出解x:

");

printf("\n");

b2[N-1]=b1[N-1];/*计算x*/

for(i=N-2;i>=0;i--)

{

b2[i]=b1[i]-u[i]*b2[i+1];

}

for(i=0;i

{

printf("x(%d)=%lf\t",i,b2[i]);

}

getch();

}

实验结果与分析

宏定义的N代表了N维矩阵改变N可以解决n维矩阵;

先给出N=10,解决第四个方程组的n=10;

1.第一步执行结果如下:

2.输入三对角第一行后执行结果如下:

3.输入常数项的前两个后执行结果如下:

当N=100时执行最后结果如下:

7、讨论、心得

主要是对算法更熟悉,更熟悉对c语言的利用!

1.笔记本电脑;

2.软件vc++6.0;

3、操作方法与实验步骤(代码)

1.Guass消元法;

#include"Stdio.h"

#defineN3

voidGauss_eliminant(doublea[N][N+1])/*建立系数及常数项的二维数组*/

{

doubleb[N];/*建立解的一位数组*/

doubles;/*计算解系时的变量*/

inti,j,k;

for(k=0;k

{

for(i=k;i

{

for(j=N;j>=0;j--)

{

a[i+1][j]=a[i+1][j]-a[k][j]*a[i+1][k]/a[k][k];

}

}

}

printf("消元后得到上三角矩阵:

");

printf("\n");

for(i=0;i

{

for(j=0;j<=N;j++)

{

printf("%lf",a[i][j]);

}

printf("\n");

}

printf("回代求得原方程组的解为:

");

printf("\n");

for(i=N-1;i>=0;i--)/*回代过程*/

{

s=0;

for(j=N-1;j>i;j--)

{

s=a[i][j]*b[j]+s;

}

b[i]=(a[i][N]-s)/a[i][i];

}

for(i=0;i

{

printf("x(%d)=%lf\n",i+1,b[i]);

}

}

main()

{

inti,j;

doublea[N][N+1];

printf("输入系数及常数项矩阵:

");

printf("\n");

for(i=0;i

{

for(j=0;j<=N;j++)

{

scanf("%lf",&a[i][j]);

}

}

Gauss_eliminant(a);

 

getch();

 

}

6、实验结果与分析

宏定义的N代表了N维矩阵改变N可以解决n维矩阵;

先给出N=3,解决第一个方程组;

1.第一步执行如下:

2.输入矩阵后执行如下:

再给出N=4,解决第三个方程;

1.第一步执行如下:

2,输入矩阵执行如下:

8、讨论、心得

主要是对算法更熟悉,更熟悉对c语言的利用!

 

实验二:

迭代法求方程组

一、实验目的

《数值计算方法》是一门实践性和实用性都很强的课程,学习的目的在于应用已有的理论基础和技术方法,实现对实际计算问题的计算机求解。

本实验配合《计算数值方法》课堂教学,通过上机实践实验环节,巩固课堂和书本上所学的知识、加强实践能力、提高解决实际计算问题的水平、启发创新思想。

其基本目的是:

(1)培养理论联系实际的思路,训练综合运用已经学过的理论和实际知识去分析和解决实际问题的能力。

(2)帮助学生全面消化已学的相关课程内容,深刻理解计算数值方法课程的内涵,培养使用电子计算机进行科学计算和解决问题的能力。

(3)进行基本技能训练和巩固。

使学生得到选择算法、编写程序、分析数值结果、写数值试验报告、课堂讨论等环节的综合训练。

二、实验内容

使用雅可比迭代法或高斯-赛德尔迭代法对下列方程组进行求解。

4.主要仪器设备

1.笔记本电脑;

2.软件vc++6.0;

5.操作方法与实验步骤(代码)

迭代法;

#include"Stdio.h"

#include"math.h"

#defineN3

main()

{

doublea[N][N+1];/*方程组系数及常数项的二维数组*/

doubleb[N];/*近似解的组合*/

doubleb1[N];/*近似解解前一个的组合*/

doubles;/*为叠加准备的变量*/

inti,j;

printf("输入系数及常数项矩阵:

");

printf("\n");

for(i=0;i

{

for(j=0;j<=N;j++)

{

scanf("%lf",&a[i][j]);

}

}

printf("输入解的初值:

");

printf("\n");

for(i=0;i

{

scanf("%lf",&b[i]);

}

printf("迭代列表如下:

");

printf("\n");

do/*迭代求解*/

{

for(i=0;i

{

b1[i]=b[i];

}

for(i=0;i

{

s=0;

for(j=0;j

{

if(i!

=j)

s=s+a[i][j]*b[j];

}

b[i]=(a[i][N]-s)/a[i][i];

}

for(j=0;j

{

printf("%lf",b[j]);

}

printf("\n");

}while(fabs(b1[0]-b[0])>0.00005&&fabs(b1[1]-b[1])>0.00005&&fabs(b1[2]-b[2])>0.00005);

getch();

}

6.实验结果与分析

3.宏定义N=3第一步执行结果如下:

4.输入系数及常数项矩阵后执行如下:

5.输入解的初值后执行如下:

7、讨论、心得

对迭代的思想有更深的了解,而且也能熟悉对c语言更加了解熟练!

实验三:

方程求根实验

一、实验目的

《数值计算方法》是一门实践性和实用性都很强的课程,学习的目的在于应用已有的理论基础和技术方法,实现对实际计算问题的计算机求解。

本实验配合《计算数值方法》课堂教学,通过上机实践实验环节,巩固课堂和书本上所学的知识、加强实践能力、提高解决实际计算问题的水平、启发创新思想。

其基本目的是:

(1)培养理论联系实际的思路,训练综合运用已经学过的理论和实际知识去分析和解决实际问题的能力。

(2)帮助学生全面消化已学的相关课程内容,深刻理解计算数值方法课程的内涵,培养使用电子计算机进行科学计算和解决问题的能力。

(3)进行基本技能训练和巩固。

使学生得到选择算法、编写程序、分析数值结果、写数值试验报告、课堂讨论等环节的综合训练。

二、实验内容

熟悉使用二分法、迭代法、牛顿法、割线法等方法对给定的方程进行根的求解。

选择上述方法中的两种方法求方程:

f(x)=x3+4x2-10=0在[1,2]内的一个实根,且要求满足精度|x*-xn|<0.5×10-5

3.主要仪器设备

1.笔记本电脑;

2.软件vc++6.0;

4.操作方法与实验步骤(代码)

6.二分法;

#include"Stdio.h"

#include"math.h"

doublef(doublex)/*定义一个函数*/

{

returnx*x*x+4*x*x-10;

}

main()

{

doublea=1,b=2;/*给出区间的两个端点*/

doublex=(a+b)/2;

doublexi;/*记下计算出x的前一个数,用于满足给出的精度*/

inti=0;/*计算满足精度所需要的次数*/

do/*计算x*/

{

i++;

xi=x;

if(f(x)*f(a)<0)b=x;

if(f(x)*f(b)<0)a=x;

if(f(x)*f(a)==0)break;

x=(a+b)/2;

printf("x(%i)=%lf\n",i,x);

}while(fabs(x-xi)>0.5*0.00001);

getch();

}

 

7.牛顿法;

#include"Stdio.h"

#include"math.h"

doublef(doublex)/*定义函数*/

{

returnx*x*x+4*x*x-10;

}

doublef1(doublex)/*由函数定义出对应的导数*/

{

return3*x*x+8*x;

}

main()

{

doublex=1.5,xi;/*定义初值和变量xi*/

inti=0;/*计算x的次数*/

do/*计算x*/

{

i++;

xi=x;

x=x-f(x)/f1(x);

printf("x(%d)=%lf\n",i,x);

}while(fabs(x-xi)>0.5*0.00001);

getch();

}

 

五、实验结果与分析

1.二分法输出结果为:

7.牛顿法输出结果为:

4.讨论、心得;

从两种方法可以看出,牛顿法比二分法收敛速度快,但用牛顿法得求函数的导数,计算机无法求得,得人为输进。

通过编写程序,是我们对c语言也能更进一步的了解和熟练。

 

实验四:

拉格朗日插值法实验

一、实验目的

《数值计算方法》是一门实践性和实用性都很强的课程,学习的目的在于应用已有的理论基础和技术方法,实现对实际计算问题的计算机求解。

本实验配合《计算数值方法》课堂教学,通过上机实践实验环节,巩固课堂和书本上所学的知识、加强实践能力、提高解决实际计算问题的水平、启发创新思想。

其基本目的是:

(1)培养理论联系实际的思路,训练综合运用已经学过的理论和实际知识去分析和解决实际问题的能力。

(2)帮助学生全面消化已学的相关课程内容,深刻理解计算数值方法课程的内涵,培养使用电子计算机进行科学计算和解决问题的能力。

(3)进行基本技能训练和巩固。

使学生得到选择算法、编写程序、分析数值结果、写数值试验报告、课堂讨论等环节的综合训练。

二、实验内容

使用拉格朗日插值法或牛顿插值法求解:

已知f(x)在6个点的函数值如下表所示,运用插值方法,求f(0.596)的近似值。

x

0.40

0.55

0.65

0.80

0.90

1.05

f(x)

0.41

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1