高斯消去法和列主元高斯消去法解线性方程组的程序(C语言)

合集下载

高斯消去法和列主元高斯消去法解线性方程组的程序(C语言)精品资料

高斯消去法和列主元高斯消去法解线性方程组的程序(C语言)精品资料
高斯消去法和列主元高斯消去法解线性方程组的程序(C语言)
//Gauss消去法解线性方程组
//参考教材《计算方法教程》第二版,西安交通大学出版社
#include<stdio.h>
int main(void)
{
float A[7][7]={{3,-5,6,4,-2,-3,8},
{1,1,-9,15,1,-9 ,2},
for(k=0;k<size-1;k++)
{
max=fabs(A[k][k]);
col=k;
//查找最大元素所在的行
for(i=k;i<size;i++)
{
if(max<fabs(A[i][k]))
{
max=fabs(A[i][k]);
col=i;
}
}
printf("col:%d\n",col);
for(j=k;j<size;j++)
printf("\n\n");
//消去过程
for(k=0;k<size-1;k++)
{
if(!A[k][k])
return -1;
for(i=k+1;i<size;i++)
{
Aik=A[i][k]/A[k][k];
for(j=k;j<size;j++)
{
A[i][j]=A[i][j]-Aik*A[k][j];
{
A[i][j]=A[i][j]-Aik*A[k][j];
}
b[i]=b[i]-Aik*b[k];
}

高斯消去法和列主元高斯消去法解线性方程组的程序(C语言)

高斯消去法和列主元高斯消去法解线性方程组的程序(C语言)

//Gauss消去法解线性方程组//参考教材《计算方法教程》第二版,西安交通大学出版社#include<stdio.h>int main(void){float A[7][7]={{3,-5,6,4,-2,-3,8},{1,1,-9,15,1,-9 ,2},{2,-1,7,5,-1,6,11},{-1,1,3,2,7,-1,-2},{4,3,1,-7,2,1,1},{2,9,-8,11,-1,-4,-1},{7,2,-1, 2,7,-1,9}};float b[7]={11,2,29,9,5,8,25};float x[7]={0};float Aik,S;int i,j,k;int size=7;printf("A[][]\n");for(i=0;i<size;i++){for(j=0;j<size;j++)printf("%f ",A[i][j]);printf("\n");}printf("b[]\n");for(i=0;i<size;i++)printf("%f ",b[i]);printf("\n\n");//消去过程for(k=0;k<size-1;k++){if(!A[k][k])return -1;for(i=k+1;i<size;i++){Aik=A[i][k]/A[k][k];for(j=k;j<size;j++){A[i][j]=A[i][j]-Aik*A[k][j];}b[i]=b[i]-Aik*b[k];}}//消去的结果printf("A[]\n");for(i=0;i<size;i++){for(j=0;j<size;j++)printf("%f ",A[i][j]);printf("\n");}printf("b[]\n");for(i=0;i<size;i++)printf("%f ",b[i]);printf("\n\n");//回代过程x[size-1]=b[size-1]/A[size-1][size-1];for(k=size-2;k>=0;k--){S=b[k];for(j=k+1;j<size;j++){S=S-A[k][j]*x[j];}x[k]=S/A[k][k];}//solutionprintf("The solution x[]=\n");for(i=0;i<size;i++)printf("%f ",x[i]);return 0;}/列主元Gauss消去法解线性方程组//参考教材《计算方法教程》第二版,西安交通大学出版社#include<stdio.h>#include<math.h>int main(void){float A[7][7]={{3,-5,6,4,-2,-3,8},{1,1,-9,15,1,-9 ,2},{2,-1,7,5,-1,6,11},{-1,1,3,2,7,-1,-2},{4,3,1,-7,2,1,1},{2,9,-8,11,-1,-4,-1},{7,2,-1, 2,7,-1,9}}; float b[7]={11,2,29,9,5,8,25};float x[7]={0};float Aik,S,temp;int i,j,k;float max;//列主元的绝对值int col;//列主元所在的行int size=7;printf("A[][]\n");for(i=0;i<size;i++){for(j=0;j<size;j++)printf("%f ",A[i][j]);printf("\n");}printf("b[]\n");for(i=0;i<size;i++)printf("%f ",b[i]);printf("\n\n");//-------消去过程---------for(k=0;k<size-1;k++){max=fabs(A[k][k]);col=k;//查找最大元素所在的行for(i=k;i<size;i++){if(max<fabs(A[i][k])){max=fabs(A[i][k]);col=i;}}printf("col:%d\n",col);for(j=k;j<size;j++){temp=A[col][j];A[col][j]=A[k][j];A[k][j]=temp;}temp=b[col];b[col]=b[k];b[k]=temp;if(!A[k][k])return -1;for(i=k+1;i<size;i++){Aik=A[i][k]/A[k][k];for(j=k;j<size;j++){A[i][j]=A[i][j]-Aik*A[k][j];}b[i]=b[i]-Aik*b[k];}}//消去的结果printf("A[]\n");for(i=0;i<size;i++){for(j=0;j<size;j++)printf("%f ",A[i][j]);printf("\n");}printf("b[]\n");for(i=0;i<size;i++)printf("%f ",b[i]);printf("\n\n");//回代过程x[size-1]=b[size-1]/A[size-1][size-1]; for(k=size-2;k>=0;k--){S=b[k];for(j=k+1;j<size;j++){S=S-A[k][j]*x[j];}x[k]=S/A[k][k];}//solutionprintf("The solution x[]=\n");for(i=0;i<size;i++)printf("%f ",x[i]);return 0;}。

高斯列主元消去法解线性方程组VC++课程设计报告

高斯列主元消去法解线性方程组VC++课程设计报告

课程设计报告一.课程设计目的:采用高斯列主元消去法解线性方程组。

用C 语言或C ++设计一个程序来通过高斯列主元消去法解线性方程组AX=b 的解。

二.课程设计的内容1. 课程设计的题目及简介题目:高斯列主元消去法解线性方程组。

简介:对线性方程组AX =b 等价于⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡⋅⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡n n nn n n n n b b b x x x a a a a a a a a a 2121212222111211方法说明(以4阶为例):(1)第1步消元——在增广矩阵(A ,b )第一列中找到绝对值最大的元素,将其所在行与第一行交换,再对(A ,b )做初等行变换使原方程组的第一列元素除了第一行的全变为0;(2)第2步消元——在增广矩阵(A ,b )中的第二列中(从第二行开始)找到绝对值最大的元素,将其所在行与第二行交换,再对(A ,b )做初等行变换使原方程组转化为: ⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡⋅⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡******00**00***0****4321x x x x 注:*代表非零的数。

(3)第3步消元——在增广矩阵(A ,b )中的第三列中(从第三行开始)找到绝对值最大的元素,将其所在行与第二行交换,再对(A ,b )做初等行变换使原方程组转化为: ⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡⋅⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡*****000**00***0****4321x x x x(4)按x4 → x3→ x2→ x1 的顺序回代求解出方程组的解。

此方法即高斯列主元消去法,若在变换的过程中没有选出绝对值最大的数放在最前面进行消元而求出未知数的方法就叫高斯消去法。

高斯消去法有一很明显的缺点,即在消元的过程中可能出现小主元,这种小主元可能导致解的不稳定,为了避免小主元的出现正是高斯列主元消去法的主要目的。

而通过每次消元之前的调换方程的次序也正是计算机实现高斯列主元消去法的关键。

列主元高斯消元法的C语言编程

列主元高斯消元法的C语言编程
列主元高斯消元法
基本思想:用高斯消元法求解线性方程组时,为避免小的主元,在进行第 k 步消元前,应该在第 k 列 元素 aik (i k , , n ) 中找出第一个出现的绝对值最大者, 例如 | aik k | max | aik | , 再把第 ik 个方程与第 k
k ≤i≤n (k ) (k ) (k )
x[k-1]=0.0; for(j=k+1;j<=n;j++) x[k-1]+=A[k-1][j-1]*x[j-1]; x[k-1]=(A[k-1][n]-x[k-1])/A[k-1][k-1]; } //在屏幕上输出结果 for(i=0;i<=n-1;i++) printf("%f\n",x[i]); } void main() { double A[N][N+1]={{0,2,-0.1,7,76.2},{6,0,3,-5,15},{3,1,2,5,86},{2,4,1,0,48}}; double x[N]={0}; Gause_pivot(N,A,x); }
个方程进行交换,使 aik k 成为主元。我们称这个过程为选主元。由于只在第 k 列元素中选主元,通常也称 为按列编程
列主元高斯消元法的 C 语言程序代码如下: #include<stdio.h> #include<math.h> #include<iostream.h> #define N 4 void Gause_pivot(int n,double A[N][N+1],double x[]) { //高斯消元 int i,j,k; for(k=1;k<=n-1;k++) { //选主元 int ii,jj,kk,row; double max,temp; ii=1;kk=k; max=A[ii-1+(kk-1)][kk-1]; for(jj=ii+1;jj<=n;jj++) { if (fabs(A[jj-1+(kk-1)][kk-1])>fabs(max)) { max=A[jj-1+(kk-1)][kk-1]; row=jj+(kk-1); } } for(ii=1;ii<=n+1;ii++) { temp=A[kk-1][ii-1]; A[kk-1][ii-1]=A[row-1][ii-1]; A[row-1][ii-1]=temp; } for(i=k+1;i<=n;i++) for(j=k+1;j<=n+1;j++) A[i-1][j-1]-=A[k-1][j-1]*A[i-1][k-1]/A[k-1][k-1]; } //回代求解 x[n-1]=A[n-1][n]/A[n-1][n-1]; for(k=n-1;k>=1;k--) {

列主元高斯消去法算法流程图讲解

列主元高斯消去法算法流程图讲解

列主元高斯消去法算法流程图讲解下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。

文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor.I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!深入理解:列主元高斯消去法的算法流程图列主元高斯消去法,也称为部分主元高斯消去法,是一种在线性代数中用于解线性方程组的数值方法。

高斯方法解线性方程组c程序

高斯方法解线性方程组c程序

高斯消去法和高斯主元消去法解线性方程组:高斯消元法:#include<stdio.h>#include<math.h>main(){int gauss(int n,double a[],double b[]); int i;double a[3][3]={{3,-1,4},{-1,2,-2},{2,-3,-2}}; double b[3]={7,-1,0};if(gauss(3,&a[0][0],b)!=0)for(i=0;i<=2;i++)printf("\nx[%d]=%f\n",i,b[i]);}int gauss(int n,double a[],double b[]) {int i,k,j,p,q;double d,t;for(k=0;k<=n-2;k++){d=a[k*n+k];if(d==0)return(0);for(j=k+1;j<=n-1;j++){p=k*n+j;a[p]=a[p]/d;}b[k]=b[k]/d;for(i=k+1;i<=n-1;i++){for(j=k+1;j<=n-1;j++){p=i*n+j;a[p]=a[p]-a[i*n+k]*a[k*n+j];}b[i]=b[i]-a[i*n+k]*b[k];}}d=a[(n-1)*n+n-1];if(fabs(d)+1.0==1.0){printf("fail\n");return(0);}b[n-1]=b[n-1]/d;for(k=n-2;k>=0;k--){t=0.0;for(j=k+1;j<=n-1;j++)t=t+a[k*n+j]*b[j];b[k]=b[k]-t;}return (1);}⎪⎩⎪⎨⎧=---=-+-=+-0232122743321321321x x x x x x x x x结果:x1=2,x2=1,x3=0.5高斯全选主元法:#include<stdio.h>#include<math.h>#include<stdlib.h>main(){int gauss(int n,double a[],double b[]);int i;double a[3][3]={{3,-1,4},{-1,2,-2},{2,-3,-2}}; double b[3]={7,-1,0};if(gauss(3,&a[0][0],b)!=0)for(i=0;i<=2;i++)printf("\nx[%d]=%f\n",i,b[i]);}int gauss(int n,double a[],double b[]){int *js,i,j,L,k,is,p,q;double d,t;js=malloc(n*sizeof(int));L=1;for(k=0;k<=n-2;k++){d=0.0;for(i=k;i<=n-1;i++)for(j=k;j<=n-1;j++){t=fabs(a[i*n+j]);if(t>d){d=t;is=i;js[k]=j;}}if(d+1.0==1.0)L=0;else{if(js[k]!=k)for(i=0;i<=n-1;i++){p=i*n+k;q=i*n+js[k];t=a[p];a[p]=a[q];a[q]=t;}if(is!=k){for(j=k;j<=n-1;j++){p=k*n+j;q=is*n+j;t=a[p];a[p]=a[q];a[q]=t;}t=b[k];b[k]=b[is];b[is]=t;}}if(L==0){free(js);printf("fail\n");return(0);}d=a[k*n+k];for(j=k+1;j<=n-1;j++){p=k*n+j;a[p]=a[p]/d;}b[k]=b[k]/d;for(i=k+1;i<=n-1;i++){for(j=k+1;j<=n-1;j++){p=i*n+j;a[p]=a[p]-a[i*n+k]*a[k*n+j];}b[i]=b[i]-a[i*n+k]*b[k];}}d=a[(n-1)*n+n-1];if(fabs(d)+1.0==1.0){free(js);printf("fail\n");return(0);}b[n-1]=b[n-1]/d;for(i=n-2;i>=0;i--){t=0.0;for(j=i+1;j<=n-1;j++)t=t+a[i*n+j]*b[j];b[i]=b[i]-t;}js[n-1]=n-1;for(k=n-1;k>=0;k--)if(js[k]!=k){t=b[k];b[k]=b[js[k]];b[js[k]]=t;} free(js);return(1);}结果:x1=2,x2=1,x3=0.5。

高斯消元解线性方程组(c语言)

高斯消元解线性方程组(c语言)

⾼斯消元解线性⽅程组(c语⾔)warning:有bug待修今天的线性代数课学了⾼斯消元解线性⽅程组,感觉很有意思,于是写了⼀个c语⾔⼩程序,功能如下:1.把输⼊的矩阵经过初等变换,变成⾏阶梯形矩阵2.判断⽅程组解的情况3.如果有唯⼀解,输出⽅程组的解实现的思路是枚举每⼀列,第i列从a[i+1][i]到a[m][i]依次⽤第i⾏消去。

1 #include <stdio.h>2double a[21][21], x[21];3int m, n;45void print() {6 printf("\n------->\n");7for (int i = 1; i <= m; i++) {8for (int j = 1; j <= n; j++) printf("%.2lf ", a[i][j]);9 printf("\n");10 }11 }1213void work() {14 print();15for (int j = 1; j <= n - 1; j++) { //从第⼀列到第n-1列16for (int i = j + 1; i <= m; i++) { //从第j+1⾏到第m⾏17if (a[j][i] == 0) continue;18double t = - a[i][j] / a[j][j];19for (int k = j; k <= n; k++) a[i][k] += a[j][k] * t;20 }21 print();22 }23 printf("\n----------已化为阶梯型矩阵----------\n\n");24//判断是否有解25for (int i = 1; i <= m; i++) {26int flag = 0;27for (int j = 1; j <= n - 1; j++) {28if (a[i][j] != 0) flag = 1;29 }30if (flag == 1 && a[i][n] == 0) {31 printf("⽅程组⽆解\n");32return;33 }34 }35//判断是否有⽆穷多解36if (m < n - 1) {37 printf("⽅程组有⽆穷多组解\n");38return;39 }40else for (int i = 1; i <= m; i++) {41if (a[i][i] == 0) {42 printf("⽅程组有⽆穷多组解\n");43return;44 }45 }46//求解⽅程47 printf("⽅程组有唯⼀解:\n");48for (int i = m; i >= 1; i--) {49 x[i] = a[i][n];50for (int j = i + 1; j <= n - 1; j++) x[i] -= a[i][j] * x[j];51 x[i] /= a[i][i];52 }53for (int i = 1; i <= n - 1; i++) printf("x%d = %.2lf\n", i, x[i]);54 }555657int main() {58 printf("请输⼊增⼴矩阵的⾏数和列数:\n");59 scanf("%d%d", &m, &n);60 printf("请输⼊整个增⼴矩阵:\n");61for (int i = 1; i <= m; i++)62for (int j = 1; j <= n; j++)63 scanf("%lf", &a[i][j]);64 work();65return0;66 }运⾏⽰例。

列主元高斯消元法的C语言编程及列管式换热器设计

列主元高斯消元法的C语言编程及列管式换热器设计

列主元高斯消元法的C语言编程及列管式换热器设计主元高斯消元法(Gaussian Elimination)是一种线性代数中常用的求解线性方程组的方法。

它可以被用于列管式换热器的设计中,来计算热交换器的换热性能。

下面是用C语言实现主元高斯消元法的代码:```c#include <stdio.h>#include <stdlib.h>#define SIZE 10void swapRow(double matrix[SIZE][SIZE], int row1, int row2, int n)for(int i = 0; i <= n; i++)double temp = matrix[row1][i];matrix[row1][i] = matrix[row2][i];matrix[row2][i] = temp;}void printMatrix(double matrix[SIZE][SIZE], int n)for(int i = 0; i < n; i++)for(int j = 0; j <= n; j++)printf("%lf ", matrix[i][j]);}printf("\n");}void gaussianElimination(double matrix[SIZE][SIZE], int n) for(int i = 0; i < n; i++)//列中绝对值最大的元素int maxRow = i;for(int j = i + 1; j < n; j++)if(abs(matrix[j][i]) > abs(matrix[maxRow][i]))maxRow = j;}}//交换行swapRow(matrix, i, maxRow, n);//消元for(int j = i + 1; j < n; j++)double factor = matrix[j][i] / matrix[i][i];for(int k = i; k <= n; k++)matrix[j][k] = matrix[j][k] - factor * matrix[i][k];}}}void backSubstitution(double matrix[SIZE][SIZE], double solution[SIZE], int n)for(int i = n - 1; i >= 0; i--)solution[i] = matrix[i][n];for(int j = i + 1; j < n; j++)solution[i] -= matrix[i][j] * solution[j];}solution[i] /= matrix[i][i];}int maiint n;printf("请输入未知数的个数:");scanf("%d", &n);double matrix[SIZE][SIZE];double solution[SIZE];//输入方程组的系数矩阵和常数列printf("请输入方程组的系数矩阵和常数列(以空格分隔):\n"); for(int i = 0; i < n; i++)for(int j = 0; j <= n; j++)scanf("%lf", &matrix[i][j]);}}//打印输入的矩阵printf("输入的矩阵为:\n");printMatrix(matrix, n);//利用高斯消元法求解方程组gaussianElimination(matrix, n);//利用回代法求解解向量backSubstitution(matrix, solution, n);//打印解向量printf("解向量为:\n");for(int i = 0; i < n; i++)printf("x%d = %lf\n", i+1, solution[i]);}return 0;```上述代码实现了主元高斯消元法的求解过程,通过键盘输入方程组的系数矩阵和常数列,然后计算出解向量。

Gauss消去法和列主元消去法

Gauss消去法和列主元消去法
while s<=n
max=abs(C(s,s));big=0;
if det(C(s:n,s:n))==0
disp('此方程无解');
answer=0;
break;
end
for i=s:n
if max<abs(C(i,s))
max=abs(C(i,s));
k=i;
big=1;
else continue
for i=n:(-1):1
X(i,1)=C(i,n+1);
for j=(i+1):n
X(i,1)=X(i,1)-E(i,j)*X(j,1);
end
X(i,1)=X(i,1)/E(i,i);
ห้องสมุดไป่ตู้end
disp('此方程的解为:')
X
end
5、实验结果
请输入未知数系数矩阵A:
A=[2,-1,3;4,2,5;1,2,0]
3、实验原理
高斯列主元消去法
4、实验内容
clc;clear;format short
disp('请输入未知数系数矩阵A:');
A=input('A=');
disp('请输入常数项列向量B:');
B=input('B=');
C=[A,B];
[m,n]=size(A);
s=1;answer=1;P=zeros(1,n);L=zeros(n);I=eye(n);
y=a(i,k:n+1);a(i,k:n+1)=a(k,k:n+1);a(k,k:n+1)=y;
break;

高斯消去法C语言程序

高斯消去法C语言程序

高斯消去法C语言程序XYYZ 2006年4月9日#include <stdio.h>#include <math.h>#define N 4void main(){int k,i,j,ii=0,jj=0,z[N],tt;double a[N][N],b[N],sum,x[N],y[N],sp,t;printf("请输入原始增广矩阵(按行输入):\n");for(i=0;i<N;i++){for(j=0;j<N;j++)scanf("%lf",&a[i][j]);scanf("%lf",&b[i]);}printf("你输入的原始增广矩阵为:\n");for(i=0;i<N;i++)z[i]=i;for(i=0;i<N;i++){for(j=0;j<N;j++)printf("%f ",a[i][j]);printf("%f\n",b[i]);}printf("\n");for(k=0;k<N-1;k++){ii=k;jj=k;for(i=k;i<N;i++)for(j=k;j<N;j++)if(fabs(a[ii][jj])<fabs(a[i][j])){ii=i;jj=j;}if(a[ii][jj]==0)break;if(ii!=k)for(j=k;j<N;j++){t=0;t=a[ii][j];a[ii][j]=a[k][j];a[k][j]=t;} {t=0;t=b[ii];b[ii]=b[k];b[k]=t;}if(jj!=k)for(i=0;i<N;i++){t=0;t=a[i][jj];a[i][jj]=a[i][k];a[i][k]=t;}{tt=0;tt=z[jj];z[jj]=z[k];z[k]=tt;}for(i=k+1;i<N;i++) /*消元过程*/ {sp=a[i][k]/a[k][k];for(j=k;j<N;j++)a[i][j]=a[i][j]-a[k][j]*sp;b[i]=b[i]-b[k]*sp;}printf("第%d次消元后的结果\n",k+1);for(i=0;i<N;i++){for(j=0;j<N;j++)printf("%f ",a[i][j]);printf("%f\n",b[i]);}printf("\n");}y[N-1]=b[N-1]/a[N-1][N-1]; /*回代过程*/ for(k=N-2;k>=0;k--){sum=0;for(j=k+1;j<N;j++)sum=sum+a[k][j]*y[j];y[k]=(b[k]-sum)/a[k][k];}for(i=0;i<N;i++)printf("z[%d]=%d ",i,z[i]);printf("\n");for(i=0;i<N;i++)x[z[i]]=y[i];for(i=0;i<N;i++)printf("y[%d]=%f ",i,y[i]); printf("\n");for(i=0;i<N;i++)printf("x[%d]=%f ",i,x[i]); printf("\n");}#include<stdio.h>#include <math.h>#define N 20int main(){ int n,i,j,k;int mi,tmp,mx;float a[N][N],b[N],x[N];printf("\nInput n:");scanf("%d",&n);if(n>N){ printf("The input n should in(0,N)!\n");getch();return 1;}if(n<=0){ printf("The input n should in(0,N)!\n");getch();return 1;}printf("Now input a(i,j),i,j=0...%d:\n",n-1); for(i=0;i<n;i++){ for(j=0;j<n;j++)scanf("%f",&a[i][j]);}printf("Now input b(i),i,j=0...%d:\n",n-1); for(i=0;i<n;i++)scanf("%f",&b[i]);for(i=0;i<n-2;i++){ for(j=i+1,mi=i,mx=fabs(a[i][j]);j<n-1;j++) if(fabs(a[j][i])>mx){ mi=j;mx=fabs(a[j][i]);}if(i<mi){ tmp=b[i];b[i]=b[mi];b[mi]=tmp;for(j=i;j<n;j++){ tmp=a[i][j];a[i][j]=a[mi][j];a[mi][j]=tmp;}}for(j=i+1;j<n;j++){ tmp=-a[j][i]/a[i][i];b[j]+=b[i]*tmp;for(k=i;k<n;k++)a[j][k]+=a[i][k]*tmp;}}x[n-1]=b[n-1]/a[n-1][n-1];for(i=n-2;i>=0;i--){ x[i]=b[i];for(j=i+1;j<n;j++)x[i]-=a[i][j]*x[j];x[i]/=a[i][i];}for(i=0;i<n;i++)printf("Answer:\n x[%d]=%f\n",i,x[i]); getch();return 0;}#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\nUse Gauss.");printf("\n\n1.Jie please press Enter.");printf("\n\n2.Exit press Esc.");celect=getch();if(celect==Esc)exit(0);printf("\n\n input n=");scanf("%d",&n);printf(" \n\nInput matrix A and B:");for(i=1;i<=n;i++){printf("\n\nInput a%d1--a%d%d and 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\nIt's wrong!");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;{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;。

解线性方程组-高斯消去法列主元

解线性方程组-高斯消去法列主元

的数作主元 arkk1

max
kin
aikk
1
,然后将第 r 行和第 k 行交换(如 r k )。从而在计算 lik 时保证了被除
数的绝对值大于等于除数的绝对值。
实际计算时,当最大的 arkk1 很小时,求解结果同样会严重失真,则求解过程应当停止。设 0是某个 很小的数,当 arkk1 时,过程应该停止,此时已不是算法的问题,而是方程组本身的问题了。
x3 5 1 5 , x2 3 3x3 3 3 35 3 4 , x1 7 x2 x3 2 7 4 5 2 1
此方法就是高斯消去法。
计算流程
记初始方程组 Ax b 为 A0 x b0 。
k 1,即消去第 2 到第 n 个方程中的 x1 ,假定 a110 0 , 目标
a110 a120
是:
A

a201
a202

an01 an02
a1n0
b10

a110 a120
a20n
b20


0
a212

对于j k 1, , n 做 aijk aijk1 lik akkj 1
bik bik1 lik bkk1
直到 k n 1时,消元过程结束, An1 成为上三角矩阵,最后一个方程成为一元一次方程(只含 xn ),
第一步,消元过程: 对增广矩阵进行消元,
7b 11ຫໍສະໝຸດ , 0 x1
x


x2


x3
2
A b 4
1
1 5 1
1 1 1

C++课程设计高斯消元法求线性代数方程组的解

C++课程设计高斯消元法求线性代数方程组的解

C++课程设计高斯消元法求线性代数方程组的解第一篇:C++课程设计高斯消元法求线性代数方程组的解河北工业大学计算机软件技术基础(VC)课程设计报告学院管理班级管理104班姓名杨立宝 __ 学号 101707____ 成绩 __ ____一、题目:求线性代数方程组的解(高斯消去法)(C13)二、设计思路1、总体设计1)分析程序的功能第一:编写输入程序,通过键盘先输入对应的已知量及函数的大小n和系数a[i]和得数b[i]。

第二:编写中间程序,通过函数的调用先定义线性代数方程,然后通过程序求出方程的梯形矩阵系数,并最终得出结果。

第三编写输出程序,输出最终结果。

2)系统总体结构:设计程序的组成模块,简述各模块功能。

模块一:各函数的具体内容A:三个输入函数,分别输入n,一维数组,二维数组。

即输入已知量。

B:中间运算函数,计算是使得方程系数所成的矩阵成梯形矩阵,未知数的结果。

即计算中间变量及结果。

C:最后输出函数,输出最后计算结果。

模块二:各函数原型的声明 a写头文件。

b变量声明:存放输入数据的数组的声明,存放中间变量的数组的声明,存放运算结果的数组的声明。

分别存放对应数据。

c输入有关操作的文字d函数调用,在运算中自动调用对应的函数解决对应问题。

模块三:主函数2、各功能模块的设计:说明各功能模块的实现方法模块一:各个函数的声明,直接声明。

模块二:各函数都通过for循环来实现各个数组之间的基本运算。

3、设计中的主要困难及解决方案在这部分论述设计中遇到的主要困难及解决方案。

1)困难1 函数调用是怎么用?解决方案:仔细阅读课本,以及同学之间的讨论,和老师的帮助。

4、你所设计的程序最终完成的功能1)说明你编制的程序能完成的功能输入线性代数的系数后,运行程序即可得到梯形矩阵和结果。

