java高斯消去法代码,高斯消去法c语言代码

matlab 编写高斯消去法程序代码

用高斯消元法解线性方程组 的MATLAB程序

创新互联建站是一家专业提供龙安企业网站建设,专注与成都做网站、网站设计、HTML5建站、小程序制作等业务。10年已为龙安众多企业、政府机构等服务。创新互联专业网站建设公司优惠进行中。

输入的量:系数矩阵 和常系数向量 ;

输出的量:系数矩阵 和增广矩阵 的秩RA,RB, 方程组中未知量的个数n和有关方程组解 及其解的信息.

function [RA,RB,n,X]=gaus(A,b)

B=[A b]; n=length(b); RA=rank(A);

RB=rank(B);zhica=RB-RA;

if zhica0,

disp('请注意:因为RA~=RB,所以此方程组无解.')

return

end

if RA==RB

if RA==n

disp('请注意:因为RA=RB=n,所以此方程组有唯一解.')

X=zeros(n,1); C=zeros(1,n+1);

for p= 1:n-1

for k=p+1:n

m= B(k,p)/ B(p,p); B(k,p:n+1)= B(k,p:n+1)-m* B(p,p:n+1);

end

end

b=B(1:n,n+1);A=B(1:n,1:n); X(n)=b(n)/A(n,n);

for q=n-1:-1:1

X(q)=(b(q)-sum(A(q,q+1:n)*X(q+1:n)))/A(q,q);

end

else

disp('请注意:因为RA=RBn,所以此方程组有无穷多解.')

end

end

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;

}

用c语言实现高斯消去法,解三元一次方程组。求具体程序!!

#includeiostream

#includecmath

using namespace std;

#define MAX 50

void input(double a[MAX][MAX+1],int n)

{

cout"输入原方程组的增广矩阵"endl;

for(int i=0;in;i++)

for(int j=0;jn+1;j++)

cina[i][j];

}

void output(double x[],int n)

{

cout"Gauss 消去法得到的原方程组的解为"endl;

for(int k=0;kn;k++)

coutx[k]" ";

}

int main()

{

double a[MAX][MAX+1],x[MAX],sum,max,t;

int n,i,j,k,max_i;

cout"输入原方程组的阶"endl; cinn;

input(a,n);

for(k=0;kn-1;k++)//选主元素

{ max=a[k][k];

max_i=k;

for(i=k+1;in;i++)

if(fabs(a[i][k])fabs(max))

{

max=a[i][k];

max_i=i;

}

if(max==0)

break;

if(max_i!=k)//交换两行

for(j=k;jn+1;j++)

{

t=a[k][j];

a[k][j]=a[max_i][j];

a[max_i][j]=t;

}

for(i=k+1;in;i++)

{

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

for(j=k+1;jn+1;j++)

a[i][j]=a[i][j]+a[i][k]*a[k][j];

}//消元

}

if(max==0)cout"原方程组无解"endl;

else

{

for(k=n-1;k=0;k--)

{

sum=0;

for(j=k+1;jn;j++)

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

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

}//回代

output(x,n);

coutendl;

}

return 0;

}

高斯消元法

其包括两个过程: 消去过程:把方程组系数矩阵A化为同解的上三角矩阵; 回代过程:按相反的顺序,从xn至x1逐个求解上三角方程组。 %高斯消去法的MATLAB程序 function x=gauss(a,b); %编写高斯消去法函数 %a表示方程组的系数矩阵,b表示方程组的值 %X表示最终的输出结果,即方程组的解 n=length(b); %计算方程组的维数 %下面的程序在不断的消去,直到变成a变成上三角矩阵未知 for k=1:n-1 for i=k+1:n a(i,k)=a(i,k)/a(k,k); for j=k+1:n a(i,j)=a(i,j)-a(i,k)*a(k,j); end b(i)=b(i)-a(i,k)*b(k); end end %表示高斯消去法的回带过程 x=zeros(n,1); x(n)=b(n)/a(n,n); for k=n-1:-1:1 s=b(k); for j=k+1:n s=s-a(k,j)*x(j); end x(k)=s/a(k,k); end 实例验证: %调用编好的消去法函数 A=[1,2,3;2,2,3;-1,-3,10];B=[0,3,2];gauss(A,B) ans = 3.0000 -1.5517 0.0345 A=[1,2,3;2,2,3;-1,-3,10];B=[0,3,2];x=gauss(A,B) x = 3.0000 -1.5517 0.0345 A*x %反代求解进行比较 ans = 0.0000 3.0000 2.0000


本文标题:java高斯消去法代码,高斯消去法c语言代码
分享地址:http://myzitong.com/article/hdsiie.html