问题描述:
用多种方法求解方程组,并列出代码,要有运行界面
方程组如下:
a[n][n]={{0.01,2,-0.5},{-1,-0.5,2},{5,-4,0.5}};
b[n]={-5,5,9}
ax=b
列主消元法(解法1)
代码
#include <stdio.h>
#include <stdlib.h>
#include<math.h>
#define n 3
int main()
{
int i,j,k;
int mi;
float mv,tmp;
float a[n][n]={{0.01,2,-0.5},{-1,-0.5,2},{5,-4,0.5}};
float b[n]={-5,5,9},x[n];
for(k=0;k<n-1;k++)
{
mi=k;
mv=fabs(a[k][k]);
for(i=k+1;i<n;i++)
if(fabs(a[i][k])>mv)
{
mi=i;
mv=fabs(a[i][k]);
}//找到迭代后首列最大,把它的序号i,赋值给mi
if(mi>k)
{
tmp=b[k];
b[k]=b[mi];
b[mi]=tmp;
for(j=k;j<n;j++)
{
tmp=a[k][j];
a[k][j]=a[mi][j];
a[mi][j]=tmp;
}
}//令 mi行与k行交换
for(i=k+1;i<n;i++)
{
tmp=a[i][k]/a[k][k];
b[i]=b[i]-b[k]*tmp;
for(j=k+1;j<n;j++)
{
a[i][j]=a[i][j]-a[k][j]*tmp;
}
}//令第k行往下都为〇
}//化为了上三角形,每一行的0的个数递增1,第一行没有〇
printf("输出上三角矩阵为:\n");
for(i=0;i<n;i++){
for(j=0;j<n;j++)
{
if(i>j)
a[i][j]=0;
printf("%4.2f ",a[i][j]);}
printf("%4.2f\n",b[i]);
}
x[n-1]=b[n-1]/a[n-1][n-1];//得到Xn-1的值
for(i=n-2;i>=0;i--)
{
x[i]=b[i];
for(j=i+1;j<n;j++)
x[i]=x[i]-a[i][j]*x[j];
x[i]=x[i]/a[i][i];
}
//依次从后往前算出 x的值,直到x0
printf("\nThe result is:\n");
for(i=0;i<n;i++)
{
printf("\nx%d=%4.2f\n",i,x[i]);
}//输出结果
return 0;
}
运行界面
雅可比迭代(解法2)
代码
#include<stdio.h>
#include<conio.h>
#include<malloc.h>
#include<math.h>
#define EPS 1e-6
#define MAX 100
float*Jacobi(float a[3][4],int n)
{
float *x,*y,epsilon,s;
int i,j,k=0;
x=(float*)malloc(n*sizeof(float));
y=(float*)malloc(n*sizeof(float));
for(i=0;i<n;i++)
x[i]=0;
while(1)
{
epsilon=0;
k++;
for(i=0;i<n;i++)
{
s=0;
for(j=0;j<n;j++)
{
if(j==i)continue;
s+=a[i][j]*x[j];
}
y[i]=(a[i][n]-s)/a[i][i];
epsilon+=fabs(y[i]-x[i]);//一轮误差累加作为判断
}
for(i=0;i<n;i++) x[i]=y[i];
if(epsilon<EPS&&k<MAX)
{
printf("迭代次数为:%d\n",k);
return x;
}
}
}
void main()
{
int i;
float a[3][4]={5,-4,0.5,9,0.01,2,-0.5,-5,-1,-0.5,2,5};
float*x;
x=(float*)malloc(3*sizeof(float));
x=Jacobi(a,3);
for(i=0;i<3;i++)
{printf("x[%d]=%f\n",i,x[i]);
}
getch();
}
运行界面
高斯赛德尔迭代法(解法3)
代码
#include<stdio.h>
#include<math.h>
#define MAX 100
#define n 3
#define exp 0.005
void main()
{
int i,j,k,m;
float temp,s;
float a[n][n]={{5,-4,0.5},{0.01,2,-0.5},{-1,-0.5,2}};
float static b[n]={9,-5,5};
float static x[n]={0,0,0},B[n][n],g[n];
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
B[i][j]=-a[i][j]/a[i][i];
g[i]=b[i]/a[i][i];
}
for(i=0;i<n;i++)
B[i][i]=0;
m=0;
do
{
temp=0;
for(i=0;i<n;i++)
{
s=x[i];
x[i]=g[i];
for(j=0;j<n;j++)
x[i]=x[i]+B[i][j]*x[j];
if(fabs(x[i]-s)>temp)
temp=fabs(x[i]-s); //所有误差中最大值作为判断
}
m++;
printf("\nthe result %d is:",m);
printf("\nx0=%7.5f,x1=%7.5f,x2=%7.5f",x[0],x[1],x[2]);
printf("\ntemp=%f",temp);
}while(temp>=exp);
printf("\n\nThe last result is:");
for(i=0;i<n;i++)
printf("\nx[%d]=%7.5f",i,x[i]);
}