2)准备的测试数据及运行结果三、程序清单如果是使用一个文件完成的程序,只需列出程序代码。

如果是使用多文件完成的程序,首先说明程序中的代码存放在哪些文件中,说明文件名(例如:本程序包含first.cpp、second.cpp、third.cpp和all.h四个文件);然后依次给出每个文件名及该文件清单,例如:#include const N= 10;//设定矩阵大小范围 /* * 使用已经求出的x,向前计算x(供getx()调用)* double a[][] 系数矩阵 * double x[] 方程组解 * int i 解的序号 * int n 矩阵大小 * return 公式中需要的和 */ double getm(double a[N][N], double x[N], int i, int n){ double m = 0;int r;for(r=i+1;rresult = double(b[n-1]/a[n-1][n-1]);else //计算其他x值(对于公式中的求和部分,需要调用getm()函数)result = double((b[i]-getm(a,x,i,n))/a[i][i]);return result;} void main(){ //double a[N][N] = {{2},{1,3,2},{1,2,2}};//double b[N] = {4,6,5};double a[N][N];//系数矩阵 double b[N];//右端项 double x[N];//方程组解 int i,j,k;int n=N;//矩阵大小/*用户手工输入矩阵*/ cout<>n;cout<>a[i][j];} cout<>b[i];} /*显示原始矩阵*/ cout</*进行高斯消去*/ for(j=0;j/*显示处理后矩阵*/ cout</*回代方式解方程组*/ for(i=n-1;i>=0;i--){ x[i] = getx(a,b,x,i,n);} /*显示方程组解*/ cout<四、对该设计题目有何更完善的方案1、对自己完成程序进行自我评价。

