实验报告内容
一 实验目的与要求(实验题目)
1.分别利用雅可比迭代法和高斯-塞德尔迭代法求解以下线性方程组
⎧8x 1-3x 2+2x 3=20 ⎪⎨4x 1+11x 2-x 3=33 ⎪6x +3x +12x =3623⎩1
使得误差不超过10 -4
2. 用不动点迭代法求方程的实根:
x 3+2x 2+10x -20=0
二 模型建立(相关主要计算公式)
1. 雅可比迭代法
⎧⎨⎩x (k +1) i =1a ii [b i -∑a j =1
j ≠i n i j x (k ) j ]
i =1, 2, . . n . ,
(0)k =0, 1, 2, . . . (0)x 其中=(x 1, x 2,... x n (0)(0))T 为初始向量.
2. 高斯-塞德尔迭代法
⎧⎨⎩x i (k +1) =1a ii [b i -∑a ij x j j =1i -1(k +1) -∑a ij x j j =i +1n (k ) ]
i =1, 2, n , k =0, 1, 2,...
3. 不动点迭代法
• x
k +1=ϕ(x k ), k =0, 1...
三、 实验过程、步骤(程序)
1. 雅可比迭代法
#include "stdio.h"
#include "math.h"
#include "string.h"
main()
{
int i,j,k;
float m1=0.0,m2=0.0;
float a[3][4]={8,-3,2,20,4,11,-1,33,6,3,12,36};
float x[3]={0.0,0.0,0.0};
for(k=1;k
{for(i=0;i
{
for(j=0;j
m1=m1+a[i][j]*x[j];
for(j=i+1;j
m2=m2+a[i][j]*x[j];
x[i]=(a[i][3]-m1-m2)/a[i][i];
m1=0,m2=0;
}
k++; }
printf("雅可比迭代法计算结果为:\n");
for(i=0;i
printf("x[%2d]=%8.9f\n",i+1,x[i]);
}
2高斯-塞德尔迭代法
#include
#include
# define n 3
void main()
{
int i,j,k=1;
float x[n]={0,0,0},m[n]={0,0,0},s=1;
float a[n][n]={8,-3,2,4,11,-1,6,3,12},d[n]={20,33,36};
printf("高斯-塞德尔迭代法运算结果为:\n");
for(k=0;fabs(s-x[0])>1e-6;k++)
{
s=x[0];
for(i=0;i
{m[i]=0;
for(j=0;j
m[i]=m[i]+d[i]+a[i][i]*x[i];
x[i]=m[i]/a[i][i];}
printf("Y1=%f Y2=%f Y3=%f\n",x[0],x[1],x[2]);
}
getchar() ;
}
3.
#include
#include
double f( double x )
{
return x * x * x + 2 * x * x + 10 * x - 20;
}
double fdx( double x )
{
return 3 * x * x + 18.4 * x + 16.7;
}
int main( )
{
int t1 = 0, t2 = 1;
double x[ 2 ], ep = 1e-8;
x[ 0 ] = 0;
do
{
t1 = 1 - t1;
t2 = 1 - t2;
x[ t1 ] = x[ t2 ] - f( x[ t2 ] ) / fdx( x[ t2 ] );
}
while( fabs( x[ t1 ] - x[ t2 ] ) > ep );
printf("解得x=%lf\n", x[ t1 ]);
return 0;
}
四.实验结果:
1. 雅可比迭代法:
2. 高斯-塞德尔迭代法:
.
3. 不动点迭代法:
五.实验小结
通过这次上机,学会了用Jacobis 迭代法,高斯-塞德尔迭代法求解线性方程组,算法程序比较复杂,特别是要多次使用数组条件及for 循环语句。还有不动点迭代法解方程的根,对这几种迭代方法有了更好的理解,并能通过编程和调试实现算法,完成了实验内容,收获很大。
实验报告内容
一 实验目的与要求(实验题目)
1.分别利用雅可比迭代法和高斯-塞德尔迭代法求解以下线性方程组
⎧8x 1-3x 2+2x 3=20 ⎪⎨4x 1+11x 2-x 3=33 ⎪6x +3x +12x =3623⎩1
使得误差不超过10 -4
2. 用不动点迭代法求方程的实根:
x 3+2x 2+10x -20=0
二 模型建立(相关主要计算公式)
1. 雅可比迭代法
⎧⎨⎩x (k +1) i =1a ii [b i -∑a j =1
j ≠i n i j x (k ) j ]
i =1, 2, . . n . ,
(0)k =0, 1, 2, . . . (0)x 其中=(x 1, x 2,... x n (0)(0))T 为初始向量.
2. 高斯-塞德尔迭代法
⎧⎨⎩x i (k +1) =1a ii [b i -∑a ij x j j =1i -1(k +1) -∑a ij x j j =i +1n (k ) ]
i =1, 2, n , k =0, 1, 2,...
3. 不动点迭代法
• x
k +1=ϕ(x k ), k =0, 1...
三、 实验过程、步骤(程序)
1. 雅可比迭代法
#include "stdio.h"
#include "math.h"
#include "string.h"
main()
{
int i,j,k;
float m1=0.0,m2=0.0;
float a[3][4]={8,-3,2,20,4,11,-1,33,6,3,12,36};
float x[3]={0.0,0.0,0.0};
for(k=1;k
{for(i=0;i
{
for(j=0;j
m1=m1+a[i][j]*x[j];
for(j=i+1;j
m2=m2+a[i][j]*x[j];
x[i]=(a[i][3]-m1-m2)/a[i][i];
m1=0,m2=0;
}
k++; }
printf("雅可比迭代法计算结果为:\n");
for(i=0;i
printf("x[%2d]=%8.9f\n",i+1,x[i]);
}
2高斯-塞德尔迭代法
#include
#include
# define n 3
void main()
{
int i,j,k=1;
float x[n]={0,0,0},m[n]={0,0,0},s=1;
float a[n][n]={8,-3,2,4,11,-1,6,3,12},d[n]={20,33,36};
printf("高斯-塞德尔迭代法运算结果为:\n");
for(k=0;fabs(s-x[0])>1e-6;k++)
{
s=x[0];
for(i=0;i
{m[i]=0;
for(j=0;j
m[i]=m[i]+d[i]+a[i][i]*x[i];
x[i]=m[i]/a[i][i];}
printf("Y1=%f Y2=%f Y3=%f\n",x[0],x[1],x[2]);
}
getchar() ;
}
3.
#include
#include
double f( double x )
{
return x * x * x + 2 * x * x + 10 * x - 20;
}
double fdx( double x )
{
return 3 * x * x + 18.4 * x + 16.7;
}
int main( )
{
int t1 = 0, t2 = 1;
double x[ 2 ], ep = 1e-8;
x[ 0 ] = 0;
do
{
t1 = 1 - t1;
t2 = 1 - t2;
x[ t1 ] = x[ t2 ] - f( x[ t2 ] ) / fdx( x[ t2 ] );
}
while( fabs( x[ t1 ] - x[ t2 ] ) > ep );
printf("解得x=%lf\n", x[ t1 ]);
return 0;
}
四.实验结果:
1. 雅可比迭代法:
2. 高斯-塞德尔迭代法:
.
3. 不动点迭代法:
五.实验小结
通过这次上机,学会了用Jacobis 迭代法,高斯-塞德尔迭代法求解线性方程组,算法程序比较复杂,特别是要多次使用数组条件及for 循环语句。还有不动点迭代法解方程的根,对这几种迭代方法有了更好的理解,并能通过编程和调试实现算法,完成了实验内容,收获很大。