数值分析--线性方程求根
线性方程求根、采用完全主元法,而且能够自定义未知数个数。主程序如下:
#include #include #include double* roots(int n) { int i,j,k,row,column,s;//row,column用来保存列中最大数的行和列 double **a,max,temp,m; double *roots=(double*)calloc(n,sizeof(double));////存放交换顺序后的根 double *order=(double*)calloc(n,sizeof(double));//存放根的顺序 double *result=(double*)calloc(n,sizeof(double));//存放最终的根 1 / 10 for(i=0;i order[i]=i; } a=(double**)calloc(n,sizeof(double));/////为二维数组申请空间 for(i=0;i a[i]=(double*)calloc(n+1,sizeof(double)); } for(i=0;i printf(\"请输入方程第 %d 行增广矩阵\ for(j=0;j { scanf(\"%lf\j]); } } for(i=0;i max=fabs(a[i][i]); row=i; column=i; for(k=i;k for(s=i;s 3 / 10 if(fabs(a[k][s])>max) { row=k; column=s; max=fabs(a[k][i]); } } } if(row!=i||column!=i) { if(row!=i) { for(k=0;k { temp=a[row][k]; a[row][k]=a[i][k]; a[i][k]=temp; } } if(column!=i) { for(k=0;k temp=a[k][i]; a[k][i]=a[k][column]; a[k][column]=temp; 5 / 10 } order[i]=column;/////记录交换后根的顺序 order[column]=i; } } for(j=i+1;j m=a[j][i]/a[i][i]; for(k=i+1;k a[j][k]-=m*a[i][k]; } } 6 / 10 } roots[n-1]=a[n-1][n]/a[n-1][n-1];////////回代过程,计算每个根 for(i=n-2;i>=0;i--) { temp=0; for(j=i+1;j temp+=a[i][j]*roots[j]; } if(a[i][i]==0) return NULL; roots[i]=(a[i][n]-temp)/a[i][i]; } 7 / 10 for(i=0;i k=order[i]; result[k]=roots[i]; } for(i=0;i free(a[i]); } free(a); free(order); free(roots); return result; 8 / 10 } int main() { int m,n,i,j; double *result; printf(\"请输入需要求解的方程组个数:\"); scanf(\"%d\ for(j=0;j printf(\"请输入第 %d 个方程未知数个数:\ scanf(\"%d\ result=roots(n); for(i=0;i { printf(\"第 %d 个根\%16.8e\\n\ } } free(result); return 0; } 求解老师问题及测试书上一个病态方程: 10 / 10 因篇幅问题不能全部显示,请点此查看更多更全内容