太原理工大学数值计算实验报告资料Word文档下载推荐.docx

上传人:b****6 文档编号:17712901 上传时间:2022-12-08 格式:DOCX 页数:19 大小:268.31KB
下载 相关 举报
太原理工大学数值计算实验报告资料Word文档下载推荐.docx_第1页
第1页 / 共19页
太原理工大学数值计算实验报告资料Word文档下载推荐.docx_第2页
第2页 / 共19页
太原理工大学数值计算实验报告资料Word文档下载推荐.docx_第3页
第3页 / 共19页
太原理工大学数值计算实验报告资料Word文档下载推荐.docx_第4页
第4页 / 共19页
太原理工大学数值计算实验报告资料Word文档下载推荐.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

太原理工大学数值计算实验报告资料Word文档下载推荐.docx

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

太原理工大学数值计算实验报告资料Word文档下载推荐.docx

主要仪器设备

笔记本计算机

实验记录(写出实验内容中的程序代码和运行结果)(可分栏或加页)

迭代法:

#include"

stdafx.h"

#include"

stdio.h"

math.h"

iostream"

usingnamespacestd;

floatmain()

{

floata;

cin>

>

a;

floatt,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"

);

}

割线法:

floatc,a=1.0,b=2.0;

//cin>

a>

b;

while

(1)