高斯列主消元法求解方程 c语言程序报告

高斯列主消元法求解方程  c语言程序报告

HUNAN UNIVERSITY 程序设计训练报告专业班级材料科学与工程四班指导老师院长 (系主任)2012 年6 月30 日目录1 软件开发平台 (1)2 软件功能说明 (1)2.1 功能分析说明 (1)2.2 功能说明图 (4)3 软件设计详细内容 (5)3.1 采用的主要数据结构类型 (5)3.2 流程图 (5)4 软件测试 (11)4.1 软件测试用例 (11)4.2 软件测试报告 (16)5 总结和致谢 (16)6 附录 (17)6.1 源码 (17)6.2 二人分工说明 (22)6.3 参考文献 (22)1软件开发平台Visul C++ 6.02软件功能说明用高斯列主消元法求解方程个数不超过15个的线性方程组2.1 功能分析说明线性方程组可以表示为以下形式:通解于:方程等价于AX=b对其增广矩阵进行初等行换不改变方程组的解,从而将其化为简单形式来求解方程组。

|A|= (-1)21(j j t)3jn j a11j a22j…a njn&calculate(intn,int m)功能:quanpailie_A()功能: 计算一个全排列(-1)21(j j t )3jn j a 11j a 22j …a njn 的值gauss_row_xiaoqu()功能: 将增广矩阵通过交换两行的方法使得第一列中a 11绝对值最大第二行各元素分别减去第一行对应元素的a 21/a 11倍,使得a 21化为零; 第三行各元素分别减去第一行对应元素的a 31/a 11倍,使得a 31化为零; 同理将a 31,a 41…a 1n 都化为零;通过交换两行的方法使得第一列中a 22绝对值最大第三行各元素分别减去第二行对应元素的a 32/a 22倍,使得a 32化为零; 第四行各元素分别减去第二行对应元素的a 42/a 22倍,使得a 42化为零; 同理将a 32,a 42…a 2n 都化为零;以此类推,可将主对角线下的元素全化为零,变为上三角矩阵。

