《数值分析》用多种方法求解方程组(列主消元法、雅可比迭代、高斯赛德尔迭代法)

问题描述:

用多种方法求解方程组,并列出代码,要有运行界面

方程组如下:

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]);
}

运行界面

在这里插入图片描述

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

石去皿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值