{

c=b-(b*b*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;

}

cout<

<

c;

实验结果和分析

实验结果:

割线法:

心得体会(遇到的问题和解决方法)

使用不同的方法,可以不同程度的求得方程的解,不同的方法速度不同。

实验二线性方程组的直接求解

实验内容和要求

(1)了解线性方程组常见的直接解法,如Guass消元法、LU分解法、追赶法。

(2)加深对线性方程组求解方法的认识,掌握算法。

(3)会进行误差分析,并能对不同方法进行比较。

实验原理

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

1、

2、

3、

4、

(n=5,10,100,…)

台式或笔记本计算机

①Gauss消元法:

floatmain()

{floata[3][4]={{1,2,3,14},{0,1,2,8},{2,4,1,13}};

floatx[3];

floatsum=0;

intk,i,j;

for(k=0;

k<

2;

k++)

for(i=k+1;

i<

3;

i++)

for(j=k+1;

j<

4;

j++)

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

for(i=0;

for(j=0;

printf("

a[%d][%d]=%f,"

i,j,a[i][j]);

cout<

endl;

x[2]=a[2][3]/a[2][2];

for(k=1;

k>

=0;

k--)

{sum=0;

for(j=k+1;

{

sum+=a[k][j]*x[j];

}

x[k]=(a[k][3]-sum)/a[k][k];

}

for(i=0;

printf("

x[%d]=%f,"

i+1,x[i]);

③LU分解法:

#include<

stdio.h>

math.h>

#defineL30

doublea[L][L],b[L],l[L][L],u[L][L],x[L],y[L];

intmain(){

intn,i,j,k,r;

scanf("

%d"

&

n);

for(i=1;

i<

=n;

++i){

for(j=1;

j<

++j){

%lf"

a[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)

{

u[k][j]=a[k][j];

for(r=1;

r<

k;

++r)

{

u[k][j]-=l[k][r]*u[r][j];

}

for(i=k+1;

l[i][k]=a[i][k];

for(r=1;

++r){

l[i][k]-=l[i][r]*u[r][k];

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

l[k][k]=1.0;

y[i]=b[i];

i;

y[i]-=l[i][j]*y[j];

for(i=n;

i>

0;

--i){

x[i]=y[i];

for(j=i+1;

x[i]-=u[i][j]*x[j];

}x[i]/=u[i][i];

printf("

%0.2lf\n"

x[i]);

return0;

③追赶法:

voidmain()

FILE*f;

doublea[15],b[15],c[15],d[15];

doublet;

inti,n;

f=fopen("

zgf.txt"

"

r"

fscanf(f,"

&

n);

%lf%lf%lf"

b[1],&

c[1],&

d[1]);

for(i=2;

=n-1;

fscanf(f,"

%lf%lf%lf%lf"

a[i],&

b[i],&

c[i],&

d[i]);

a[n],&

b[n],&

d[n]);

fclose(f);

c[1]=c[1]/b[1];

d[1]=d[1]/b[1];

t=b[i]-c[i-1]*a[i];

c[i]=c[i]/t;

d[i]=(d[i]-d[i-1]*a[i])/t;

d[n]=(d[n]-d[n-1]*a[n])/(b[n]-c[n-1]*a[n]);

for(i=n-1;

i>

=1;

i--)d[i]=d[i]-c[i]*d[i+1];

printf("

\n********************************\n"

for(i=1;

=n;

d[%2d]=%lf\n"

i,d[i]);

Zgf.txt文件中的内容是:

5

21-7

121-5

121-5

12-5

①Gauss消元法:

在调试过程中发现自己还是很粗心,容易犯简单错误,在今后应该多编写程序。

实验三线性方程组的迭代求解

学习使用雅可比迭代法或高斯-赛德尔迭代法

高斯-赛德尔迭代法:

{

floata[3][3]={{10,-1,-2},{-1,10,-2},{-1,-1,5}},b[3]={7.2,8.3,4.2};

floatx[3]={0,0,0},sum1,sum2;

inti,j,k,n=3;

for(k=0;

10;

{for(i=0;

n;

sum1=0;

sum2=0;

for(j=0;

i;

sum1=sum1+a[i][j]*x[j];

for(j=i+1;

sum2=sum2+a[i][j]*x[j];

x[i]=(b[i]-sum1-sum2)/a[i][i];

for(i=0;

i++)

{printf("

\n"

}

雅克比迭代:

floata[3][3]={{10,-1,-2},{-1,10,-2},{-1,-1,5}},b[3]={7.2,8.3,4.2};

floatx[3]={0,0,0},sum1;

sum1=0;

for(j=0;

{if(i==j)continue;

x[i]=(b[i]-sum1)/a[i][i];

for(i=0;

{printf("

printf("

结果:

分析:

使用高斯-赛德尔和雅克比迭代都可以求出方程组的解,但是利用高斯-赛德尔迭代法所需的迭代次数比雅克比迭代少,能够更早的达到精度要求。

高斯迭代法比雅克比迭代迭代速度快,所以在编程时选择了高斯迭代法。

实验四代数插值和最小二乘法拟合

实验内容:

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

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

x

0.40

0.55

0.65

0.80

0.90

1.05

f(x)

0.41075

0.57815

0.69675

0.88811

1.02652

1.25386

实验要求:

1.了解拉格朗日插值法的基本方法、基本原理。

2.通过编写程序,进行算法设计和数值求解。

拉格朗日基函数为:

拉格朗日插值多项式为:

#include<

stdlib.h>

iostream.h>

typedefstructdata

floatx;

floaty;

}Data;

Datad[20];

floatf(ints,intt)

if(t==s+1)

return(d[t].y-d[s].y)/(d[t].x-d[s].x);

else

return(f(s+1,t)-f(s,t-1))/(d[t].x-d[s].x);

floatNewton(floatx,intcount)

intn;

cout<

"

请输入n值(即n次插值):

;

if(n<

=count-1)

break;

cls"

floatt=1.0;

floaty=d[0].y;

floatyt=0.0;

for(intj=1;

t=(x-d[j-1].x)*t;

yt=f(0,j)*t;

y=y+yt;

returny;

floatlagrange(floatx,intcount)

floaty=0.0;

for(intk=0;

count;

floatp=1.0;

for(intj=0;

if(k==j)continue;

p=p*(x-d[j].x)/(d[k].x-d[j].x);

y=y+p*d[k].y;

floatx,y;

intcount;

请输入x[i],y[i]的组数,不得超过20组:

if(count<

=20)

for(inti=0;

请输入第"

i+1<

组x的值:

d[i].x;

组y的值:

d[i].y;

请输入x的值:

//获得变量x的值

x;

intchoice=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