高斯列主元消去法解线性方程组

高斯列主元消去法解线性方程组

高斯列主元消去法解线性方程组c语言编写的源程序:#include <stdio.h>#include<math.h>int n;float a[100][100],b[100];void output (){int i,j;printf("the array a,b is\n");for (i=0;i<n;i++){ for (j=0;j<n;j++)printf("%-10f",a[i][j]);printf("%-10f",b[i]);printf("\n");}}void input(){int i,j;printf("input sting a ");scanf("%d",&n);printf("input array a:\n");for(i=0;i<n;i++)for(j=0;j<n;j++){scanf("%f",&a[i][j]);}printf("input array b:\n");for(i=0;i<n;i++)scanf("%f",&b[i]);}void gaosi (){ int k,i,j,max;float ta,tb,m;for(k=0;k<n;k++){max=k;for(i=k+1;i<n;i++){if(fabs(a[i][k])>fabs(a[max][k]))max=i;}if(i!=k){for(j=0;j<n;j++){ta=a[k][j];a[k][j]=a[max][j];a[max][j]=ta;}tb=b[k];b[k]=b[max];b[max]=tb; }output();for(i=k+1;i<n;i++){m=a[i][k]/a[k][k];for(j=k;j<n;j++)a[i][j]=a[i][j]-a[k][j]*m;b[i]=b[i]-m*b[k];output();}}}void qiujie (){ int i,j;float sum;b[n-1]=b[n-1]/a[n-1][n-1];for(i=n-2;i>=0;i--){sum=0;for(j=i+1;j<n;j++)sum=sum+a[i][j]*b[j];b[i]=(b[i]-sum)/a[i][i];}printf("the result is:\n");for(i=0;i<n;i++)printf("x%d=%f\n",i+1,b[i]);}void main(){ input();gaosi();qiujie();}以下是运行结果:输出矩阵的大致变化过程input sting a 4input array a:1.003 0.333 1.504 -0.333-2.011 1.455 0.506 2.9564.329 -1.952 0.006 2.0875.113 -4.004 3.332 -1.112input array b:3.005 5.407 0.136 3.772the result is:x1=-0.325438x2=0.327990x3=2.372718x4=1.040163计算如下方程组:1.003 x1+ 0.333x2+ 1.504x3 -0.333x4=3.005 -2.011x1 + 1.455 x2+ 0.506x3 + 2.956x4=5.4074.329 x1 -1.952x2+ 0.006 x3+ 2.087x4=0.1365.113 x1-4.004x2 + 3.332x3 -1.112x4= 3.772。

