中南林业科技大学计算方法-解线性方程的直接方法

Gauss

#include<stdio.h>

int main(){
	double a[11][11],b[11],x[11];
	FILE *p;
	if((p=fopen("euq.txt","r"))==NULL){
		printf("file open failed"); 
	}
	for(int m=1;m<=10;m++){
		for(int n=1;n<=10;n++){
			fscanf(p,"%lf",&a[m][n]);
			printf("%.2lf\t",a[m][n]);
		}
		printf("\n");
	}
	printf("\n");
	
	for(int m=1;m<=10;m++){
		fscanf(p,"%lf",&b[m]);
		printf("%.2lf\t",b[m]);
	}
	printf("\n\n");
	
	for(int m=1;m<=9;m++){
		for(int n=m+1;n<=10;n++){
			double ch=a[n][m]/a[m][m];
			for(int i=m;i<=10;i++){
				a[n][i]-=ch*a[m][i];
			}
		}
	}
	
	for(int m=1;m<=10;m++){
		for(int n=1;n<=10;n++){
			printf("%.2lf\t",a[m][n]);
		}
		printf("\n");
	}
	printf("\n");
	
	x[10]=b[10]/a[10][10];
	printf("%.2lf\t",x[10]);
	for(int m=9;m>=1;m--){
		double sum=0;
		for(int n=m+1;n<=10;n++){
			sum+=x[n]*a[m][n]; 
		}
		x[m]=(b[m]-sum)/a[m][m];
		printf("%.2lf\t",x[m]);
	}
	printf("\n");
	
	for(int m=1;m<=10;m++){
		double ans=0;
		for(int n=1;n<=10;n++){
			ans+=a[m][n]*x[n];
		}
		ans-=b[m];
		printf("%lf\t",ans);
	}
} 











平方根

#include<stdio.h>
#include<math.h>
#define num 8	//方程的个数 

int main(){
	double a[num+1][num+1],b[num],c[num][num]={0},x[num],y[num]={0};
	FILE *p;
	if((p=fopen("euq2.txt","rw"))==NULL)
		printf("file open error");
	printf("矩阵a\n");
	for(int m=1;m<=num;m++){
		for(int n=1;n<=num;n++){
			fscanf(p,"%lf",&a[m][n]);
			printf("%.2lf\t",a[m][n]);
		}
		printf("\n");
	} 
	printf("\n矩阵b\n");
	for(int m=1;m<=num;m++){
		fscanf(p,"%lf",&b[m]);
		printf("%.2lf\t",b[m]);
	}
	printf("\n");
	printf("\n");
	for(int i=1;i<=num;i++){
		double sum1=0;
		for(int k=1;k<=i-1;k++){
			sum1+=c[i][k]*c[i][k];
		}
		c[i][i]=sqrt(a[i][i]-sum1);
		for(int j=i+1;j<=num;j++){
			double sum2=0;
			for(int k=1;k<=i-1;k++){
				sum2+=c[j][k]*c[i][k];
			}
			c[j][i]=(a[j][i]-sum2)/c[i][i];
		}
	}
	printf("分解矩阵L\n");
	for(int m=1;m<=num;m++){
		for(int n=1;n<=num;n++){
			printf("%.2lf\t",c[m][n]);
		}
		printf("\n");
	}
	printf("\n");
	
	for(int i=1;i<=num;i++){
		int sum1=0;
		for(int k=1;k<=i-1;k++){
			sum1+=c[i][k]*y[k];
		}
		y[i]=(b[i]-sum1)/c[i][i];
	}
	for(int i=num;i>=1;i--){
		int sum2=0;
		for(int k=i+1;k<=num;k++){
			sum2+=c[k][i]*x[k];
		}
		x[i]=(y[i]-sum2)/c[i][i];
	} 
	printf("方程的解x\n");
	for(int m=1;m<=num;m++){
		printf("%.2lf\t",x[m]);
	}
	printf("\n");
	
	printf("验证\n");
	for(int m=1;m<=num;m++){
		int sum3=0;
		for(int n=1;n<=num;n++){
			sum3+=a[m][n]*x[n];
		}
		printf("%.2lf\t",sum3-b[m]);
	}
} 














zuiganfa

#include<stdio.h>
#define num 10

int main(){
	double A[num+1][num+1],B[num+1],a[num+1],b[num+1],c[num+1]={0},u[num+1],L[num+1],x[num+1],y[num+1];
	FILE *p;
	if((p=fopen("euq3.txt","rw"))==NULL)
		printf("file open error");
	printf("矩阵a\n");
	for(int m=1;m<=num;m++){
		for(int n=1;n<=num;n++){
			fscanf(p,"%lf",&A[m][n]);
			printf("%.2lf\t",A[m][n]);
		}
		printf("\n");
	} 
	printf("\n矩阵b\n");
	for(int m=1;m<=num;m++){
		fscanf(p,"%lf",&B[m]);
		printf("%.2lf\t",B[m]);
	}
	printf("\n");
	printf("\n");
	for(int m=1;m<=num;m++){
		b[m]=A[m][m];
	}
	for(int m=1;m<=num-1;m++){
		c[m]=A[m][m+1];
	}
	for(int m=2;m<=num;m++){
		a[m]=A[m][m-1];
	}
	printf("a,b,c\n");
	for(int m=1;m<=num;m++){
		printf("%.2lf\t%.2lf\t%.2lf\n",a[m],b[m],c[m]);
	}
	L[1]=b[1];
	for(int i;i<=num-1;i++){
		u[i]=c[i]/L[i];
		L[i+1]=b[i+1]-a[i+1]*u[i];
	}
	
	y[1]=B[1]/L[1];
	for(int i=2;i<=num;i++){
		y[i]=(B[i]-a[i]*y[i-1])/L[i];
	}
	
	x[num]=y[num];
	for(int i=num-1;i>=1;i--){
		x[i]=y[i]-u[i]*x[i+1];
	}
	
	printf("\n方程解x:");
	for(int i=1;i<=num;i++){
		printf("%.2lf\t",x[i]);
	}
	printf("\n");
	
	printf("验证:");
	for(int m=1;m<=num;m++){
		double sum=0;
		for(int n=1;n<=num;n++){
			sum+=A[m][n]*x[n];
		}
		printf("%.2lf\t",sum-B[m]);
	}
	
	
}










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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值