!急求!全选主元高斯-约当消去法求解线性方程组的串行算法和并行算法代码
求行列式值的全选主元高斯消去法 java核心算法代码 (2009-09-18 09:29:28)转载
标签: 杂谈 分类: Java技术
核心代码如下所示,其中,numRows*numColumns方针的所有元素存储在double elements[]数组中,其中,矩阵元素a[i][j]对应于元素elements[i*numColumns+j].
public double computeDetGauss() {
int is = 0, js = 0;//第i行右下角矩阵’绝对值最大的元素’的行列号
int l, u, v; //numRows*numColumns方阵排成行后,元素a[i][j]的下标
double temp;//临时变量
// 初值
double f = 1.0;//行列式求解中对调一行or列(每置换一次,行列式变号一次)
double det = 1.0;//待返回的行列式值
// 消元
for (int k = 0; k = numColumns – 2; k++) {//第k列(从0开始,到col-2列)
double q = 0.0;//第k行k列右下角矩阵’绝对值最大的元素’值
for (int i = k; i = numColumns – 1; i++) {//从第i行(i=k),到
for (int j = k; j = numColumns – 1; j++) {//列
l = i * numColumns + j;//第i行第j列的元素下标
temp = Math.abs(elements[l]);//元素a[i][j]
if (temp q) {//元素d=a[i][j]更大
q = temp;//更新”最大”
is = i;//右下角矩阵’绝对值最大的元素’的行号
js = j;//右下角矩阵’绝对值最大的元素’的列号
}
}
}
if (q == 0.0) {//第k行k列右下角矩阵全为0!!!
det = 0.0;
return (det); //行列式=0
}
用c语言编写高斯-约当全主元消去法
#include iostream
#include iomanip.h
using namespace std;
#define N 20
double a[N][N];
double x[N+1];
double b[N+1];
int n;//n方程个数,n未知数个数
int set( )
{
cout”请输入方程的个数和未知数个数: “endl;
cinn;
int i,j;
cout”请输入方程组(逐个输入方程 i)”endl;
for(i = 1;i = n;i++)
{
for(j = 1;j=n;j++)
{
cina[i][j];//系数
}
cinb[i];//结果
}
return 0;
}
int find(int k)//寻找第k列主元
{
int i,tag = k;
double maxv=0;
for(i = k;i = n;i++)
{
if(a[i][k] maxv)
{
maxv = a[i][k];
tag = i;
}
}
return tag;
}
void exchange(int i1,int i2)//将第 i1 i2行互换
{
int j;
for(j = 1;j = n;j++)
{
swap(a[i1][j],a[i2][j]);
}
swap(b[i1],b[i2]);
}
void div(int k)//让第k个方程的首项系数为1
{
double temp = a[k][k];
for(int j = k; j = n;j++)
{
a[k][j]/=temp;
}
b[k]/=temp;
}
void disME(int k)
{
int i,j;
for(i =1 ;i=n;i++)
{
for(j = i;j= n;j++)
{
if(a[i][j])
{
if(a[i][j]==1)
{if(j==n)
cout”x”j;
else
cout”x”j” + “;
}
else
{
if(j==n)
couta[i][j]”x”j;
else
couta[i][j]”x”j” + “;
}
}
}
cout” = “b[i]endl;
}
system(“pause”);
}
void eliminate(int k)//消元
{
int i,j;
double t;
for(i = k+1;i= n;i++)
{
t = a[i][k]/a[k][k];
for(j = k;j = n;j++)
{
a[i][j]-=a[k][j] * t;
}
b[i] -= b[k] * t;
}
}
void Gauss()//高斯消元法
{
int i,j,k;
for(k = 1;k n;k++)//共进行n – 1次消元
{
int l = find(k);//寻找第k次消元法的主元方程
if(l!=k)
{
exchange(l,k);
}
//消元
div(k);
eliminate(k);
cout”第”k”次消元结果:”endl;
disME(k);
}
div(k);
x[k] = b[k];
//disM();
for(i = n – 1;i=1;i–)
{
for(j = i+1;j =n ;j++)
{
b[i] -= a[i][j] * b [j];
}
x[i] = b[i];
}
}
void dis()
{
int i;
cout”解方程得:”endl;
for(i = 1;i=n;i++)
{
cout”x”i” = “;
printf(“%.5f\n”,x[i]);
}
}
int main()
{
set();
Gauss();
dis();
system(“pause”);
return 0;
}
———————————————————————————————
希望答案能帮到你,要是你有疑问可以追问
当然,采纳也是您的美德,谢谢
用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;
}