用高斯消去法解线性方程组。C++程序及结果

用高斯消去法解线性方程组。C++程序及结果

用高斯消去法解线性方程组。

设有n元线性方程组如下:算法:对于k从0开始到n-2结束,进行以下步骤:首先,第k行第k列的数不能为0,若为0,则与下面不为0的行交换。

将k行所有数除以第k行第k列的数.其次,进行消去:a[i][j]=a[i][j]-a[i][k]*a[k][j],j,i=k+1,k+2,…,n-1b[i]=b[i]-a[i][k]*b[k],i=k+1,k+2,……,n-1最后,回代过程x[n-1]=b[n-1]/a[n-1][n-1]x[i]=b[i]-∑a[i][j]x[j],I=n-2,…1,0定义一个矩阵类Matrix作为基类,然后由矩阵类派生出线性方程组类Linequ。

程序清单:#include<iostream>#include<cmath>using namespace std;class Matrix //定义矩阵类{public:Matrix(int dims=2) //构造函数{index=dims; //保护数据赋值MatrixA=new double[index*index]; //动态内存分配}~Matrix(){delete[] MatrixA;} //内存释放void setMatrix(double *rmatr) //设置矩阵值{for(int i=0;i<index*index;i++){*(MatrixA+i)=rmatr[i]; } //矩阵成员赋初值}void printM(); //显示矩阵protected:int index;double* MatrixA;};class Linequ:public Matrix //线性方程组类{public:Linequ(int dims=2):Matrix(dims){sums=new double[dims];solu=new double[dims];}~ Linequ();void setLinequ(double*a,double*b); //方程赋值void printL(); //显示方程int Solve(); //高斯消元法求解void showX(); //输出方程的解private:double *sums;double *solu;};void Matrix::printM() //显示矩阵的元素{cout<<"The Matrix is:"<<endl;for(int i=0;i<index;i++){for(int j=0;j<index;j++)cout<<*(MatrixA+i*index+j)<<" ";cout<<endl;}}Linequ::~Linequ(){delete[]sums;delete[]solu;}void Linequ::setLinequ(double *a,double *b) //方程赋值{setMatrix(a);for(int i=0;i<index;i++)sums[i]=b[i];}void Linequ::printL() //显示方程{cout<<"The Line eqution is:"<<endl;for(int i=0;i<index;i++){for(int j=0;j<index;j++)cout<<*(MatrixA+i*index+j)<<" ";cout<<" "<<sums[i]<<endl;}}void Linequ::showX() //输出方程的解{cout<<"The Result is:"<<endl;for(int i=0;i<index;i++){cout<<"X["<<i<<"]="<<solu[i]<<endl;}}int Linequ::Solve() //解线性方程组{int l,k,i,j,is,p,q,m=0;double d,t;l=1;for(k=0;k<=index-2;k++) //消去过程{d=0.0;for(i=k;i<=index-1;i++)for(j=k;j<=index-1;j++){t=fabs(MatrixA[i*index+j]);if(t>d){d=t;is=i;}}if(d+1.0==1.0)l=0;if(l==0){cout<<"fail"<<endl;return(0);}d=MatrixA[k*index+k];if(d==0){m++;d=MatrixA[(k+m)*index+k];is=k+m;}if(is!=k){for(j=k;j<=index-1;j++){p=k*index+j;q=is*index+j;t=MatrixA[p];MatrixA[p]=MatrixA[q];MatrixA[q]=t;}t=sums[k];sums[k]=sums[is];sums[is]=t;}d=MatrixA[k*index+k];for(j=k;j<=index-1;j++){ p=k*index+j;MatrixA[p]=MatrixA[p]/d;}sums[k]=sums[k]/d;for(i=k+1;i<=index-1;i++){for(j=k+1;j<=index-1;j++){p=i*index+j;MatrixA[p]=MatrixA[p]-MatrixA[i*index+k]*MatrixA[k*index+j];}sums[i]=sums[i]-MatrixA[i*index+k]*sums[k];}}d=MatrixA[(index-1)*index+index-1];if(fabs(d)+1.0==1.0){cout<<"fail"<<endl;return(0);}solu[index-1]=sums[index-1]/d; //回代过程for(i=index-2;i>=0;i--){t=0.0;for(j=i+1;j<=index-1;j++)t=t+MatrixA[i*index+j]*solu[j];solu[i]=sums[i]-t;}}int main() //主函数{double a[]={2,-0.5,-0.5,0, -0.5,2,0,-0.5, -0.5,0,2,-0.5, 0,-0.5,-0.5,2};double b[4]={0,3,3,0};Linequ equl(4);equl.setLinequ(a,b);equl.printL();if(equl.Solve())equl.showX();elsecout<<"Fail"<<endl;return 0;}运行结果:。

