Gauss_Seidel法(高斯赛德尔迭代法)解线性方程组
程序员文章站
2022-07-05 16:58:25
...
import java.math.BigDecimal;
import java.util.Scanner;
public class Gauss_Seidel{
final static int MAXN=10;
static double a[][]=new double[MAXN][MAXN];
// static double b[]=new double[MAXN];
static double x1[]=new double[MAXN];//用于保存迭代用的值
static int flag=7;//迭代次数
static int num;
public static void main(String[] args) {
System.out.println("未知数个数:");
Scanner sc=new Scanner(System.in);
num = sc.nextInt();
System.out.println("以矩阵的形式输入方程组");
for(int i=0;i<num;i++){
for(int j=0;j<=num;j++){
a[i][j]=sc.nextDouble();
}
}
System.out.println("输入方程组的初始迭代值");
for(int i=0;i<num;i++){
x1[i]=sc.nextDouble();
//x2[i]=0;
}
for(int i=0;i<num;i++){//将方程组写成等价的方程组
for(int j=0;j<=num;j++){
if(j<num&&j!=i){
a[i][j]=-(a[i][j]/a[i][i]);
}else if(j==num){
a[i][j]=(a[i][j]/a[i][i]);
}
}
a[i][i]=0;
}
for(int i=1;i<=flag;i++){//开始迭代
diedai();
System.out.println("迭代"+(i)+"次:");
for(int j=0;j<num;j++){
System.out.println("x"+(j+1)+"="+ new BigDecimal(x1[j]).
setScale(5, BigDecimal.ROUND_HALF_UP).doubleValue());//保留小数点后五位
}
}
}
static void diedai(){
for(int i=0;i<num;i++){
double temp=0;
for(int j=0;j<num;j++){
temp+=x1[j]*a[i][j];
}
temp+=a[i][num];
x1[i]=temp;
}
}
}
//10 -1 -2 7.2
// -1 10 -2 8.3
// -1 -1 5 4.2
上一篇: 最小二乘法
下一篇: 数值计算笔记之插值(四)三次样条插值