数值分析课实验-求解线性方程组的直接法C代码
2016-05-18 10:40
756 查看
高斯顺序消元法
平方根法
运行截图:
运行截图:
平方根法
//高斯顺序消元法 #include<stdlib.h> #include<stdio.h> #define N 10 void gauss_shunxu(float a ,float h ){ int i,j,k; float x ,temp1,temp2; for(k=0; k<N-1; k++){ for(i=k + 1; i<N; i++){ temp1=a[i][k]/a[k][k]; h[i]-= h[k]*temp1; for(j=k+1; j<N; j++){ a[i][j]-=a[k][j]*temp1; } } } x[N-1]=h[N-1]/a[N-1][N-1]; for(i=N-2; i>-1; i--){ temp2=0; for(j=i+1; j<N; j++){ temp2+=a[i][j]*x[j]; } x[i]=(h[i]-temp2)/a[i][i]; } printf("该线性方程组用Gauss顺序消元法求得的解为:\n"); for(i=0; i<N; i++){ printf("x%d=%lf\n",i+1,x[i]); } } void main() { float a[N][N]= {{4,2,-3,-1,2,1,0,0,0,0}, {8,6,-5,-3,6,5,0,1,0,0}, {4,2,-2,-1,3,2,-1,0,3,1}, {0,-2,1,5,-1,3,-1,1,9,4}, {-4,2,6,-1,6,7,-3,3,2,3}, {8,6,-8,5,7,17,2,6,-3,5}, {0,2,-1,3,-4,2,5,3,0,1}, {16,10,-11,-9,17,34,2,-1,2,2}, {4,6,2,-7,13,9,2,0,12,4}, {0,0,-1,8,-3,-24,-8,6,3,-1}}; float h[N]= {5,12,3,2,3,46,13,38,19,-21}; gauss_shunxu(a,h); }
运行截图:
//平方根法 #include<stdio.h> #include<malloc.h> #include<math.h> extern int flag=1; int pingfanggenfa(double **a,double *b,int H) { double *y = (double *) malloc(sizeof(double)*H); double s; int i,j,k; a[0][0] = sqrt(a[0][0]); //求解a11 for (i = 1; i < H; i++) //第一列 a[i][0] = a[i][0] / a[0][0]; //求解ai1 for (k = 1; k < H; k++) //第k列 { for (i = k; i < H; i++) //下三角,i>k { //求aik for (s = 0, j = 0; j < k; j++) s += a[i][j] * a[k][j]; //求中间和 if (i > k) //下三角元素 a[i][k] = (a[i][k] - s) / a[k][k]; else if (i == k) //akk,主对角线元素 a[i][k] = sqrt(a[i][k] - s); } } for(j = 0 ; j < H ; j++) for(i = j+1 ; i < H ; i++) a[j][i] = a[i][j]; //转置 for(i = 0 ,flag = 0 ; i < H ; j++) { if(a[i][i] == 0) { printf("方程系数输入有误\n"); flag = 1 ; //flag置1 }break; } if(flag != 1){ // flag标志位不为0时继续计算 y[0]= b[0] / a[0][0]; //先求y1 for (k = 0; k < H; k++) { for (s = 0, j = 0; j < k; j++) s += a[k][j] * y[j]; y[k] = (b[k] - s) / a[k][k]; //再求yk...n } b[H-1]= y[H-1] / a[H-1][H-1]; //先求xn for (k = H-2; k >= 0; k--) { for (s = 0, j = k+1; j < H; j++) s += a[j][k] * b[j]; b[k] = (y[k] - s) / a[k][k]; //再求xi...1 } printf("\nL的下三角矩阵为:\n"); for(i = 0 ; i < H ; i++) { for(k = 0 ; k <= i ; k++) printf("%lf ",a[i][k]); printf("\n"); } printf("\nL的转置矩阵为:\n"); for(j = 0 ; j< H ; j++) { for(i = 0 ; i < H ; i++) { if(i < j) printf(" "); else printf("%lf ",a[i][j]); } printf("\n"); } printf("\nY的值为:\n"); for(i = 0 ; i < H ; i++) printf("y%d=%lf\n",i+1,y[i]); printf("\nX的值为:\n"); for(i = 0 ; i < H ; i++) printf("x%d=%lf\n",i+1,b[i]); free(y); //释放动态开辟的空间 return 0; } else if(flag == 1) flag = 1; //flag标志位置1,退出 return 0; } int main(){ double **a , *b; int i, j , H; while(flag == 1) { printf("请输入未知数个数n:\n"); scanf("%d", &H); a = (double**)malloc(sizeof(double*)*H); //为二维数组分配H行 b = (double *) malloc(sizeof(double)*H); for (i = 0; i < H; i++) //为每列分配H个大小空间 a[i] = (double*)malloc(sizeof(double)*H); printf("请输入系数矩阵:\n"); //初始化 for (i = 0; i < H; i++){ for (j = 0; j < H; j++) scanf("%lf",&a[i][j]); } printf("请输入向量b:\n"); for (i = 0; i < H; i++){ scanf("%lf",&b[i]); } pingfanggenfa(a,b,H); } free(b); //释放动态开辟的空间 for (i = 0; i < H; ++i) free(a[i]); //a行 free(a); //a列 }
运行截图:
相关文章推荐
- Python正则表达式
- java基础知识:继承
- 《学习笔记》之JAVA设计模式--简单工厂模式
- 关于Java多线程实现生产者和消费者的问题
- 浮动窗口代码(带关闭按钮+全屏漂浮)
- 在ASP.NET 2.0中操作数据之六十三:GridView实现批量删除数据
- Struts2工作原理
- eclipse rebase w/merge
- 一点一点学ASP.NET之基础概念——委托
- C++在线学习文档(强烈推荐)
- 160518、java中使用百度地图(超级简单)
- Laravel Service Provider 中 boot 方法和 register 方法的区别
- windows下关于QT5连接mysql的几点问题
- Java_Java Compiler 应用实例
- Rxjava中toList操作符
- [XPath/Python] XPath 与 lxml (二)XPath 语法 - iFantasticMe
- Ubuntu 中搭建 LAMP 及 php 开发工具
- GitHub, Google Code, and other
- java web 监听器listener
- C++ ofstream和ifstream详细用法