列主元高斯消去法c++程序

列主元高斯消去法c++程序

//A[N][N+1]={5,3,7,8,9,3,6,7,5,6,5,3};
cout<<"请输入增广矩阵"<<endl;
for ( i=0;i<N;i++)
பைடு நூலகம்{
for (int j=0;j<N+1;j++)
{
cin>>A[i][j];
}
}
max=A[0][0];
cout<<"增广矩阵A为:"<<endl;
{max=A[i][L1]; //L2换成L1
row=i;} //列主元所在行,L1表示初始列元所在行
}
for (int j=0;j<N+1;j++) //换行
{B[j]=A[row][j];
A[row][j]=A[L1][j];
cout<<"请输入方程组的阶数"<<endl;
cin>>N;
double *B=new double[N+1];
double **A=new double*[N]; //定义增广矩阵
for (int i=0;i<N;i++)
A[i]=new double[N+1]; //指针
A[L1][j]=B[j];}
cout<<"选取主元后的增广矩阵A为:"<<endl;
for ( i=0;i<N;i++)
{
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

//Gauss消去法解线性方程组
//参考教材《计算方法教程》第二版,西安交通大学出版社#include<stdio.h>
int main(void)
{
float A[7][7]={{3,-5,6,4,-2,-3,8},
{1,1,-9,15,1,-9 ,2},
{2,-1,7,5,-1,6,11},
{-1,1,3,2,7,-1,-2},
{4,3,1,-7,2,1,1},
{2,9,-8,11,-1,-4,-1},
{7,2,-1, 2,7,-1,9}};
float b[7]={11,2,29,9,5,8,25};
float x[7]={0};
float Aik,S;
int i,j,k;
int size=7;
printf("A[][]\n");
for(i=0;i<size;i++)
{
for(j=0;j<size;j++)
printf("%f ",A[i][j]);
printf("\n");
}
printf("b[]\n");
for(i=0;i<size;i++)
printf("%f ",b[i]);
printf("\n\n");
//消去过程
for(k=0;k<size-1;k++)
{
if(!A[k][k])
return -1;
for(i=k+1;i<size;i++)
{
Aik=A[i][k]/A[k][k];
for(j=k;j<size;j++)
{
A[i][j]=A[i][j]-Aik*A[k][j];
}
b[i]=b[i]-Aik*b[k];
}
}
//消去的结果
printf("A[]\n");
for(i=0;i<size;i++)
{
for(j=0;j<size;j++)
printf("%f ",A[i][j]);
printf("\n");
}
printf("b[]\n");
for(i=0;i<size;i++)
printf("%f ",b[i]);
printf("\n\n");
//回代过程
x[size-1]=b[size-1]/A[size-1][size-1];
for(k=size-2;k>=0;k--)
{
S=b[k];
for(j=k+1;j<size;j++)
{
S=S-A[k][j]*x[j];
}
x[k]=S/A[k][k];
}
//solution
printf("The solution x[]=\n");
for(i=0;i<size;i++)
printf("%f ",x[i]);
return 0;
}
/列主元Gauss消去法解线性方程组
//参考教材《计算方法教程》第二版,西安交通大学出版社#include<stdio.h>
#include<math.h>
int main(void)
{
float A[7][7]={{3,-5,6,4,-2,-3,8},
{1,1,-9,15,1,-9 ,2},
{2,-1,7,5,-1,6,11},
{-1,1,3,2,7,-1,-2},
{4,3,1,-7,2,1,1},
{2,9,-8,11,-1,-4,-1},
{7,2,-1, 2,7,-1,9}}; float b[7]={11,2,29,9,5,8,25};
float x[7]={0};
float Aik,S,temp;
int i,j,k;
float max;//列主元的绝对值
int col;//列主元所在的行
int size=7;
printf("A[][]\n");
for(i=0;i<size;i++)
{
for(j=0;j<size;j++)
printf("%f ",A[i][j]);
printf("\n");
}
printf("b[]\n");
for(i=0;i<size;i++)
printf("%f ",b[i]);
printf("\n\n");
//-------消去过程---------
for(k=0;k<size-1;k++)
{
max=fabs(A[k][k]);
col=k;
//查找最大元素所在的行
for(i=k;i<size;i++)
{
if(max<fabs(A[i][k]))
{
max=fabs(A[i][k]);
col=i;
}
}
printf("col:%d\n",col);
for(j=k;j<size;j++)
{
temp=A[col][j];
A[col][j]=A[k][j];
A[k][j]=temp;
}
temp=b[col];b[col]=b[k];b[k]=temp;
if(!A[k][k])
return -1;
for(i=k+1;i<size;i++)
{
Aik=A[i][k]/A[k][k];
for(j=k;j<size;j++)
{
A[i][j]=A[i][j]-Aik*A[k][j];
}
b[i]=b[i]-Aik*b[k];
}
}
//消去的结果
printf("A[]\n");
for(i=0;i<size;i++)
{
for(j=0;j<size;j++)
printf("%f ",A[i][j]);
printf("\n");
}
printf("b[]\n");
for(i=0;i<size;i++)
printf("%f ",b[i]);
printf("\n\n");
//回代过程
x[size-1]=b[size-1]/A[size-1][size-1];
for(k=size-2;k>=0;k--)
{
S=b[k];
for(j=k+1;j<size;j++)
{
S=S-A[k][j]*x[j];
}
x[k]=S/A[k][k];
}
//solution
printf("The solution x[]=\n");
for(i=0;i<size;i++)
printf("%f ",x[i]);
return 0;
}。

相关文档
最新文档