计算数值方法实验报告--太原理工大学Word文档下载推荐.doc
《计算数值方法实验报告--太原理工大学Word文档下载推荐.doc》由会员分享,可在线阅读,更多相关《计算数值方法实验报告--太原理工大学Word文档下载推荐.doc(25页珍藏版)》请在冰豆网上搜索。
![计算数值方法实验报告--太原理工大学Word文档下载推荐.doc](https://file1.bdocx.com/fileroot1/2022-10/4/8969cd03-eab2-4c8a-b0ac-8a13e87ed2b7/8969cd03-eab2-4c8a-b0ac-8a13e87ed2b71.gif)
一、课题名称
方程求根:
熟悉使用、迭代法、牛顿法、割线法等方法对给定的方程进行根的求解。
选择上述方法中的两种方法求方程:
二分法f(x)=x3+4x2-10=0在[1,2]内的一个实根,且要求满足精度|x*-xn|<
0.5×
10-5
迭代法:
用迭代公式x=f(x)进行迭代计算,直到满足|x*-xn|<
10-5为止。
割线法:
x=x-f(x)/g(x),其中f(x)为给定的函数,g(x)为给定函数的导数,直到满足|x*-xn|<
二、目的和意义
(1)了解非线性方程求根的常见方法,如二分法、牛顿法、割线法。
(2)加深对方程求根方法的认识,掌握算法。
(3)会进行误差分析,并能对不同方法进行比较。
三、计算公式
f(x)在区间(x,y)上连续
先找到a、b属于区间(x,y),使f(a),f(b)异号,说明在区间(a,b)内一定有零点,然后求f[(a+b)/2],
现在假设f(a)<
0,f(b)>
0,a<
b
①如果f[(a+b)/2]=0,该点就是零点,
如果f[(a+b)/2]<
0,则在区间((a+b)/2,b)内有零点,(a+b)/2=>
a,从①开始继续使用
中点函数值判断。
如果f[(a+b)/2]>
0,则在区间(a,(a+b)/2)内有零点,(a+b)/2<
=b,从①开始继续使用
这样就可以不断接近零点。
通过每次把f(x)的零点所在小区间收缩一半的方法,使区间的两个端点逐步迫近函数的零点,以求得零点的近似值
四、主要仪器设备
Vc2008,hp
五、结构程序设计
迭代法:
#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;
六、结果讨论和分析
分析:
使用不同的方法,可以不同程度的求得方程的解,不同的方法速度不同。
实验地点
ZSA401
指导教师
李志
2012.4
实验二线性方程组的直接解法
线性方程组的直接解法
合理利用Gauss消元法、LU分解法、追赶法求解下列方程组:
①
②
③
④(n=5,10,100………)
(1)了解线性方程组常见的直接解法,如Guass消元法、LU分解法、追赶法。
(2)加深对线性方程组求解方法的认识,掌握算法。
高斯分解法:
⑴将原方程组化为三角形方阵的方程组:
lik=aik/akk
aij=aij-lik*akjk=1,2,…,n-1
i=k+1,k+2,…,nj=k+1,k+2,…,n+1
⑵由回代过程求得原方程组的解:
xn=ann+1/ann
xk=(akn+1-∑akjxj)/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.
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){
scanf("
%lf"
a[i][j]);
}
}
for(i=1;
scanf("
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];
for(j=1;
i;