一、实验目的与要求了解Guass列主元消去法及其应用,掌握利用Guass列主元消去法解方程,解决实际问题二、模型求解0.x+0.4y+0.3z+60000=x0.3x+0.1y+0.2z+30000=y0.2x+0.1y+0.2z+50000=z三、源代码:#include <stdio.h>#include <stdlib.h>#include <math.h>#define N 20#define EPS 1.0e-4double a[N][N],b[N],c[N][N],d[N][N];void swap(double &a,double &b)//换行{double temp;temp=a;a=b;a=temp;}void gauss(double a[][N],double b[N],int n)//gauss求解{int i,j,k,l;double temp,m;for(k=0;k<=n-2;k++){temp=fabs(a[k][k]); //选主元l=k;for(i=k+1;i<n;i++){if(fabs(a[i][k]>temp))//fabs为取绝对值函数。
包含在头文件math.h中{temp=fabs(a[i][k]);l=i;}}if(fabs(a[l][k])<EPS){printf("方程有无数组解!");exit(0);}if(l!=k) //换行{for(j=k;j<=n-1;j++)swap(a[l][j],a[k][j]);swap(b[l],b[k]);}for(i=k+1;i<n;i++) //按行进行消元{m=a[i][k]/a[k][k];//行乘数for(j=k;j<n;j++)a[i][j]-=m*a[k][j];b[i]-=m*b[k];}}if(a[n-1][n-1]==0) //矩阵行列式值为0 {printf("矩阵的行列式为0!\n");exit(-1);}b[n-1]/=a[n-1][n-1];for(i=n-2;i>=0;i--){for(j=n-1;j>i;j--)b[i]-=a[i][j]*b[j];b[i]/=a[i][i];}}void main(){int i,j,n;double temp=0.0;printf("请输入要求解的方程数:"); //矩阵维数为n scanf("%d",&n);printf("请输入矩阵a[%d][%d]:\n",n,n);for(i=0;i<n;i++) //系数矩阵a for(j=0;j<n;j++)scanf("%lf",&a[i][j]);printf("请输入矩阵b[%d]:\n",n);for(i=0;i<n;i++) //矩阵b的输入scanf("%lf",&b[i]);gauss(a,b,n); //高斯求解法for(i=0;i<n;i++) //输出结果printf("X%d= %+.4f\n",i+1,b[i]);printf("请输入矩阵c[%d][%d]:\n",n,n);for(i=0;i<n;i++) //系数矩阵c for(j=0;j<n;j++)scanf("%lf",&c[i][j]);for(i=0;i<n;i++)for(j=0;j<n;j++)d[j][i]=c[j][i]*b[i];for(i=0;i<n;i++){for(j=0;j<n;j++)printf("%.4f ",d[i][j]);printf("\n");}}四、实验小结:通过本次实验,对如何利用Guass列主元消去法解决实际问题有了一定的经验。
注:1、报告内的项目或内容设置,可根据实际情况加以调整和补充。
2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。
算法二#define N 200#include "stdio.h"#include "math.h"FILE *fp1,*fp2;void LZ(){int n,i,j,k=0,l;double d,t,t1;static double x[N],a[N][N];fp1=fopen("a1.txt","r");fp2=fopen("b1.txt","w");fscanf(fp1,"%d",&n);for(i=0;i<n;++i)for(j=0;j<=n;++j){fscanf(fp1,"%lf",&a[i][j]);}do{d=a[k][k];l=k;i=k+1;do{if(fabs(a[i][k])>fabs(d)) /*Ñ¡Ö÷Ôª*/{d=a[i][k];l=i;}i++;}while(i<n);if(d==0){printf("\nÊäÈë¶ØÕóÑĞÎó£¡\n");}else{ /*»»ĞĞ*/if(l!=k){for(j=k;j<=n;j++){t=a[l][j];a[l][j]=a[k][j];a[k][j]=t;}}}for(j=k+1;j<=n;j++) /*ÕıÏû*/a[k][j]/=a[k][k];for(i=k+1;i<n;i++)for(j=k+1;j<=n;j++)a[i][j]-=a[i][k]*a[k][j];k++;}while(k<n);if(k!=0){for(i=n-1;i>=0;i--) /*»Ø´ú*/{t1=0;for(j=i+1;j<n;j++)t1+=a[i][j]*x[j];x[i]=a[i][n]-t1;}}for(i=0;i<n;i++)fprintf(fp2,"\n·½³Ì×éµÄ¸ùΪx[%d]=%lf",i+1,x[i]); fclose(fp1);fclose(fp2);}main(){LZ();}#include<stdio.h>#include<math.h>#define N 100//¶¨Óå¶ØÕóµÄ×î´óĞĞint n;//±ìʶ¶ØÕóµÄĞĞ£¬ÁĞ¡£double matix[N][N];//¶ØÕóµÄ×î´óĞĞ£¬×î´óÁв»double unit[N][N];bool findmax(int s)//´Ñsµ´nĞĞÈ¡Òñ×î´óµÄ£¬×÷ΪÉ÷Òª¡£{int i,j,k;double mas,temp;mas=fabs(matix[s][s]);k=s;for(i=s+1;i<n;i++){if(mas<fabs(matix[i][s])) {mas=fabs(matix[i][s]);k=i;} }if(mas==0) return false;//´»»»Á´ĞĞfor(j=0;j<n;j++){temp=matix[s][j];matix[s][j]=matix[k][j];matix[k][j]=temp;temp=unit[s][j];unit[s][j]=unit[k][j];unit[k][j]=temp;}return true;}void chuli(int s){int i,j;double mas=matix[s][s],r;for(i=s+1;i<n;i++){r=matix[i][s]/mas;for(j=0;j<n;j++){matix[i][j]=matix[i][j]-matix[s][j]*r; unit[i][j]=unit[i][j]-unit[s][j]*r;}}}void solve(int s){int i,j;double mas;mas=matix[s][s];for(i=s;i<n;i++)matix[s][i]=matix[s][i]/mas;for(i=0;i<n;i++)unit[s][i]=unit[s][i]/mas;for(i=s-1;i>=0;i--){mas=matix[i][s];matix[i][s]=0;for(j=0;j<n;j++)unit[i][j]=unit[i][j]-mas*unit[s][j]; }}int main(){int i,j;//ÊäÈëscanf("%d",&n);for(i=0;i<n;i++){for(j=0;j<n;j++)if(i==j) unit[i][j]=1;else unit[i][j]=0;scanf("%lf",&matix[i][j]);}}//Êä³ö//ת³ÇÇÏÈı´Æfor(i=0;i<n-1;i++){//ÿһ´Îѡһ¸ö¾ø¶ÔÖµ×î´óµÄÖµ×÷Ϊaii if(findmax(i)){chuli(i);}else{printf("¸Ã¾ØÕ󲻿ÉÄæ");return 0;}}//ת³Éµ¥Î»Õófor(i=n-1;i>=0;i--){solve(i);}//ÆäÄæ¾ØÕóÊÇfor(i=0;i<n;i++){for(j=0;j<n;j++)printf("%.2lf ",unit[i][j]);printf("\n");}return 0;}/************************************************************** ************¸ß˹ÁĞÉ÷ÒªËØÏûÈ¥·¨Æó´â¶ØÕó·´³ÐAX=B,ÆäÉĞAÊÆN*NµÄ¶ØÕó,BÊÆN*M¶ØÕó * ÊäÈë: n----·´ÕóAµÄĞĞÊı* a----¾ØÕóA* m----¶ØÕóBµÄÁĞÊı* b----¾ØÕóB* Êä³ö: det----¶ØÕóAµÄĞĞÁĞʴɵ* a----AÏûÒªºóµÄÇÏÈı´Æ¶ØÕó* b----¾ØÕ󷽳̵ĽâX*************************************************************** ***********/double gaussian_elimination(int n,double a[N][N],int m,double b[N][M]){int i,j,k,mk;double det,mm,f;det = 1.0;for(k = 0;k<n-1;k++) /*Ñ¡Ö÷Ôª²¢ÏûÔª*/{mm=a[k][k];mk = k;for(i=k+1;i<n;i++) /*È¡ÒñµÔKÁĞÖ÷ÔªËØ*/{if(fabs(mm)<fabs(a[k])){mm = a[k];mk = i;}}if(fabs(mm)<EPS)return(0);if(mk!=k) /* ´«µÔKÁĞÉ÷ÒªËØ»»Ğе´¶Ò´ÆÏßÇÏ*/{for(j=k;j<n;j++){f = a[k][j];a[k][j]=a[mk][j];a[mk][j]=f;}for(j=0;j<m;j++){f = b[k][j];b[k][j]=b[mk][j];b[mk][j]=f;}det = -det;}for(i=k+1;i<n;i++) /*´«µÔKÁжҴÆÏßÓÒÏÂÏûҪΪÁã*/ {mm = a[k]/a[k][k];a[k]=0.0;for(j=k+1;j<n;j++)a[j]=a[j]-mm*a[k][j];for(j=0;j<m;j++)b[j]=b[j]-mm*b[k][j];}det = det*a[k][k];}if(fabs(a[k][k])<EPS)return 0;det=det*a[k][k];for(i=0;i<m;i++) /*»Ø´úÇó½â*/{b[n-1]=b[n-1]/a[n-1][n-1];for(j=n-2;j>=0;j--){for(k=j+1;k<n;k++)b[j]=b[j]-a[j][k]*b[k];b[j]=b[j]/a[j][j];}}return(det);}#include<math.h>#include<stdio.h>#define NUMBER 20#define Esc 0x1b#define Enter 0x0dfloat A[NUMBER][NUMBER+1] ,ark;int flag,n;exchange(int r,int k);float max(int k);message();main(){float x[NUMBER]; /*´ËÊı×éÑÃÑÔ´æ·Å·´³Ð´â*/int r,k,i,j;char celect;clrscr();printf("\n\nÑÃGaussÁĞÉ÷ÒªÏûÒª·¨´âÏßĞÒ·´³Ð×é");printf("\n\n1.½â·½³Ì×éÇë°´Enter.");printf("\n\n2.Í˳ö³ÌʽÇë°´Esc.");celect=getch();if(celect==Esc)exit(0);printf("\n\n ÊäÈë·´³Ð×éµÄάÊı£ºn=");scanf("%d",&n);printf(" \n\nÏÉÒÔÊäÈëϵÊı¶ØÕóAºÍÏòÁ¿b:");for(i=1;i<=n;i++){printf("\n\nÇëÊäÈëa%d1--a%d%dϵÊıºÍÏòÁ¿b%d:",i,i,n,i);/*ʵÏÉ´«Ã¿Ó»ĞĞÉеÄϵÊıºÍÏòÁ¿Ó»´ÎĞÒÊäÈ룬ÊıÉ®µäÑÿոñ¸ñ¿ª£¬ÊäÍêºó»Ø³µÈ·¶¨*/for(j=1;j<=n+1;j++) /*´«¸Õ²ÅÊäÈëµÄÊı´æÈëÊı×é*/scanf("%f",&A[i][j]);}for(k=1;k<=n-1;k++){ark=max(k);if(ark==0)/*ÅжϷ´³ÐÊÆ·ñΪÏßĞÒ·´³Ð£¬µ´ÊÆ·ñºÏ·¨*/{printf("\n\n´Ë·½³Ì×é²»ºÏ·¨!");message(); }else if(flag!=k)exchange(flag,k);for(i=k+1;i<=n;i++)for(j=k+1;j<=n+1;j++)A[i][j]=A[i][j]-A[k][j]*A[i][k]/A[k][k];}x[n]=A[n][n+1]/A[n][n];for( k=n-1;k>=1;k--){float me=0;for(j=k+1;j<=n;j++){me=me+A[k][j]*x[j];}x[k]=(A[k][n+1]-me)/A[k][k];}for(i=1;i<=n;i++){printf(" \n\nx%d=%f",i,x[i]);}message();}exchange(int r,int k) /*´»»»ĞеĶغ¯Êı*/ {int i;for(i=1;i<=n+1;i++)A[0][i]=A[r][i];for(i=1;i<=n+1;i++)A[r][i]=A[k][i];for(i=1;i<=n+1;i++)A[k][i]=A[0][i];}float max(int k) /*±ÈУϵÊı´óĞ¡µÄº¯Êı*/{int i;float temp=0;for(i=k;i<=n;i++)if(fabs(A[i][k])>temp){temp=fabs(A[i][k]);flag=i;}return temp;}message()/*ʵÏɲ˵¥È¡ÒñµÄº¯Êı*/{printf("\n\n µÐĞøÒËËã°´ Enter ,Í˳ö³ÐÊ´°´ Esc!"); switch(getch()){case Enter: main();case Esc: exit(0);default:{printf("\n\n²»ºÏ·¨µÄÊäÈë!");message();} }}#include<stdio.h>#include<math.h>#define N 10int main(){int i=0,j=0,r=0,n=0,k=1;float a[N][N],x[N],max=-1,sum1=0,sum2=0;//ÊäÈë¶ØÕóάÊıprintf("Please enter n(0<n<11):\n");scanf("%d",&n);//ÊäÈë¶ØÕóÒªËØ£¬×îºóÓ»ÁĞΪb[]for(i=1;i<=n;i++){for(j=1;j<=n+1;j++){printf("Please enter a[%d][%d]:\n",i,j);scanf("%f",&a[i][j]);}}do{for(i=k;i<=n;i++){if(fabs(a[i][k])>max){max=a[i][k];r=i;}if(a[r][k]==0){printf("Cannot solve!\n");exit(1);}}//»»ĞĞfor(j=1;j<=n+1;j++){sum1=a[k][j];a[k][j]=a[r][j];a[r][j]=sum1;}//´«¶ØÕó»¯ÎªÇÏÈı´Æ¶ØÕófor(i=k+1;i<=n;i++){for(j=k+1;j<=n+1;j++){a[i][j]=a[i][j]-(a[i][k])*(a[k][j])/(a[k][k]);}}k=k+1;max=-1;}while(k<(n-1));//Çóx[]x[n]=(a[n][n+1])/(a[n][n]);for(k=n-1;k>=1;k--){for(j=k+1;j<=n;j++)sum2=sum2+(a[k][j])*(x[j]);x[k]=(a[k][n+1]-sum2)/(a[k][k]);sum2=0;}//Êä³ö½á¹ûfor(i=1;i<=n;i++){printf("%f\n",x[i]);}while(1);return 0;}算法三:用高斯列主元消元法解线性方程组一、课程设计时间2007年9月10日至2007年9月14日,共计1周,20学时。