
正文
列主元消元法java代码 列主元消去法求解方程组的例子
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
请教编程题:编程实现高斯列主元消去法求解线性方程组,写出相应的程序或程序段,编程语言不限。
以下的都在我的百度空间,关于解答线性方程组的,可以去看看
这里给你源代码
//解线性方程组
//By JJ,2008
#includeiostream.h
#includeiomanip.h
#includestdlib.h
//----------------------------------------------全局变量定义区
const int Number=15; //方程最大个数
double a[Number][Number],b[Number],copy_a[Number][Number],copy_b[Number]; //系数行列式
int A_y[Number]; //a[][]中随着横坐标增加列坐标的排列顺序,如a[0][0],a[1][2],a[2][1]...则A_y[]={0,2,1...};
int lenth,copy_lenth; //方程的个数
double a_sum; //计算行列式的值
char * x; //未知量a,b,c的载体
//----------------------------------------------函数声明区
void input(); //输入方程组
void print_menu(); //打印主菜单
int choose (); //输入选择
void cramer(); //Cramer算法解方程组
void gauss_row(); //Gauss列主元解方程组
void guass_all(); //Gauss全主元解方程组
void Doolittle(); //用Doolittle算法解方程组
int Doolittle_check(double a[][Number],double b[Number]); //判断是否行列式0,若是,调整为顺序主子式全0
void xiaoqu_u_l(); //将行列式Doolittle分解
void calculate_u_l(); //计算Doolittle结果
double calculate_A(int n,int m); //计算行列式
double quanpailie_A(); //根据列坐标的排列计算的值,如A_y[]={0,2,1},得sum=a[0][ A_y[0] ] * a[1][ A_y[1] ] * a[2][ A_y[2] ]=a[0][0]*a[1][2]*a[2][1];
void exchange(int m,int i); //交换A_y[m],A_y[i]
void exchange_lie(int j); //交换a[][j]与b[];
void exchange_hang(int m,int n); //分别交换a[][]和b[]中的m与n两行
void gauss_row_xiaoqu(); //Gauss列主元消去法
void gauss_all_xiaoqu(); //Gauss全主元消去法
void gauss_calculate(); //根据Gauss消去法结果计算未知量的值
void exchange_a_lie(int m,int n); //交换a[][]中的m和n列
void exchange_x(int m,int n); //交换x[]中的x[m]和x[n]
void recovery(); //恢复数据
//主函数
void main()
{
int flag=1;
input(); //输入方程
while(flag)
{
print_menu(); //打印主菜单
flag=choose(); //选择解答方式
}
}
//函数定义区
void print_menu()
{
system("cls");
cout"------------方程系数和常数矩阵表示如下:\n";
for(int j=0;jlenth;j++)
cout"系数"j+1" ";
cout"\t常数";
coutendl;
for(int i=0;ilenth;i++)
{
for(j=0;jlenth;j++)
coutsetw(8)setiosflags(ios::left)a[i][j];
cout"\t"b[i]endl;
}
cout"-----------请选择方程解答的方案----------";
cout"\n 1. 克拉默(Cramer)法则";
cout"\n 2. Gauss列主元消去法";
cout"\n 3. Gauss全主元消去法";
cout"\n 4. Doolittle分解法";
cout"\n 5. 退出";
cout"\n 输入你的选择:";
}
void input()
{ int i,j;
cout"方程的个数:";
cinlenth;
if(lenthNumber)
{
cout"It is too big.\n";
return;
}
x=new char[lenth];
for(i=0;ilenth;i++)
x[i]='a'+i;
//输入方程矩阵
//提示如何输入
cout"====================================================\n";
cout"请在每个方程里输入"lenth"系数和一个常数:\n";
cout"例:\n方程:a";
for(i=1;ilenth;i++)
{
cout"+"i+1x[i];
}
cout"=10\n";
cout"应输入:";
for(i=0;ilenth;i++)
couti+1" ";
cout"10\n";
cout"==============================\n";
//输入每个方程
for(i=0;ilenth;i++)
{
cout"输入方程"i+1":";
for(j=0;jlenth;j++)
cina[i][j];
cinb[i];
}
//备份数据
for(i=0;ilenth;i++)
for(j=0;jlenth;j++)
copy_a[i][j]=a[i][j];
for(i=0;ilenth;i++)
copy_b[i]=b[i];
copy_lenth=lenth;
}
//输入选择
int choose()
{
int choice;char ch;
cinchoice;
switch(choice)
{
case 1:cramer();break;
case 2:gauss_row();break;
case 3:guass_all();break;
case 4:Doolittle();break;
case 5:return 0;
default:cout"输入错误,请重新输入:";
choose();
break;
}
cout"\n是否换种方法求解(Y/N):";
cinch;
if(ch=='n'||ch=='N') return 0;
recovery();
cout"\n\n\n";
return 1;
}
//用克拉默法则求解方程.
void cramer()
{
int i,j;double sum,sum_x;char ch;
//令第i行的列坐标为i
cout"用克拉默(Cramer)法则结果如下:\n";
for(i=0;ilenth;i++)
A_y[i]=i;
sum=calculate_A(lenth,0);
if(sum!=0)
{
cout"系数行列式不为零,方程有唯一的解:";
for(i=0;ilenth;i++)
{ ch='a'+i;
a_sum=0;
for(j=0;jlenth;j++)
A_y[j]=j;
exchange_lie(i);
sum_x=calculate_A(lenth,0);
coutendlch"="sum_x/sum;
exchange_lie(i);
}
}
else
{
cout"系数行列式等于零,方程没有唯一的解.";
}
cout"\n";
}
double calculate_A(int n,int m) //计算行列式
{ int i;
if(n==1) {
a_sum+= quanpailie_A();
}
else{for(i=0;in;i++)
{ exchange(m,m+i);
calculate_A(n-1,m+1);
exchange(m,m+i);
}
}
return a_sum;
}
double quanpailie_A() //计算行列式中一种全排列的值
{
int i,j,l;
double sum=0,p;
for(i=0,l=0;ilenth;i++)
for(j=0;A_y[j]!=ijlenth;j++)
if(A_y[j]i) l++;
for(p=1,i=0;ilenth;i++)
p*=a[i][A_y[i]];
sum+=p*((l%2==0)?(1):(-1));
return sum;
}
//高斯列主元排列求解方程
void gauss_row()
{
int i,j;
gauss_row_xiaoqu(); //用高斯列主元消区法将系数矩阵变成一个上三角矩阵
for(i=0;ilenth;i++)
{
for(j=0;jlenth;j++)
coutsetw(10)setprecision(5)a[i][j];
coutsetw(10)b[i]endl;
}
if(a[lenth-1][lenth-1]!=0)
{
cout"系数行列式不为零,方程有唯一的解:\n";
gauss_calculate();
for(i=0;ilenth;i++) //输出结果
{
coutx[i]"="b[i]"\n";
}
}
else
cout"系数行列式等于零,方程没有唯一的解.\n";
}
void gauss_row_xiaoqu() //高斯列主元消去法
{
int i,j,k,maxi;double lik;
cout"用Gauss列主元消去法结果如下:\n";
for(k=0;klenth-1;k++)
{
j=k;
for(maxi=i=k;ilenth;i++)
if(a[i][j]a[maxi][j]) maxi=i;
if(maxi!=k)
exchange_hang(k,maxi);//
for(i=k+1;ilenth;i++)
{
lik=a[i][k]/a[k][k];
for(j=k;jlenth;j++)
a[i][j]=a[i][j]-a[k][j]*lik;
b[i]=b[i]-b[k]*lik;
}
}
}
//高斯全主元排列求解方程
void guass_all()
{
int i,j;
gauss_all_xiaoqu();
for(i=0;ilenth;i++)
{
for(j=0;jlenth;j++)
coutsetw(10)setprecision(5)a[i][j];
coutsetw(10)b[i]endl;
}
if(a[lenth-1][lenth-1]!=0)
{
cout"系数行列式不为零,方程有唯一的解:\n";
gauss_calculate();
for(i=0;ilenth;i++) //输出结果
{
for(j=0;x[j]!='a'+ijlenth;j++);
coutx[j]"="b[j]endl;
}
}
else
cout"系数行列式等于零,方程没有唯一的解.\n";
}
void gauss_all_xiaoqu() //Gauss全主元消去法
{
int i,j,k,maxi,maxj;double lik;
cout"用Gauss全主元消去法结果如下:\n";
for(k=0;klenth-1;k++)
{
for(maxi=maxj=i=k;ilenth;i++)
{
for(j=k;jlenth;j++)
if(a[i][j]a[maxi][ maxj])
{ maxi=i;
maxj=j;
}
}
if(maxi!=k)
exchange_hang(k,maxi);
if(maxj!=k)
{
exchange_a_lie(maxj,k); //交换两列
exchange_x(maxj,k);
}
for(i=k+1;ilenth;i++)
{
lik=a[i][k]/a[k][k];
for(j=k;jlenth;j++)
a[i][j]=a[i][j]-a[k][j]*lik;
b[i]=b[i]-b[k]*lik;
}
}
}
void gauss_calculate() //高斯消去法以后计算未知量的结果
{
int i,j;double sum_ax;
b[lenth-1]=b[lenth-1]/a[lenth-1][lenth-1];
for(i=lenth-2;i=0;i--)
{
for(j=i+1,sum_ax=0;jlenth;j++)
sum_ax+=a[i][j]*b[j];
b[i]=(b[i]-sum_ax)/a[i][i];
}
}
void Doolittle() //Doolittle消去法计算方程组
{
double temp_a[Number][Number],temp_b[Number];int i,j,flag;
for(i=0;ilenth;i++)
for(j=0;jlenth;j++)
temp_a[i][j]=a[i][j];
flag=Doolittle_check(temp_a,temp_b);
if(flag==0) cout"\n行列式为零.无法用Doolittle求解.";
xiaoqu_u_l();
calculate_u_l();
cout"用Doolittle方法求得结果如下:\n";
for(i=0;ilenth;i++) //输出结果
{
for(j=0;x[j]!='a'+ijlenth;j++);
coutx[j]"="b[j]endl;
}
}
void calculate_u_l() //计算Doolittle结果
{ int i,j;double sum_ax=0;
for(i=0;ilenth;i++)
{
for(j=0,sum_ax=0;ji;j++)
sum_ax+=a[i][j]*b[j];
b[i]=b[i]-sum_ax;
}
for(i=lenth-1;i=0;i--)
{
for(j=i+1,sum_ax=0;jlenth;j++)
sum_ax+=a[i][j]*b[j];
b[i]=(b[i]-sum_ax)/a[i][i];
}
}
void xiaoqu_u_l() //将行列式按Doolittle分解
{ int i,j,n,k;double temp;
for(i=1,j=0;ilenth;i++)
a[i][j]=a[i][j]/a[0][0];
for(n=1;nlenth;n++)
{ //求第n+1层的上三角矩阵部分即U
for(j=n;jlenth;j++)
{ for(k=0,temp=0;kn;k++)
temp+=a[n][k]*a[k][j];
a[n][j]-=temp;
}
for(i=n+1;ilenth;i++) //求第n+1层的下三角矩阵部分即L
{ for(k=0,temp=0;kn;k++)
temp+=a[i][k]*a[k][n];
a[i][n]=(a[i][n]-temp)/a[n][n];
}
}
}
int Doolittle_check(double temp_a[][Number],double temp_b[Number]) //若行列式不为零,将系数矩阵调整为顺序主子式大于零
{
int i,j,k,maxi;double lik,temp;
for(k=0;klenth-1;k++)
{
j=k;
for(maxi=i=k;ilenth;i++)
if(temp_a[i][j]temp_a[maxi][j]) maxi=i;
if(maxi!=k)
{ exchange_hang(k,maxi);
for(j=0;jlenth;j++)
{ temp=temp_a[k][j];
temp_a[k][j]=temp_a[maxi][j];
temp_a[maxi][j]=temp;
}
}
for(i=k+1;ilenth;i++)
{
lik=temp_a[i][k]/temp_a[k][k];
for(j=k;jlenth;j++)
temp_a[i][j]=temp_a[i][j]-temp_a[k][j]*lik;
temp_b[i]=temp_b[i]-temp_b[k]*lik;
}
}
if(temp_a[lenth-1][lenth-1]==0) return 0;
return 1;
}
void exchange_hang(int m,int n) //交换a[][]中和b[]两行
{
int j; double temp;
for(j=0;jlenth;j++)
{ temp=a[m][j];
a[m][j]=a[n][j];
a[n][j]=temp;
}
temp=b[m];
b[m]=b[n];
b[n]=temp;
}
void exchange(int m,int i) //交换A_y[m],A_y[i]
{ int temp;
temp=A_y[m];
A_y[m]=A_y[i];
A_y[i]=temp;
}
void exchange_lie(int j) //交换未知量b[]和第i列
{ double temp;int i;
for(i=0;ilenth;i++)
{ temp=a[i][j];
a[i][j]=b[i];
b[i]=temp;
}
}
void exchange_a_lie(int m,int n) //交换a[]中的两列
{ double temp;int i;
for(i=0;ilenth;i++)
{ temp=a[i][m];
a[i][m]=a[i][n];
a[i][n]=temp;
}
}
void exchange_x(int m,int n) //交换未知量x[m]与x[n]
{ char temp;
temp=x[m];
x[m]=x[n];
x[n]=temp;
}
void recovery() //用其中一种方法求解后恢复数据以便用其他方法求解
{
for(int i=0;ilenth;i++)
for(int j=0;jlenth;j++)
a[i][j]=copy_a[i][j];
for(i=0;ilenth;i++)
b[i]=copy_b[i];
for(i=0;ilenth;i++)
x[i]='a'+i;
a_sum=0;
lenth=copy_lenth;
}
相关问答
Q1: java编写高斯消去法的程序能解释一下么
高斯消元法(或译列主元消元法java代码:高斯消去法),是线性代数规划中列主元消元法java代码的一个算法,可用来为线性方程组求解。但其算法十分复杂,不常用于加减消元法,求出矩阵列主元消元法java代码的秩,以及求出可逆方阵的逆矩阵。不过,如果有过百万条等式时,这个算法会十分省时。
一些极大的方程组通常会用迭代法以及花式消元来解决。当用于一个矩阵时,高斯消元法会产生出一个“行梯阵式”。
高斯消元法可以用在电脑中来解决数千条等式及未知数。亦有一些方法特地用来解决一些有特别排列的系数的方程组。
Q2: 用列主元Gauss消元法解线性方程组
第二个方程减去第四个方程得
x2+3x3-4x4=2
然后再加上第一个方程得
2x3-3x4=2 (1)(消去了x1)
第三个方程减去2倍第四个方程得
2x2+4x3-4x4=1
然后加上2倍第一个方程得
2x3-2x4=1 (2)……(消去了x2)
(2)-(1)
得x4=-1 (消去了x3)
然后反过来将x4带入(2)求出x3,依次再求出x2,x1.
然后层层代回去
编程列主元消元法java代码的话,代码太多,给列主元消元法java代码你剪切复制一个仅作参考
--------
//红色部分为后来修改内容,程序的错误在所难免,你们的反馈是程序完善的动力!
//解线性方程组
//By JJ,2008
#includeiostream.h
#includeiomanip.h
#includestdlib.h
#includemath.h
//----------------------------------------------全局变量定义区
const int Number=15; //方程最大个数
double a[Number][Number],b[Number],copy_a[Number][Number],copy_b[Number]; //系数行列式
int A_y[Number]; //a[][]中随着横坐标增加列坐标的排列顺序,如a[0][0],a[1][2],a[2][1]...则A_y[]={0,2,1...};
int lenth,copy_lenth; //方程的个数
double a_sum; //计算行列式的值
char * x; //未知量a,b,c的载体
//----------------------------------------------函数声明区
void input(); //输入方程组
void print_menu(); //打印主菜单
int choose (); //输入选择
void cramer(); //Cramer算法解方程组
void gauss_row(); //Gauss列主元解方程组
void guass_all(); //Gauss全主元解方程组
void Doolittle(); //用Doolittle算法解方程组
int Doolittle_check(double a[][Number],double b[Number]); //判断是否行列式0,若是,调整为顺序主子式全0
void xiaoqu_u_l(); //将行列式Doolittle分解
void calculate_u_l(); //计算Doolittle结果
double calculate_A(int n,int m); //计算行列式
double quanpailie_A(); //根据列坐标的排列计算的值,如A_y[]={0,2,1},得sum=a[0][ A_y[0] ] * a[1][ A_y[1] ] * a[2][ A_y[2] ]=a[0][0]*a[1][2]*a[2][1];
void exchange(int m,int i); //交换A_y[m],A_y[i]
void exchange_lie(int j); //交换a[][j]与b[];
void exchange_hang(int m,int n); //分别交换a[][]和b[]中的m与n两行
void gauss_row_xiaoqu(); //Gauss列主元消去法
void gauss_all_xiaoqu(); //Gauss全主元消去法
void gauss_calculate(); //根据Gauss消去法结果计算未知量的值
void exchange_a_lie(int m,int n); //交换a[][]中的m和n列
void exchange_x(int m,int n); //交换x[]中的x[m]和x[n]
void recovery(); //恢复数据
//主函数
void main()
{
int flag=1;
input(); //输入方程
while(flag)
{
print_menu(); //打印主菜单
flag=choose(); //选择解答方式
}
}
//函数定义区
void print_menu()
{
system("cls");
cout"------------方程系数和常数矩阵表示如下:\n";
for(int j=0;jlenth;j++)
cout"系数"j+1" ";
cout"\t常数";
coutendl;
for(int i=0;ilenth;i++)
{
for(j=0;jlenth;j++)
coutsetw(8)setiosflags(ios::left)a[i][j];
cout"\t"b[i]endl;
}
cout"-----------请选择方程解答的方案----------";
cout"\n 1. 克拉默(Cramer)法则";
cout"\n 2. Gauss列主元消去法";
cout"\n 3. Gauss全主元消去法";
cout"\n 4. Doolittle分解法";
cout"\n 5. 退出";
cout"\n 输入你的选择:";
}
void input()
{ int i,j;
cout"方程的个数:";
cinlenth;
if(lenthNumber)
{
cout"It is too big.\n";
return;
}
x=new char[lenth];
for(i=0;ilenth;i++)
x[i]='a'+i;
//输入方程矩阵
//提示如何输入
cout"====================================================\n";
cout"请在每个方程里输入"lenth"系数和一个常数:\n";
cout"例列主元消元法java代码:\n方程:a";
for(i=1;ilenth;i++)
{
cout"+"i+1x[i];
}
cout"=10\n";
cout"应输入:";
for(i=0;ilenth;i++)
couti+1" ";
cout"10\n";
cout"==============================\n";
//输入每个方程
for(i=0;ilenth;i++)
{
cout"输入方程"i+1":";
for(j=0;jlenth;j++)
cina[i][j];
cinb[i];
}
//备份数据
for(i=0;ilenth;i++)
for(j=0;jlenth;j++)
copy_a[i][j]=a[i][j];
for(i=0;ilenth;i++)
copy_b[i]=b[i];
copy_lenth=lenth;
}
//输入选择
int choose()
{
int choice;char ch;
cinchoice;
switch(choice)
{
case 1:cramer();break;
case 2:gauss_row();break;
case 3:guass_all();break;
case 4:Doolittle();break;
case 5:return 0;
default:cout"输入错误,请重新输入:";
choose();
break;
}
cout"\n是否换种方法求解(Y/N):";
cinch;
if(ch=='n'||ch=='N') return 0;
recovery();
cout"\n\n\n";
return 1;
}
//用克拉默法则求解方程.
void cramer()
{
int i,j;double sum,sum_x;char ch;
//令第i行的列坐标为i
cout"用克拉默(Cramer)法则结果如下:\n";
for(i=0;ilenth;i++)
A_y[i]=i;
sum=calculate_A(lenth,0);
if(sum!=0)
{
cout"系数行列式不为零,方程有唯一的解:";
for(i=0;ilenth;i++)
{ ch='a'+i;
a_sum=0;
for(j=0;jlenth;j++)
A_y[j]=j;
exchange_lie(i);
sum_x=calculate_A(lenth,0);
coutendlch"="sum_x/sum;
exchange_lie(i);
}
}
else
{
cout"系数行列式等于零,方程没有唯一的解.";
}
cout"\n";
}
double calculate_A(int n,int m) //计算行列式
{ int i;
if(n==1) {
a_sum+= quanpailie_A();
}
else{for(i=0;in;i++)
{ exchange(m,m+i);
calculate_A(n-1,m+1);
exchange(m,m+i);
}
}
return a_sum;
}
double quanpailie_A() //计算行列式中一种全排列的值
{
int i,j,l;
double sum=0,p;
for(i=0,l=0;ilenth;i++)
for(j=0;A_y[j]!=ijlenth;j++)
if(A_y[j]i) l++;
for(p=1,i=0;ilenth;i++)
p*=a[i][A_y[i]];
sum+=p*((l%2==0)?(1):(-1));
return sum;
}
//高斯列主元排列求解方程
void gauss_row()
{
int i,j;
gauss_row_xiaoqu(); //用高斯列主元消区法将系数矩阵变成一个上三角矩阵
for(i=0;ilenth;i++)
{
for(j=0;jlenth;j++)
coutsetw(10)setprecision(5)a[i][j];
coutsetw(10)b[i]endl;
}
if(a[lenth-1][lenth-1]!=0)
{
cout"系数行列式不为零,方程有唯一的解列主元消元法java代码:\n";
gauss_calculate();
for(i=0;ilenth;i++) //输出结果
{
coutx[i]"="b[i]"\n";
}
}
else
cout"系数行列式等于零,方程没有唯一的解.\n";
}
void gauss_row_xiaoqu() //高斯列主元消去法
{
int i,j,k,maxi;double lik;
cout"用Gauss列主元消去法结果如下:\n";
for(k=0;klenth-1;k++)
{
j=k;
for(maxi=i=k;ilenth;i++)
if(fabs(a[i][j])fabs(a[maxi][j])) maxi=i; //添加绝对值运算符
if(maxi!=k)
exchange_hang(k,maxi);//
for(i=k+1;ilenth;i++)
{
lik=a[i][k]/a[k][k];
for(j=k;jlenth;j++)
a[i][j]=a[i][j]-a[k][j]*lik;
b[i]=b[i]-b[k]*lik;
}
}
}
//高斯全主元排列求解方程
void guass_all()
{
int i,j;
gauss_all_xiaoqu();
for(i=0;ilenth;i++)
{
for(j=0;jlenth;j++)
coutsetw(10)setprecision(5)a[i][j];
coutsetw(10)b[i]endl;
}
if(a[lenth-1][lenth-1]!=0)
{
cout"系数行列式不为零,方程有唯一的解:\n";
gauss_calculate();
for(i=0;ilenth;i++) //输出结果
{
for(j=0;x[j]!='a'+ijlenth;j++);
coutx[j]"="b[j]endl;
}
}
else
cout"系数行列式等于零,方程没有唯一的解.\n";
}
void gauss_all_xiaoqu() //Gauss全主元消去法
{
int i,j,k,maxi,maxj;double lik;
cout"用Gauss全主元消去法结果如下:\n";
for(k=0;klenth-1;k++)
{
for(maxi=maxj=i=k;ilenth;i++)
{
for(j=k;jlenth;j++)
if(fabs(a[i][j])fabs(a[maxi][ maxj])) //添加绝对值运算符
{ maxi=i;
maxj=j;
}
}
if(maxi!=k)
exchange_hang(k,maxi);
if(maxj!=k)
{
exchange_a_lie(maxj,k); //交换两列
exchange_x(maxj,k);
}
for(i=k+1;ilenth;i++)
{
lik=a[i][k]/a[k][k];
for(j=k;jlenth;j++)
a[i][j]=a[i][j]-a[k][j]*lik;
b[i]=b[i]-b[k]*lik;
}
}
}
void gauss_calculate() //高斯消去法以后计算未知量的结果
{
int i,j;double sum_ax;
b[lenth-1]=b[lenth-1]/a[lenth-1][lenth-1];
for(i=lenth-2;i=0;i--)
{
for(j=i+1,sum_ax=0;jlenth;j++)
sum_ax+=a[i][j]*b[j];
b[i]=(b[i]-sum_ax)/a[i][i];
}
}
void Doolittle() //Doolittle消去法计算方程组
{
double temp_a[Number][Number],temp_b[Number];int i,j,flag;
for(i=0;ilenth;i++)
for(j=0;jlenth;j++)
temp_a[i][j]=a[i][j];
flag=Doolittle_check(temp_a,temp_b);
if(flag==0) cout"\n行列式为零.无法用Doolittle求解.";
xiaoqu_u_l();
calculate_u_l();
cout"用Doolittle方法求得结果如下:\n";
for(i=0;ilenth;i++) //输出结果
{
for(j=0;x[j]!='a'+ijlenth;j++);
coutx[j]"="b[j]endl;
}
}
void calculate_u_l() //计算Doolittle结果
{ int i,j;double sum_ax=0;
for(i=0;ilenth;i++)
{
for(j=0,sum_ax=0;ji;j++)
sum_ax+=a[i][j]*b[j];
b[i]=b[i]-sum_ax;
}
for(i=lenth-1;i=0;i--)
{
for(j=i+1,sum_ax=0;jlenth;j++)
sum_ax+=a[i][j]*b[j];
b[i]=(b[i]-sum_ax)/a[i][i];
}
}
void xiaoqu_u_l() //将行列式按Doolittle分解
{ int i,j,n,k;double temp;
for(i=1,j=0;ilenth;i++)
a[i][j]=a[i][j]/a[0][0];
for(n=1;nlenth;n++)
{ //求第n+1层的上三角矩阵部分即U
for(j=n;jlenth;j++)
{ for(k=0,temp=0;kn;k++)
temp+=a[n][k]*a[k][j];
a[n][j]-=temp;
}
for(i=n+1;ilenth;i++) //求第n+1层的下三角矩阵部分即L
{ for(k=0,temp=0;kn;k++)
temp+=a[i][k]*a[k][n];
a[i][n]=(a[i][n]-temp)/a[n][n];
}
}
}
int Doolittle_check(double temp_a[][Number],double temp_b[Number]) //若行列式不为零,将系数矩阵调整为顺序主子式大于零
{
int i,j,k,maxi;double lik,temp;
for(k=0;klenth-1;k++)
{
j=k;
for(maxi=i=k;ilenth;i++)
if(temp_a[i][j]temp_a[maxi][j]) maxi=i;
if(maxi!=k)
{ exchange_hang(k,maxi);
for(j=0;jlenth;j++)
{ temp=temp_a[k][j];
temp_a[k][j]=temp_a[maxi][j];
temp_a[maxi][j]=temp;
}
}
for(i=k+1;ilenth;i++)
{
lik=temp_a[i][k]/temp_a[k][k];
for(j=k;jlenth;j++)
temp_a[i][j]=temp_a[i][j]-temp_a[k][j]*lik;
temp_b[i]=temp_b[i]-temp_b[k]*lik;
}
}
if(temp_a[lenth-1][lenth-1]==0) return 0;
return 1;
}
void exchange_hang(int m,int n) //交换a[][]中和b[]两行
{
int j; double temp;
for(j=0;jlenth;j++)
{ temp=a[m][j];
a[m][j]=a[n][j];
a[n][j]=temp;
}
temp=b[m];
b[m]=b[n];
b[n]=temp;
}
void exchange(int m,int i) //交换A_y[m],A_y[i]
{ int temp;
temp=A_y[m];
A_y[m]=A_y[i];
A_y[i]=temp;
}
void exchange_lie(int j) //交换未知量b[]和第i列
{ double temp;int i;
for(i=0;ilenth;i++)
{ temp=a[i][j];
a[i][j]=b[i];
b[i]=temp;
}
}
void exchange_a_lie(int m,int n) //交换a[]中的两列
{ double temp;int i;
for(i=0;ilenth;i++)
{ temp=a[i][m];
a[i][m]=a[i][n];
a[i][n]=temp;
}
}
void exchange_x(int m,int n) //交换未知量x[m]与x[n]
{ char temp;
temp=x[m];
x[m]=x[n];
x[n]=temp;
}
void recovery() //用其中一种方法求解后恢复数据以便用其列主元消元法java代码他方法求解
{
for(int i=0;ilenth;i++)
for(int j=0;jlenth;j++)
a[i][j]=copy_a[i][j];
for(i=0;ilenth;i++)
b[i]=copy_b[i];
for(i=0;ilenth;i++)
x[i]='a'+i;
a_sum=0;
lenth=copy_lenth;
}
Q3: 如何用编程实现高斯列主元消去法?
用C语言编制以下程序:
#include stdio.h
#include math.h
void main()
{
int i,j,k,ik,n;
float max,t,a[10][10],x[10],sum;
printf("请输入方程组的阶数:");
scanf("%d",n);
printf("请输入增广矩阵\n");
for (i=1;i=n;i++)
for (j=1;j=n+1;j++)
scanf("%f",a[i][j]);
for (k=1;k=n-1;k++)
{
max=0.0;
for (i=k;i=n;i++)
if (maxfabs(a[i][k]))
{
max=fabs(a[i][k]);
ik=i;
}
if (max==0)
{
printf("A is singular");
break;
}
if (ik!=k)
for (j=k;j=n+1;j++)
{
t=a[k][j];
a[k][j]=a[ik][j];
a[ik][j]=t;
}
for(i=k+1;i=n;i++)
{
a[i][k]=a[i][k]/a[k][k];
for (j=k+1;j=n+1;j++)
a[i][j]=a[i][j]-a[i][k]*a[k][j];
}
}
if (a[n][n]==0)
printf("A is singular");
else
x[n]=a[n][n+1]/a[n][n];
for (k=n-1;k=1;k--)
{
sum=0.0;
for (j=k+1;j=n;j++)
sum=sum+a[k][j]*x[j];
x[k]=(a[k][n+1]-sum)/a[k][k];
}
for (i=1;i=n;i++)
printf("x[%d]=%f\n",i,x[i]);
}
Q4: 大学课程数值分析实验GUASS消元法程序,急急急
分析:上、下坡的速度不同,问题要分两段来研究。根据函数图象提供的信息,称为高斯(Guass)函数,也叫取整函数。 任意一个实数都能写成整数与非负纯
关于列主元消元法java代码和列主元消去法求解方程组的例子的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。








