N元通用程序,用四元调用四元方程组:
a[4][5]={4,-1,0,2,-10,-1,4,-1,0,-70,0,-1,4,-1,90,2,0,-1,40,00};
高斯消元法(通用程序):
#include <stdioh>
#include <stdlibh>
#include <mathh>
float ColPivot(float c,int n);
void main()
{
int i,j;
float x;
int n=4;
float a[4][5]={4,-1,0,2,-10,-1,4,-1,0,-70,0,-1,4,-1,90,2,0,-1,40,00};
x=ColPivot(a[0],n);
for (i=0;i<n;i++) printf("x[%d]=%f\n",i,x[i]);
getch();
}
float ColPivot(float c,int n)
{
int i,j,t,k;
float x,p;
x=(float )malloc(nsizeof(float));
for(i=0;i<=n-2;i++)
{
k=i;
for(j=i+1;j<=n-1;j++)
if(fabs((c+j(n+1)+i))>(fabs((c+k(n+1)+i)))) k=j;
if(k!=i)
for(j=i;j<=n;j++)
{
p=(c+i(n+1)+j);
(c+i(n+1)+j)=(c+k(n+1)+j);
(c+k(n+1)+j)=p;
}
for(j=i+1;j<=n-1;j++)
{
p=((c+j(n+1)+i))/((c+i(n+1)+i));
for(t=i;t<=n;t++)
(c+j(n+1)+t)-=p((c+i(n+1)+t));
}
}
for(i=n-1;i>=0;i--)
{
for(j=n-1;j>=i+1;j--)
((c+i(n+1)+n))-=x[j]((c+i(n+1)+j));
x[i]=(c+i(n+1)+n)/((c+i(n+1)+i));
}
return x;
}
-------------------------------------------
高斯赛德尔迭代法(通用程序):
#include <stdioh>
#include <stdlibh>
#include <mathh>
#define N 100
float GauseSeidel(float a,int n)
{
int i,j,nu=0;
float x,dx;
x=(float )malloc(nsizeof(float));
for(i=0;i<=n-1;i++)
x[i]=00;
do {
for(i=0;i<=n-1;i++) {
float d=00;
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("iter divergence\n");
exit(1);
}
nu++;
}
while(fabs(dx)>1e-6);
return x;
}
void main()
{
int i;
float x;
float c[20]={4,-1,0,2,-10,-1,4,-1,0,-70,0,-1,4,-1,90,2,0,-1,40,00};
float GauseSeidel(float ,int);
x=GauseSeidel(c,4);
for(i=0;i<=3;i++)
printf("x[%d]=%f\n",i,x[i]);
getch();
}
#include <stdioh>
#include <stdlibh>
int main(void)
{
int i,j,k,n,m,o,p; //声明一些变量
float a[100][100],c; //
printf("Please input the matrix");
//输入矩阵
printf("\n");
scanf("%d",&n); //输入n
for (i=0;i<=n-1;i++) //正确
for (j=0;j<=n;j++) //错误,数组越界
scanf("%f",&a[i][j]);
//建议补全{}
for (i=0;i<=n-1;i++){ //做i次循环
c=1/a[i][i]; //获取对角线上元素的倒数
for (j=0;j<=n;j++) //将一行中的所有元素都除以对角线上的元素,不幸的是数组越界
a[i][j]=a[i][j]c;
for (k=0;k<=n-1;k++){ //做n次循环
if (k==i) //如果k等于当前行数则跳过
continue;
else //否则
for (j=0;j<=n;j++) //然后做什么我有点晕
a[k][j]=a[k][j]-a[k][i]a[i][j];
}
//这里外面的for必须加{},然后好像是遍历了二维数组,做了个消元,对不对不知道了
}
//最后输出结果,仍然是数组越界,也差{}
m=0;
printf("\n");
for (i=0;i<=n-1;i++)
for (j=0;j<=n;j++){
m++;
if (m%4==0){
printf("%20f ",a[i][j]);
printf("\n");
}
else
printf("%20f ",a[i][j]);
}
//当然这里并不会真的越界,但是用的越界了
return 0;
}
void gaussj(double a[], int n, double b[])
{
int i,j,k,l,ll,irow,icol;
double big,pivinv,dum;
int ipiv[50], indxr[50], indxc[50];
for (j=0;j<=n-1;j++)
{
ipiv[j]=0;
}
for (i=0;i<=n-1;i++)
{
big=00;
for (j=0;j<=n-1;j++)
{
if(ipiv[j]!=1)
{
for(k=0;k<=n-1;k++)
{
if(ipiv[k]==0)
{
if(fabs(a[jn+k])>=big)
{
big=fabs(a[jn+k]);
irow=j;
icol=k;
}
else if(ipiv[k]>1)
{
cout<<"singular matrix";
}
}
}
}
}
ipiv[icol]=ipiv[icol]+1;
if(irow!=icol)
{
for(l=0;l<=n-1;l++)
{
dum=(a[irown+l]);
a[irown+l]=a[icoln+l];
a[icoln+l]=dum;
}
dum=b[irow];
b[irow]=b[icol];
b[icol]=dum;
}
indxr[i]=irow;
indxc[i]=icol;
if(a[icoln+icol]==00)
{
cout<< "singular matrix";
}
pivinv=10/(a[icoln+icol]);
a[icoln+icol]=10;
for(l=0;l<=n-1;l++)
{
a[icoln+l]=a[icoln+l]pivinv;
}
b[icol]=b[icol]pivinv;
for(ll=0;ll<=n-1;ll++)
{
if(ll!=icol)
{
dum=a[lln+icol];
a[lln+icol]=00;
for(l=0;l<=n-1;l++)
{
a[lln+l]=a[lln+l]-a[icoln+l]dum;
}
b[ll]=b[ll]-b[icol]dum;
}
}
}
for(l=n-1;l<=0;l--)
{
if(indxr[l]!=indxc[l])
{
for(k=0;k<=n-1;k++)
{
dum=a[kn+indxr[l]];
a[kn+indxr[l]]=a[kn+indxc[l]];
a[kn+indxr[l]]=dum;
}
}
}
}
以上就是关于用无回代的高斯消元法和简单迭代法 解四元一次方程组全部的内容,包括:用无回代的高斯消元法和简单迭代法 解四元一次方程组、c语言 高斯乔丹消元法 帮忙看下代码有什么问题、【编程求助】用c语言或者c++编程,实现用高斯消元法求解线性方程组Ax=b。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)