}
t=b[k]; b[k]=b[is]; b[is]=t;
}
}
if (l==0)
{ free(js); printf("fail\n");
return(0);
}
d=a[k*n+k];
for (j=k+1;j=n-1;j++)
{ p=k*n+j; a[p]=a[p]/d;}
b[k]=b[k]/d;
for (i=k+1;i=n-1;i++)
{ for (j=k+1;j=n-1;j++)
{ p=i*n+j;
a[p]=a[p]-a[i*n+k]*a[k*n+j];
}
b[i]=b[i]-a[i*n+k]*b[k];
}
}
d=a[(n-1)*n+n-1];
if (fabs(d)+1.0==1.0)
{ free(js); printf("fail\n");
return(0);
}
b[n-1]=b[n-1]/d;
for (i=n-2;i=0;i--)
{ t=0.0;
for (j=i+1;j=n-1;j++)
t=t+a[i*n+j]*b[j];
b[i]=b[i]-t;
}
js[n-1]=n-1;
for (k=n-1;k=0;k--)
if (js[k]!=k)
{ t=b[k]; b[k]=b[js[k]]; b[js[k]]=t;}
free(js);
return(1);
}
徐世良老师的.原地工作全选主元的高斯消元.用的符号有点诡异,而且将矩阵以线性表输入的.
我也写过一个,不过估计你不太喜欢用我的,这个用来解b也是矩阵的.
#include stdio.h
#include stdlib.h
#include math.h
void swap(double *a,double *b){
double temp;
temp=*a;
*a=*b;
*b=temp;
}
void printMatrix(int n,int m,double **a){
int i,j;
for (i=0;in;i++){
for (j=0;jm;j++) printf("%e\t",a[i][j]);
printf("\n");
}
}
int rgauss(int n,int m,double **a,double **b){//,double *det){
int *colex,rowex,s,i,j,k;
double d,t;
// *det=1;
s=0;
colex=malloc(n*sizeof(int));
for (k=0;kn;k++){
d=0.0;
for (i=k;in;i++){
for (j=k;jn;j++){
t=fabs(a[i][j]);
if (td){
d=t;
colex[k]=j;
rowex=i;
}
}
}
if (d+1.0==1.0){
free(colex);
printf("Singular Matrix!\n");
return 0;
}
else{
if (colex[k]!=k){
for (i=0;in;i++)
swap(a[i]+colex[k],a[i]+k);
s=s+colex[k]-k;
}
if (rowex!=k){
for (j=0;jn;j++)
swap(a[rowex]+j,a[k]+j);
for (j=0;jm;j++)
swap(b[rowex]+j,b[k]+j);
s=s+rowex-k;
}
}
d=a[k][k];
// *det=*det*d;
for (j=k+1;jn;j++) a[k][j]/=d;
for (j=0;jm;j++) b[k][j]/=d;
for (i=k+1;in;i++){
for (j=k+1;jn;j++)
a[i][j]-=a[i][k]*a[k][j];
for (j=0;jm;j++)
b[i][j]-=a[i][k]*b[k][j];
}
}
for (i=n-2;i-1;i--)
for (j=i+1;jn;j++)
for (k=0;km;k++)
b[i][k]-=a[i][j]*b[j][k];
colex[n-1]=n-1;
for (i=n-1;i-1;i--)
if (colex[i]!=i)
for (j=0;jm;j++) swap(b[colex[i]]+j,b[i]+j);
// if (s1) *det=-*det;
return 1;
}
void main(){
#define N 2
#define M 1
double input_a[]={1,1,1,2};
double input_b[]={1,2};
double *a[N],*b[N];
int i;
for (i=0;iN;i++){
a[i]=input_a+N*i;
b[i]=input_b+M*i;
}
rgauss(N,M,a,b);
printf("方程解为:\n");
printMatrix(N,M,b);
printf("\n");
}
用c语言程序写一个函数,求线性代数方程组AX=b,要有通用性 。非常感谢帮忙 。高斯-赛德尔迭代法
#include stdio.h
#include conio.h
#include alloc.h
#include math.h
#defineN100
float*GauseSeidel(float*a,intn)
{
inti,j,nu=0;
float*x,dx;
x=(float*)malloc(n*sizeof(float));
for(i=0;i =n-1;i++)
x[i]=0.0;
do
{
for(i=0;i =n-1;i++)
{
floatd=0.0;
for(j=0;j =n-1;j++)
d+=*(a+i*(n+1)+j)*x[j];
dx=(*(a+i*(n+1)+n)-d)/(*(a+i*(n+1)+i));
x[i]+=dx;
}
if(nu =N)
{
printf( "迭代发散\n ");
exit(1);
}
nu++;
}
while(fabs(dx) 1e-6);
returnx;
}
main()
{
inti;
float*x;
floatc[12]={5,2,1,8,2,8,-3,21,1,-3,-6,1};
float*GauseSeidel(float*,int);
推荐阅读
- 看直播安装什么软件最好,看直播安装什么软件最好免费
- 如何成为私人电商,如何成为私人电商平台
- 水果代采购小程序源码,水果代购公司网站
- ui毕业设计开发小程序,ui毕业设计开发小程序是什么
- 脏数据php 脏数据的表现形式有哪些?
- oracle数据库清理undo,oracle数据库清理归档日志
- 用什么打开pdf好,pdf用什么打开最好
- 废旧路由器作用是什么,废旧路由器作用是什么意思
- vb.net文件的读取 vbnet fileopen