c语言程序线性方程求解有解释
C语言中的线性代数运算
C语言中的线性代数运算在计算机编程领域中,线性代数是一门基础而重要的数学学科。
它涉及到向量、矩阵和线性方程组等概念,是许多领域中的核心工具,包括图形处理、数据分析和人工智能等。
一、向量的表示和运算在C语言中,向量可以使用数组来表示。
可以定义一个一维数组来表示一个向量,每个数组元素表示向量的一个分量。
要进行向量的加法、减法和数量乘法,只需对对应的数组元素进行相应的运算即可。
例如,对于两个具有n个分量的向量v和w,它们的加法可以表示为:for(i=0; i<n; i++){v[i] = v[i] + w[i];}二、矩阵的表示和运算矩阵是一个二维数组,在C语言中可以使用二维数组表示。
假设有两个矩阵A和B,它们的和可以定义为将对应位置的元素相加得到的新矩阵C。
可以使用嵌套的for循环来完成矩阵的加法运算。
例如:for(i=0; i<n; i++){for(j=0; j<m; j++){C[i][j] = A[i][j] + B[i][j];}}矩阵的乘法是线性代数运算中的一个重要概念。
C语言中可采用嵌套的for循环来实现两个矩阵相乘的操作。
如果矩阵A是一个n行m 列的矩阵,矩阵B是一个m行p列的矩阵,那么它们的乘积矩阵C就是一个n行p列的矩阵。
具体实现如下:for(i=0; i<n; i++){for(j=0; j<p; j++){C[i][j] = 0;for(k=0; k<m; k++){C[i][j] += A[i][k] * B[k][j];}}}三、线性方程组的求解线性方程组是线性代数中的重要问题之一,它可以用矩阵和向量的形式表示。
在C语言中,可以使用高斯消元法或LU分解等方法求解线性方程组。
高斯消元法是一种经典的线性方程组求解方法。
它通过行变换将方程组转化为三角形矩阵,然后通过回代法求解得到方程的解。
下面是高斯消元法求解线性方程组的示例代码:for(k=0; k<n; k++){for(i=k+1; i<n; i++){factor = A[i][k] / A[k][k];for(j=k+1; j<n; j++){A[i][j] = A[i][j] - factor * A[k][j];}B[i] = B[i] - factor * B[k];}}for(i=n-1; i>=0; i--){sum = 0;for(j=i+1; j<n; j++){sum += A[i][j] * X[j];}X[i] = (B[i] - sum) / A[i][i];}以上是对C语言中线性代数运算的简要介绍。
c语言解方程组
c语言解方程组C语言是一种广泛使用的编程语言,被广泛应用于硬件控制、嵌入式系统、操作系统、网络通信等领域。
但是,C语言也可以用来解方程组,本文将详细介绍如何利用C语言进行方程组求解。
第一步:了解方程组的基本概念方程组是数学中的一个概念,它由若干个方程式组成,并且这些方程式都包含有若干个未知数。
例如,下面是一个方程组的例子:3x + 2y = 84x - 3y = 1在这个方程组中,有两个未知数x和y,分别代表两个变量。
同时,方程组有两个方程式,每个方程式都包含两个未知数。
第二步:利用高斯-若尔当消元法进行方程组求解高斯-若尔当消元法是一种求解线性方程组的方法,它可以有效地将方程组化简为一个上三角矩阵,从而求出方程组的解。
下面是解方程组的具体步骤:1. 将方程组写成增广矩阵的形式,例如上述例子可以写成如下形式:3 2 | 84 -3 | 1其中,第一列和第二列是方程组中未知数的系数,第三列是等式右边的常数项。
2. 通过列主元素消去法将增广矩阵化成上三角矩阵的形式。
具体方法是:(1)如果第一行的主元素为0,则交换第一行和下面的某一行,使得主元素不为0。
(2)对第一列以下的行,将它们的第一列系数变为0。
具体方法是:对于第k行,将第k行的所有元素乘以第一行的第一个元素,然后将得到的结果从第一行中对应的元素上减去。
(3)用相同的方法对第二列以下的行重复操作,得到一个上三角矩阵。
3. 回代求解。
从最后一行开始,依次求出各个未知数的值。
具体方法是:对于第k个未知数(从最后一个开始),先求出它在第k行中的取值,然后代入到第k-1行中计算第k-1个未知数的取值,以此类推。
第三步:用C语言实现高斯-若尔当消元法在C语言中,可以用二维数组来表示增广矩阵。
例如,上述例子可以写成如下形式:int matrix[2][3] = {{3, 2, 8},{4, -3, 1}};接下来,可以编写C语言代码来实现高斯-若尔当消元法。
用C语言解决线性规划问题(用单纯形法解)
用C语言解决线性规划问题(用单纯形法解)#include<stdio.h>#include<math.h>#include<iostream.h>#define BORDER -0.00001#define M 100int main(){int k; //初始变量的个数int m; //约束条件的个数;cout<<"输入初始变量的个数"<<endl;cin>>k;cout <<"输入约束条件的个数"<<endl;cin>>m;cout<<"输入约束条件的种类"<<endl;cout<<"0 means <="<<endl;cout<<"1 means >="<<endl;cout<<"2 means ="<<endl;int NGET=0;int NLET=0;int NET =0;int I =0;//人工变量;int *code=new int[m]; //the array of the >= <= =;for(int i=0;i<m;i++){cin>>code[i];if(code[i]==0)NGET++;if(code[i]==1)NLET++;I++ ;if(code[i]==2)NET++;I++ ;}int n; //变量总和;n=k+2*NLET+NGET+NET;float *Index=new float[n+1]; //目标函数的系数;float *c=new float[n+1];int NTYPE;for(i=0;i<n+1;i++)Index[i]=0.0;//为语法要求定初值;cout<<"输入目标函数的系数"<<endl;for(i=0;i<k;i++)cin>>Index[i];for(i=k+NGET+NLET;i<n;i++)//人工变量所在的列;Index[i]=-M; //the initionalization of indexes of manul variable;cout<<"输入所求函数的类型是求最大还是最小"<<endl;cout<<"0 means min"<<endl;cout<<"1 means max"<<endl;cin>>NTYPE;if(NTYPE) //the initionalization of the c[i];{for(i=0;i<n+1;i++)c[i]=-Index[i];//一般情况下只要将目标函数系数的相反数输入;}if(!NTYPE){for(i=0;i<n+1;i++)if(i<k+NGET+NLET)c[i]=Index[i];else c[i]=-Index[i];}delete []Index;float **a=new float*[m+1]; //the array of all the variable to compute;for(i=0;i<m+1;i++)a[i]=new float[n+1];int INDEXG=k;int INDEXL=k+NGET;int INDEXE=k+NGET+NLET;int *ARTV=new int[I]; //保存人工变量;for(i=0;i<m;i++) //the analization of the code[](<= >= = );{if(code[i]==0){a[i][INDEXL]=1.0;INDEXL++;}if(code[i]==1){a[i][INDEXE]=1.0;INDEXE++;a[i][INDEXG]=-1.0;INDEXG++;ARTV[I]=i;I++;}if(code[i]==2){a[i][INDEXE]=1.0;INDEXE++;ARTV[I]=i;I++;}}if( (INDEXG!=k+NLET) || (INDEXL!=k+NGET+NLET) || (INDEXE!=n) )//excption {return -1;}cout<<"输入约束表达式左边的系数"<<endl;for(i=0;i<m;i++)for(int j=0;j<k;j++)cin>>a[i][j];float *b=new float[m];cout<<"输入约束表达式右边的值" <<endl;for(i=0;i<m;i++)cin>>b[i];for(i=0;i<m;i++)a[i][n]=b[i];float *temp=new float[n+1];if(I){for(i=0;i<I;i++)for(int j=0;j<n+1;j++){temp[j]=-a[ARTV[i]][j];c[j]+=M*temp[j];}}for(i=0;i<n+1;i++)a[m][i]=c[i];for(i=0;i<m+1;i++){for(int j=0;j<n+1;j++)cout<<a[i][j]<<" ";cout<<endl;}int flag=0;float temp1;float temp2;int K,J;int index;for(i=0;i<n;i++)if(a[m][i]<0)flag=1; //检验系数;while(flag) //Using a[][] to compute the result; {temp1=0;for(i=0;i<n;i++){if(temp1>a[m][i]){temp1=a[m][i];K=i;}}temp2=M;for(i=0;i<m;i++){if(a[i][K]>0&&(a[i][n]/a[i][K])<temp2){temp2=a[i][n]/a[i][K];J=i;}}if(temp2==M){cout<<"无解!"<<endl;return -1;}float temp3=a[J][K];for(i=0;i<n+1;i++){a[J][i]=a[J][i]/temp3;}for(i=0;i<m+1;i++){if(i!=J){float temp4=a[i][K];for(int j=0;j<n+1;j++){a[i][j]=a[i][j]- a[J][j]*temp4;}}cout<<endl;}flag=0;for(i=0;i<n+1;i++){if(a[m][i]<BORDER)flag=1;}cout<<"**************************************"<<endl;for(i=0;i<m+1;i++){for(int j=0;j<n+1;j++)cout<<a[i][j]<<" ";cout<<endl;}cout<<"***************************************"<<endl;getchar();}if(NTYPE)cout<<"The answer is :"<<a[m][n];if(!NTYPE)cout<<"The answer is :"<<-a[m][n];getchar();return 0;}。
线性方程组的数值算法C语言实现
线性方程组的数值算法C语言实现一、高斯消元法高斯消元法是一种求解线性方程组的常用方法。
它的基本思想是通过行变换和列变换,将方程组化为上三角矩阵,然后再通过回代法求解。
以下是高斯消元法的C语言实现代码:```c#include<stdio.h>#define N 3 // 设置方程个数//高斯消元法函数void gauss_elimination(float a[N][N+1])int i, j, k;//消元for(k=0; k<N-1; k++)for(i=k+1; i<N; i++)float factor = a[i][k] / a[k][k];for(j=k; j<N+1; j++)a[i][j] -= a[k][j] * factor;}}}//回代float x[N];for(i=N-1; i>=0; i--)x[i]=a[i][N]/a[i][i];for(j=i-1; j>=0; j--)a[j][N]-=a[j][i]*x[i];}}//输出结果for(i=0; i<N; i++)printf("x[%d] = %f\n", i+1, x[i]);}int mainfloat a[N][N+1];//输入方程组系数矩阵printf("请输入方程组的系数矩阵:\n"); for(int i=0; i<N; i++)for(int j=0; j<=N; j++)scanf("%f", &a[i][j]);}}//调用高斯消元法函数gauss_elimination(a);return 0;```以上代码通过用户输入方程组的系数矩阵,然后调用`gauss_elimination`函数进行高斯消元法求解,最后输出结果。
需要注意的是,该代码中假设输入的方程个数是3个,可以根据实际情况进行调整。
C语言LU分解法实现解线性方程组
C语言LU分解法实现解线性方程组LU分解法是一种常用于解线性方程组的方法。
在C语言中,可以通过编写相应的函数来实现这一方法。
首先,我们需要定义一个函数来进行LU分解。
LU分解将一个矩阵分解为一个下三角矩阵L和一个上三角矩阵U的乘积。
下面是一个示例函数实现:```cfor (int i = 0; i < n; i++)for (int k = i; k < n; k++)double sum = 0;for (int j = 0; j < i; j++)sum += L[i][j] * U[j][k];}U[i][k] = A[i][k] - sum;}for (int k = i; k < n; k++)if (i == k)L[i][i]=1;} elsefor (int j = 0; j < i; j++)sum += L[k][j] * U[j][i];}L[k][i] = (A[k][i] - sum) / U[i][i];}}}```上述函数中,A是输入的矩阵,n是矩阵的维度,L和U是输出的下三角矩阵和上三角矩阵。
接下来,我们可以定义一个函数来解线性方程组。
利用LU分解后的矩阵L和U,我们可以通过两次前代和回代来求解线性方程组。
下面是一个示例函数实现:```cvoid solveLU(double **L, double **U, double *b, double *x, int n)double *y = malloc(n * sizeof(double));// Solve Ly = b using forward substitutionfor (int i = 0; i < n; i++)for (int j = 0; j < i; j++)sum += L[i][j] * y[j];}y[i] = b[i] - sum;}// Solve Ux = y using backward substitutionfor (int i = n - 1; i >= 0; i--)double sum = 0;for (int j = i + 1; j < n; j++)sum += U[i][j] * x[j];}x[i] = (y[i] - sum) / U[i][i];}free(y);```上述函数中,L和U是LU分解后的下三角矩阵和上三角矩阵,b是线性方程组的右侧向量,x是待求解的变量向量,n是矩阵的维度。
C语言解线性方程组
实验一、用C语言解线性方程组一、实验名称:用C语言解线性方程组。
二、实验原理:用初等行变化的方法将线性方程组的增广矩阵化简成最简型;从最简型中可以看出线性方程组解的情况。
三、实验工具:计算机和Microsoft Visual C++ 6.0软件。
四、实验原程序代码如下:#include<stdio.h>#include<math.h>#include<stdlib.h>#define MAXR 20#define MAXC 40float M[MAXC];float M_B[MAXR][MAXC];void f1(int m,int n){int i,j,r=0,c=0;float x0;printf("\n以下过程是将矩阵化为行阶梯型\n");printf("\n输出初始增广矩阵!\n");for(i=0;i<m;i++){for(j=0;j<n;j++)printf("%8.2f",M_B[i][j]); /*原始增广矩阵*/printf("\n");}printf("按任一健继续...\n");getchar();while(c<n){for(i=r;i<m;i++)if(fabs(M_B[i][c])>=0.0001)break;if(i<m){if(i!=r)for(j=0;j<n;j++){x0=M_B[i][j];M_B[i][j]=M_B[r][j];M_B[r][j]=x0;}x0=M_B[r][c];for(j=0;j<n;j++)M_B[r][j]/=x0;{x0=M_B[i][c];for(j=0;j<n;j++)M_B[i][j]-=x0*M_B[r][j];}r++;for(i=0;i<m;i++){for(j=0;j<n;j++)printf("%8.2f",M_B[i][j]);printf("\n");}printf("按任一健继续...\n");getchar();}c++;if(r==m)break;}printf("\n矩阵的行阶梯型如上!\n");printf("\n以下过程是将行阶梯型化为行最简型\n"); while(r){r--;for(j=0;j<n-1;j++)if(fabs(M_B[r][j])>=0.0001)break; c=j;for(i=0;i<r;i++){x0=M_B[i][c];for(j=0;j<n;j++)M_B[i][j]-=x0*M_B[r][j];}for(i=0;i<m;i++){for(j=0;j<n;j++)printf("%8.2f",M_B[i][j]);printf("\n");}printf("按任一健继续...\n");getchar();}float M[MAXC]={0};int l1,l2;{ for(l2=0;l2<n;l2++)if(M_B[l1][l2]!=0){M[l2]=1;break;}}if(M[n-1]=1){printf("该方程无解!");return;}for(l1=0;l1<m;l1++){for(l2=0;l2<n;l2++){if(M_B[l1][l2]!=0){M[l2]=M_B[l1][n-1];}}} printf("输出线性方程组的解:");for(l2=0;l2<n-1;l2++)printf("x%d(l2+1)=\n",M[l2]);printf("行最简型即为所求!按任一健退出...\n");getchar();}void main (void){int p,q,m,n;printf("\n 请输入线性方程组的行数m和列数n:");scanf("%d %d",&m,&n);printf("\n现在输入系数矩阵A和向量b:");for(p=1;p<=m;p++){printf("\n请输入a%d1--a%d%d系数和向量b%d: \n",p,p,n,p);/*实现将每一行中的系数和向量一次性输入,数之间用空格格开,输完后回车确定*/for(q=1;q<=n+1;q++) /*将刚才输入的数存入数组*/scanf("%f",&M_B[p-1][q-1]);}f1(m,n+1);}五、实验心得对于第一个实验,虽然实验原理很明了,但是用计算机用C语言来实现还是一件十分困难的事情,实验能够进行的前提是必须理解实验的原理即初等行变换的精髓,理解实验原理以后就要明确实验的各个步骤如何去实现,想明白这些以后再尝试编写程序,当然其中会遇到很多困难,但是要有耐心有细心,就可以编写出自己的程序来完成这个实验。
C语言解线性方程的四种方法
C语言解线性方程的四种方法C语言解线性方程的四种方法发了好几天编了个解线性方程组的小程序,可第一次实战就大败而归。
经过半天的调试,仍找不出纠正的方法。
因为并不是算法的问题,而是因为自己对编译器处理浮点函数的方法不是很理解。
明明D=0的方阵解出来不等于0了,跟踪调试发现,计算过程程序对数据进行了舍去处理,导致最终结果不对。
不过如果没有浮点型的话,这个程序应该算不错了。
复制代码代码如下:#include#include#include#defineNUM100voidprint(void)/使用说明/{clrscr();printf("\n\n\n\n\n\t\t\t\tIntroduction\n");printf("\t--------------------------------------------------------------\n");printf("\tThisprogramwasdesignforcomputelinearequations. \n");printf("\tThewayofuseitisverysimple.\n");printf("\tFirst:Inputthenumberoftheequation;(Input0toexit)\ n");printf("\tSecond:Inputthecoefficientofeveryeqution;\n");printf("\tThird:Inputtheconstantofeveryeqution;\n");printf("\tLast:Chosethewayyouwantusetosolvetheequtions;\ n");printf("\tThat''sall,inputanykeytorunit...\n");printf("\t-------------------------By__TJX------------------------------\n");getch();}voidchose(void)/选择计算方法/{clrscr();fflush(stdin);printf("\n\n\n\n\n\t\tIntroduction\n");printf("\t\tChosetheway,please.\n");printf("\t\ta:Gausseliminant.\n");printf("\t\tb:Gauss_ydeliminant.\n");printf("\t\tc:Iterativeway.\n");printf("\t\td:Cramerway.\n");printf("\t\te:exit.\n");printf("\t\tBy__TJX\n");printf("\t\tPleasechoosenumber:\n");}voidinput(doublea1,doubleb1[],intnum)/数据输入/ {inti,j,t;doublep;charde1,de2;do{printf("Pleaseinputarraya[%d][%d]:\n",num,num);printf("Warn:Thefirstnumberofthearraymustn''tcontainzero!\ n");for(i=1;i<=num;i++){printf("Pleaseinputarraya[%d][]:\n",i);for(j=1;j<=num;j++){t=0;if(i==1&&j==1){do{if(t==0){scanf("%lf",&a1[i][j]);t++;}else{printf("Theinputisinvalid,pleaseinputagain:\n");scanf("% f",&a1[i][j]);}}while(a1[i][j]==0);}elsescanf("%lf",&a1[i][j]);}}printf("\nPleasecheckthevalueofarraya[%d][%d],pressYtoinp utagain.\n",num,num);do{de1=getch();}while(de1!=''y''&&de1!=''Y''&&de1!=''n''&&de1!=''N'');}while(de1==''y''||de1==''Y'');do{printf("Pleaseinputarrayb[%d]:\n",num);p=b1+1;for(i=1;i<=num;i++)scanf("%lf",p++);printf("\nPleasecheckthevalueofarrayb[%d],pressYtoinputag \n",num);do{de2=getch();}while(de2!=''y''&&de2!=''Y''&&de2!=''n''&&de2!=''N'');}while(de2==''y''||de2==''Y'');}intmax(doublet1,doublex1[],intn)/迭代子函数/{inti,temp=0;for(i=1;i<=n;i++)if(fabs(x1[i]-t1[i])>1e-2){temp=1;break;}/printf("%d",temp);/returntemp;}intddcompute(doublea1,doubleb1[],doublex1[],intn)/迭代法计算/{doublet;inti,j,k=0;doublesum1=0.0,sum2=0.0;t=(double)malloc(nsizeof(double));printf("\nPleaseInputTheInitialValueofx:\n");for(i=1;i<=n;i++)scanf("%lf",&x1[i]);do{k++;for(i=1;i<=n;i++)t[i]=x1[i];for(i=1;i<=n;i++){sum1=0.0;sum2=0.0;for(j=1;j<=i-1;j++)sum1=sum1+a1[i][j]x1[j];/printf("sum1=%0.4f",sum1);/for(j=i+1;j<=n;j++)sum2=sum2+a1[i][j]t[j];/printf("sum2= %0.4f",sum2);}/if(a1[i][i]==0||fabs(sum1)>1e+12||fabs(sum2)>1e+12){printf("\nWarning:Theseequtionscan''tbesolvebythisway!\n PressanyKeytocontinue...");getch();free(t);return0;}x1[i]=(b1[i]-sum1-sum2)/a1[i][i];}}while(max(t,x1,n));/for(i=1;i<=n;i++){if(i%3==0)printf("\n");printf("%.4f",x1[i]);}/free(t);return1;}intgscompute(doublea1,doubleb1[],doublex1[],intn)/高斯消元法计算/{inti,j,k;doublem,sum;for(k=1;k<=n-1;k++)for(i=k+1;i<=n;i++){if(a1[k][k]==0){printf("\nTheseequtionscan''tbesolveisthisw \nPressanyKeytocontinue...");getch();return0;}if((m=0-a1[i][k]/a1[k][k])==0){i++;continue;}else{for(j=k+1;j<=n;j++)a1[i][j]=a1[i][j]+a1[k][j]m;b1[i]=b1[i]+b1[k]m;}}/yixiajisuanxzhi/x1[n]=b1[n]/a1[n][n];for(i=n-1;i>=1;i--){sum=0.0;for(j=n;j>=i+1;j--)sum=sum+a1[i][j]x1[j];x1[i]=(b1[i]-sum)/a1[i][i];}return1;}intgs_ydcompute(doublea1,doubleb1[],doublex1[],intn)/高斯_约当法计算/{inti,j,k;doublem,sum;for(k=1;k<=n;k++){i=1;while(i<=n){if(a1[k][k]==0){printf("\nTheseequtionscan''tbesolveisthisw ay.\nPressanyKeytocontinue...");getch();return0;}if(i!=k){if((m=0-a1[i][k]/a1[k][k])==0){i++;continue;}else{for(j=k+1;j<=n;j++)a1[i][j]=a1[i][j]+a1[k][j]m;b1[i]=b1[i]+b1[k]m;}i++;}elsei++;}}/yixiajisuanxzhi/for(i=n;i>=1;i--)x1[i]=b1[i]/a1[i][i];return1;}doublecomputed(doublea,inth,intl,intc1,intn)/计算系数行列式D值/{inti,j,p=1;doublesum=0.0;if(h==n)sum=1.0;else{i=++h;c1[l]=0;for(j=1;j<=n;j++)if(c1[j])if(a[i][j]==0)p++;else{sum=sum+a[i][j]computed(a,i,j,c1,n)pow(-1,1+p);p++;}c1[l]=1;}returnsum;}voidncompute(doublea,doubleb[],doublex[],intn,intc,double h)/克莱姆法计算/{inti,j;doublet[NUM];for(j=1;j<=n;j++){for(i=1;i<=n;i++){t[i]=a[i][j];a[i][j]=b[i];}x[j]=computed(a,0,0,c,n)/h;for(i=1;i<=n;i++)a[i][j]=t[i];}}main(){doublex[NUM];doubleb[NUM];inti,j=2,n=0;intc;doublehe;charm,decision;doublea;a=(double)malloc(NUMsizeof(double));for(i=0;ia[i]=(double)malloc(NUMsizeof(double));print();do{clrscr();do{if(n>=NUM)printf("nistoolarge,pleaseinputagain:\n");elseprintf("Pleaseinputthetotalnumberoftheequationsn(n scanf("%d",&n);}while(n>NUM);if(n==0){for(i=1;ifree(a);exit(1);}input(a,b,n);c=(int)malloc((n+1)sizeof(int));memset(c,1,(n+1)sizeof(int));he=computed(a,0,0,c,n);if(fabs(he)>1e-4)Other:chose();do{m=getche();}while(m!=''a''&&m!=''b''&&m!=''A''&&m!=''B''&&m!=''c'' &&m!=''C''&&m!=''d''&&m!=''D''&&m!=''e''&&m!=''E'');switch(m){case''a'':;case''A'':j=gscompute(a,b,x,n);break;case''b'':;case''B'':j=gs_ydcompute(a,b,x,n);break;case''c'':;case''C'':j=ddcompute(a,b,x,n);break;case''d'':;case''D'':j=1;ncompute(a,b,x,n,c,he);break;case''e'':;case''E'':j=2;break;default:j=2;break;}if(j==1){clrscr();printf("\n\n\n\n");printf("D=%.4f\n",he);for(i=1;i<=n;i++){if(i%5==0)printf("\n");printf("%.4f",x[i]);}}elseif(j==0){printf("\nTheseequtionscan''tbesolveisthisway.\nPleasechos etheotherway.");gotoOther;}else{for(i=1;ifree(a);free(c);exit(1);}}elseprintf("\n\n\tD=%.4f\nThislinearequationshasn''taccurat eanswer!",he);printf("\nDoyouwanttocontinue?(Y/N)\n");do{decision=getchar();}while(decision!=''y''&&decision!=''Y''& &decision!=''n''&&decision!=''N'');}while(decision==''y''||decision==''Y'');for(i=1;ifree(a);free(c);}如对本文有所疑问,请点击进入脚本之家知识社区提问。
c--解线性方程组的几种方法
//解线性方程组#include<iostream.h>#include<iomanip.h>#include<stdlib.h>//----------------------------------------------全局变量定义区const int Number=15; //方程最大个数double a[Number][Number],b[Number],copy_a[Number][Number],copy_b[Number];//系数行列式int A_y[Number]; //a[][]中随着横坐标增加列坐标的排列顺序,如a[0][0],a[1][2],a[2][1]...则A_y[]={0,2,1...};int lenth,copy_lenth; //方程的个数double a_sum; //计算行列式的值char * x; //未知量a,b,c的载体//----------------------------------------------函数声明区void input(); //输入方程组void print_menu(); //打印主菜单int choose (); //输入选择void cramer(); //Cramer算法解方程组void gauss_row(); //Gauss列主元解方程组void guass_all(); //Gauss全主元解方程组void Doolittle(); //用Doolittle算法解方程组int Doolittle_check(double a[][Number],double b[Number]); //判断是否行列式>0,若是,调整为顺序主子式全>0void xiaoqu_u_l(); //将行列式Doolittle分解void calculate_u_l(); //计算Doolittle结果double & calculate_A(int n,int m); //计算行列式double quanpailie_A(); //根据列坐标的排列计算的值,如A_y[]={0,2,1},得sum=a[0][ A_y[0] ] * a[1][ A_y[1] ] * a[2][ A_y[2] ]=a[0][0]*a[1][2]*a[2][1];void exchange(int m,int i); //交换A_y[m],A_y[i]void exchange_lie(int j); //交换a[][j]与b[];void exchange_hang(int m,int n); //分别交换a[][]和b[]中的m与n 两行void gauss_row_xiaoqu(); //Gauss列主元消去法void gauss_all_xiaoqu(); //Gauss全主元消去法void gauss_calculate(); //根据Gauss消去法结果计算未知量的值void exchange_a_lie(int m,int n); //交换a[][]中的m和n列void exchange_x(int m,int n); //交换x[]中的x[m]和x[n]void recovery(); //恢复数据//主函数void main(){int flag=1;input(); //输入方程while(flag){print_menu(); //打印主菜单flag=choose(); //选择解答方式}}//函数定义区void print_menu(){system("cls");cout<<"------------方程系数和常数矩阵表示如下:\n";for(int j=0;j<lenth;j++)cout<<"系数"<<j+1<<" ";cout<<"\t常数";cout<<endl;for(int i=0;i<lenth;i++){for(j=0;j<lenth;j++)cout<<setw(8)<<setiosflags(ios::left)<<a[i][j];cout<<"\t"<<b[i]<<endl;}cout<<"-----------请选择方程解答的方案----------";cout<<"\n 1. 克拉默(Cramer)法则";cout<<"\n 2. Gauss列主元消去法";cout<<"\n 3. Gauss全主元消去法";cout<<"\n 4. Doolittle分解法";cout<<"\n 5. 退出";cout<<"\n 输入你的选择:";}void input(){ int i,j;cout<<"方程的个数:";cin>>lenth;if(lenth>Number){cout<<"It is too big.\n";return;}x=new char[lenth];for(i=0;i<lenth;i++)x[i]='a'+i;//输入方程矩阵//提示如何输入cout<<"====================================================\n";cout<<"请在每个方程里输入"<<lenth<<"系数和一个常数:\n";cout<<"例:\n方程:a";for(i=1;i<lenth;i++){cout<<"+"<<i+1<<x[i];}cout<<"=10\n";cout<<"应输入:";for(i=0;i<lenth;i++)cout<<i+1<<" ";cout<<"10\n";cout<<"==============================\n";//输入每个方程for(i=0;i<lenth;i++){cout<<"输入方程"<<i+1<<":";for(j=0;j<lenth;j++)cin>>a[i][j];cin>>b[i];}//备份数据for(i=0;i<lenth;i++)for(j=0;j<lenth;j++)copy_a[i][j]=a[i][j];for(i=0;i<lenth;i++)copy_b[i]=b[i];copy_lenth=lenth;}//输入选择int choose(){int choice;char ch;cin>>choice;switch(choice){case 1:cramer();break;case 2:gauss_row();break;case 3:guass_all();break;case 4:Doolittle();break;case 5:return 0;default:cout<<"输入错误,请重新输入:";choose();break;}cout<<"\n是否换种方法求解(Y/N):";cin>>ch;if(ch=='n'||ch=='N') return 0;recovery();cout<<"\n\n\n";return 1;}//用克拉默法则求解方程.void cramer(){int i,j;double sum,sum_x;char ch;//令第i行的列坐标为icout<<"用克拉默(Cramer)法则结果如下:\n";for(i=0;i<lenth;i++)A_y[i]=i;sum=calculate_A(lenth,0);if(sum!=0){cout<<"系数行列式不为零,方程有唯一的解:";for(i=0;i<lenth;i++){ ch='a'+i;a_sum=0;for(j=0;j<lenth;j++)A_y[j]=j;exchange_lie(i);sum_x=calculate_A(lenth,0);cout<<endl<<ch<<"="<<sum_x/sum;exchange_lie(i);}}else{cout<<"系数行列式等于零,方程没有唯一的解.";}cout<<"\n";}double & calculate_A(int n,int m) //计算行列式{ int i;if(n==1) {a_sum+= quanpailie_A();}else{for(i=0;i<n;i++){ exchange(m,m+i);calculate_A(n-1,m+1);exchange(m,m+i);}}return a_sum;}double quanpailie_A() //计算行列式中一种全排列的值{int i,j,l;double sum=0,p;for(i=0,l=0;i<lenth;i++)for(j=0;A_y[j]!=i&&j<lenth;j++)if(A_y[j]>i) l++;for(p=1,i=0;i<lenth;i++)p*=a[i][A_y[i]];sum+=p*((l%2==0)?(1):(-1));return sum;}//高斯列主元排列求解方程void gauss_row(){int i,j;gauss_row_xiaoqu(); //用高斯列主元消区法将系数矩阵变成一个上三角矩阵for(i=0;i<lenth;i++){for(j=0;j<lenth;j++)cout<<setw(10)<<setprecision(5)<<a[i][j];cout<<setw(10)<<b[i]<<endl;}if(a[lenth-1][lenth-1]!=0){cout<<"系数行列式不为零,方程有唯一的解:\n";gauss_calculate();for(i=0;i<lenth;i++) //输出结果{cout<<x[i]<<"="<<b[i]<<"\n";}}elsecout<<"系数行列式等于零,方程没有唯一的解.\n";}void gauss_row_xiaoqu() //高斯列主元消去法{int i,j,k,maxi;double lik;cout<<"用Gauss列主元消去法结果如下:\n";for(k=0;k<lenth-1;k++){j=k;for(maxi=i=k;i<lenth;i++)if(a[i][j]>a[maxi][j]) maxi=i;if(maxi!=k)exchange_hang(k,maxi);//for(i=k+1;i<lenth;i++){lik=a[i][k]/a[k][k];for(j=k;j<lenth;j++)a[i][j]=a[i][j]-a[k][j]*lik;b[i]=b[i]-b[k]*lik;}}}//高斯全主元排列求解方程void guass_all(){int i,j;gauss_all_xiaoqu();for(i=0;i<lenth;i++){for(j=0;j<lenth;j++)cout<<setw(10)<<setprecision(5)<<a[i][j];cout<<setw(10)<<b[i]<<endl;}if(a[lenth-1][lenth-1]!=0){cout<<"系数行列式不为零,方程有唯一的解:\n";gauss_calculate();for(i=0;i<lenth;i++) //输出结果{for(j=0;x[j]!='a'+i&&j<lenth;j++);cout<<x[j]<<"="<<b[j]<<endl;}}elsecout<<"系数行列式等于零,方程没有唯一的解.\n"; }void gauss_all_xiaoqu() //Gauss全主元消去法{int i,j,k,maxi,maxj;double lik;cout<<"用Gauss全主元消去法结果如下:\n";for(k=0;k<lenth-1;k++){for(maxi=maxj=i=k;i<lenth;i++){for(j=k;j<lenth;j++)if(a[i][j]>a[maxi][ maxj]){ maxi=i;maxj=j;}}if(maxi!=k)exchange_hang(k,maxi);if(maxj!=k){exchange_a_lie(maxj,k); //交换两列exchange_x(maxj,k);}for(i=k+1;i<lenth;i++){lik=a[i][k]/a[k][k];for(j=k;j<lenth;j++)a[i][j]=a[i][j]-a[k][j]*lik;b[i]=b[i]-b[k]*lik;}}}void gauss_calculate() //高斯消去法以后计算未知量的结果{int i,j;double sum_ax;b[lenth-1]=b[lenth-1]/a[lenth-1][lenth-1];for(i=lenth-2;i>=0;i--){for(j=i+1,sum_ax=0;j<lenth;j++)sum_ax+=a[i][j]*b[j];b[i]=(b[i]-sum_ax)/a[i][i];}}void Doolittle() //Doolittle消去法计算方程组{double temp_a[Number][Number],temp_b[Number];int i,j,flag;for(i=0;i<lenth;i++)for(j=0;j<lenth;j++)temp_a[i][j]=a[i][j];flag=Doolittle_check(temp_a,temp_b);if(flag==0) cout<<"\n行列式为零.无法用Doolittle求解.";xiaoqu_u_l();calculate_u_l();cout<<"用Doolittle方法求得结果如下:\n";for(i=0;i<lenth;i++) //输出结果{for(j=0;x[j]!='a'+i&&j<lenth;j++);cout<<x[j]<<"="<<b[j]<<endl;}}void calculate_u_l() //计算Doolittle结果{ int i,j;double sum_ax=0;for(i=0;i<lenth;i++){for(j=0,sum_ax=0;j<i;j++)sum_ax+=a[i][j]*b[j];b[i]=b[i]-sum_ax;}for(i=lenth-1;i>=0;i--){for(j=i+1,sum_ax=0;j<lenth;j++)sum_ax+=a[i][j]*b[j];b[i]=(b[i]-sum_ax)/a[i][i];}}void xiaoqu_u_l() //将行列式按Doolittle分解{ int i,j,n,k;double temp;for(i=1,j=0;i<lenth;i++)a[i][j]=a[i][j]/a[0][0];for(n=1;n<lenth;n++){ //求第n+1层的上三角矩阵部分即Ufor(j=n;j<lenth;j++){ for(k=0,temp=0;k<n;k++)temp+=a[n][k]*a[k][j];a[n][j]-=temp;}for(i=n+1;i<lenth;i++) //求第n+1层的下三角矩阵部分即L{ for(k=0,temp=0;k<n;k++)temp+=a[i][k]*a[k][n];a[i][n]=(a[i][n]-temp)/a[n][n];}}}int Doolittle_check(double temp_a[][Number],double temp_b[Number]) //若行列式不为零,将系数矩阵调整为顺序主子式大于零{int i,j,k,maxi;double lik,temp;for(k=0;k<lenth-1;k++){j=k;for(maxi=i=k;i<lenth;i++)if(temp_a[i][j]>temp_a[maxi][j]) maxi=i;if(maxi!=k){ exchange_hang(k,maxi);for(j=0;j<lenth;j++){ temp=temp_a[k][j];temp_a[k][j]=temp_a[maxi][j];temp_a[maxi][j]=temp;}}for(i=k+1;i<lenth;i++){lik=temp_a[i][k]/temp_a[k][k];for(j=k;j<lenth;j++)temp_a[i][j]=temp_a[i][j]-temp_a[k][j]*lik;temp_b[i]=temp_b[i]-temp_b[k]*lik;}}if(temp_a[lenth-1][lenth-1]==0) return 0;return 1;}void exchange_hang(int m,int n) //交换a[][]中和b[]两行{int j; double temp;for(j=0;j<lenth;j++){ temp=a[m][j];a[m][j]=a[n][j];a[n][j]=temp;}temp=b[m];b[m]=b[n];b[n]=temp;}void exchange(int m,int i) //交换A_y[m],A_y[i]{ int temp;temp=A_y[m];A_y[m]=A_y[i];A_y[i]=temp;}void exchange_lie(int j) //交换未知量b[]和第i列{ double temp;int i;for(i=0;i<lenth;i++){ temp=a[i][j];a[i][j]=b[i];b[i]=temp;}}void exchange_a_lie(int m,int n) //交换a[]中的两列{ double temp;int i;for(i=0;i<lenth;i++){ temp=a[i][m];a[i][m]=a[i][n];a[i][n]=temp;}}void exchange_x(int m,int n) //交换未知量x[m]与x[n]{ char temp;temp=x[m];x[m]=x[n];x[n]=temp;}void recovery() //用其中一种方法求解后恢复数据以便用其他方法求解{for(int i=0;i<lenth;i++)for(int j=0;j<lenth;j++)a[i][j]=copy_a[i][j];for(i=0;i<lenth;i++)b[i]=copy_b[i];for(i=0;i<lenth;i++)x[i]='a'+i;a_sum=0;lenth=copy_lenth;}(注:可编辑下载,若有不当之处,请指正,谢谢!)。
C语言LU分解法实现解线性方程组
C语言LU分解法实现解线性方程组C语言LU分解法实现解线性方程组#include#include//LU分解法实现解线性方程组double sumU(double L[5][5] ,double U[5][5], int i, int j ){ double sU = 0.0;for (int k = 1; k <= i-1 ; k++){sU += L[i-1][k-1] * U[k-1][j-1];}return sU;}//计算求和1double sumL(double L[5][5] ,double U[5][5], int i, int j ){ double sL = 0.0;for (int k = 0; k <= j-1; k++){sL += L[i-1][k-1] * U[k-1][j-1];}return sL;}//计算求和2double sumY(double L[5][5] ,double y[5],int i){double sY=0.0;for (int k = 1; k <= i - 1; k++){sY += L[i-1][k-1] * y[k-1];}return sY;}//计算求和3double sumX(double U[5][5] ,double x[5],int i ,int m){double sX = 0.0;for (int k = i+1; k <= m; k++){sX += U[i-1][k-1] * x[k-1];}return sX;}//计算求和4int main(){double a[5][5] = {4,5.3,-5.6,-3,-3.4,5,-2.1,3.2,4,-8,2,-4,-7.2,-5,-2.4,5,-3,-8,2.3,3,4.2,-3,0,0,-2};//将系数存入二维数组double L[5][5] = {0};double U[5][5] = {0};//初始化部分double b[5] = {100.16,-75.72,98.2,57.1,3.72};int n = 5;//n阶//输出[Ab]printf("[A]:\n");for (int i = 1; i <= n; i++){for (int j = 1; j <= n; j++){printf("%f\t", a[i-1][j-1]);}printf("\n");}//计算L,Ufor (int i = 1; i <= n; i++){L[i-1][i-1] = 1;//对角线元素为1for (int j = i; j <= n; j++)//由于数组下标从0开始所以i-1,j-1U[i-1][j-1] = a[i-1][j-1] - sumU(L,U,i,j);if(j+1 <= n) L[j][i-1] = (a[j][i-1] - sumL(L,U,j+1,i))/U[i-1][i-1];//i变j+1,j变i }}//输出Uprintf("U:\n");for (int i = 1; i <= n; i++){for (int j = 1; j <= n; j++){printf("%f\t",U[i-1][j-1]);}printf("\n");}//输出Lprintf("L:\n");for (int i = 1; i <= n; i++){for (int j = 1; j <= n; j++){printf("%f\t",L[i-1][j-1]);}printf("\n");}//由Ly=b 求ydouble y[5] = {0.0};y[0] = b[0];//y(1) = b(1);for (int i = 2; i <= n; i++)y[i-1] = b[i-1] - sumY(L,y,i);}//由Ux=y 求xdouble x[5] = {0.0};for (int i = n; i >= 1; i--){x[i-1] =( y[i-1] - sumX(U,x,i,n))/ U[i-1][i-1]; } //输出yprintf("y:\n");for (int i = 0; i < n; i++){printf("%f\n",y[i]);}printf("\n");//输出xprintf("x:\n");for (int i = 0; i < n; i++){printf("%f\n",x[i]);}printf("\n");system("pause");return 0;}。
c语言解方程
c语言解方程本文介绍了使用C语言解决方程的相关内容,包括使用解方程程序的实际实现和九大经典题目的解法等。
一、使用C语言解决方程1、解方程程序的实际实现在使用C语言来解决方程时,需要定义一个函数来计算某个方程的根,具体过程如下:(1)首先,定义一个函数来实现计算方程根的功能,这里使用Newton-Raphson法,其中,f代表要计算的方程,x0为初始值,delta代表允许的-误差:double f(double x){// 求解方程return ...}double x0 = 1.0;double delta = 0.00001;// 使用Newton-Raphson法得到方程的根double x = x0;while (fabs(f(x)) > delta){x = x - f(x) / fPrime(x);// 计算下一个近似根// x即为方程的根(2)向函数传递参数,以求出方程的根,具体过程如下: double a, b, c; // 要求解的一元二次方程的系数int rootNum; // 方程根数,即解的个数// 特判:一元二次方程两端系数为零if (a == 0 && b == 0 && c == 0){rootNum = -1;}else if (a == 0 && b == 0){rootNum = 0;}else{// 求解方程的根double delta = b * b - 4 * a * c;if (delta < 0){rootNum = 0;else if (delta == 0){rootNum = 1;}else{rootNum = 2;}}return rootNum;2、九大经典题目(1)求给定数组的最大和// 使用C语言求数组的最大和: // 输入:数组arr,长度为n// 输出:最大和int maxSum(int arr[], int n) {int sum = 0;int maxSum = 0;for (int i = 0; i < n; i++) {sum = max(sum + arr[i], arr[i]);maxSum = max(sum, maxSum);}return maxSum;}(2)求三角形最大路径和// 使用C语言求解三角形的最大路径和: // 输入:数组tri,长度为n// 输出:最大路径和int maxPathSum(int tri[][], int n){int dp[n][n];int maxSum = 0;// 初始化dp数组dp[0][0] = tri[0][0];for (int i = 1; i < n; i++){dp[i][0] = dp[i-1][0] + tri[i][0];}for (int i = 1; i < n; i++){for (int j = 1; j <= i; j++){dp[i][j] = max(dp[i-1][j-1], dp[i-1][j]) + tri[i][j]; }}for (int i = 0; i < n; i++){maxSum = max(dp[n-1][i], maxSum);}return maxSum;}二、结论C语言是最常用的编程语言之一,它可以用来解决各种方程,通过定义函数和设置条件语句,可以实现将方程求根。
c语言解方程5篇
c语言解方程5篇第一篇:c语言解方程一、迭代法求方程根/* 迭代法求一个数的平方根 */#define Epsilon 1.0E-6 /*控制解的精度*/ #includemain(){float a,x0,x1;printf(“请输入要求的数:”);scanf(“%f”,&a);x0=a/2;x1=(x0+a/x0)/2;while(fabs(x1-x0)>=Epsilon){x0=x1;x1=(x0+a/x0)/2;}printf(“%f的平方根:%f.5n”,x1);}二、求方程根的另一种算法#define Epsilon 1.0E-6 /*控制解的精度*/ #include#includemain(){float num,pre,this;do{scanf(“%f”,&num);/*输入要求平方根的数*/}while(num<0);if(num==0)printf(“the root is 0”);else{this=1;do{pre=this;this=(pre+num/pre)/2;}while(fabs(pre-this)>Epsilon);/*用解的精度,控制循环次数*/ }printf(“the root is %f”,this);}三、用牛顿迭代法求方程 2*x*x*x-4*x*x+3*x-6 的根/* 牛顿迭代法*/ #define Epsilon 1.0E-6 /*控制解的精度*/ #include main(){float x1,x0=1.5;x1=x0-(2*x0*x0*x0-4*x0*x0+3*x0-6)/(6*x0*x0-8*x0+3);while(fabs(x1-x0>=Epsilon){x0=x1;x1=x0-(2*x0*x0*x0-4*x0*x0+3*x0-6)/(6*x0*x0-8*x0+3);} printf(“方程的根为%fn”,x1);}四、用二分法求上题/* 二分法 */ #define Epsilon 1.0E-5 /*控制解的精度*/ #include main(){folat x1,x2,x0,f1,f2,f0;x0=(x1+x2)/2;f0=2*x0*x0*x0-4*x0*x0+3*x0-6;/* 求中点的函数值 */ while(fabs(f0)>=Epsilon){if(f0*f1<0){ x2=x0;f2=2*x2*x2*x2-4*x2*x2+3*x2-6;}if(f0*f2<0){ x1=x0;f1=2*x1*x1*x1-4*x1*x1+3*x1-6;}x0=(x1+x2)/2;f0=2*x0*x0*x0-4*x0*x0+3*x0-6;}printf(“用二分法求得方程的根:%fn”,x0);}第二篇:怎么解方程新的学期开始了,鉴于上一学期的英语教学成绩比较差,通过不断的总结和反思,我特别指定本学期的英语教学计划如下:一、学分制度搞竞争英语学习建立学分制,教师把学生课堂学习、课后复习、作业情况、复习检测等以分数的形式进行量化积分,每天公布评比,增强学生的竞争意识,从而提高学生英语的学习兴趣。
C语言解线性方程组
//求线性方程组的解,化成除对角线外其余的元素都为0#include<stdio.h>int main(){int i,j,n,m,r;float a[50][50],k,det=1;A:printf("输入方程组个数m=");scanf("%d",&m);printf("输入未知数个数n=");scanf("%d",&n);if(m==n){printf("输入线性方程组的系数和常数组成的矩阵\n");//输入矩阵for(i=0;i<m;i++){for(j=0;j<n+1;j++)scanf("%f",&a[i][j]);}printf("您输入的矩阵为:\n");for(i=0;i<m;i++){for(j=0;j<n+1;j++)printf("%4.2f\t",a[i][j]);printf("\n");}//用极小数代替矩阵中的0元素for(i=0;i<m;i++){for(j=0;j<n;j++){if(a[i][j]==0.0)a[i][j]=1e-10;}}//求解第一步化为下上角矩阵for(i=1;i<m;i++){for(j=0;j<i;j++){k=-a[i][j]/a[j][j];//printf("%4.2f\t",k);for(r=0;r<n+1;r++){a[i][r]=k*a[j][r]+a[i][r];}}}//求行列式for(i=0;i<m;i++)det*=a[i][i];printf("行列式:det=%4.2f\n",det);if(det!=0){printf("上三角矩阵如下:\n");for(i=0;i<m;i++){for(j=0;j<n+1;j++)printf("%4.2f\t",a[i][j]);printf("\n");}//求解第二步化为上三角矩阵printf("消去右上角元素:\n");for(i=m-2;i>=0;i--){for(j=n-1;j>=i+1;j--){k=-a[i][j]/a[j][j];for(r=0;r<n+1;r++){a[i][r]=k*a[j][r]+a[i][r];}}}for(i=0;i<m;i++){for(j=0;j<n+1;j++){printf("%4.2f\t",a[i][j]);}printf("\n");}//把对角线上的元素化为1float s=1.0;for(i=0;i<m;i++){s=a[i][i];for(j=0;j<=n;j++){a[i][j]=a[i][j]/s;}}//输出结果printf("矩阵最终运算结果:\n");for(i=0;i<m;i++){for(j=0;j<n+1;j++){printf("%4.2f\t",a[i][j]);}printf("\n");}//分析结果printf("解得:\n");for(i=0;i<m;i++){printf("x%d=%4.2f\n",i,a[i][n]);}}else{printf("该矩阵的行列式det=0,没有解。
迭代法解线性方程组(C语言描述)
用Gauss-Seidel迭代法解线性方程组的C语言源代码:#include<stdio.h>#include<math.h>#include<stdlib.h>struct Line{int L;struct Row *head;struct Line *next;};struct Row{int R;float x;struct Row *link;};//建立每次迭代结果的数据存储单元struct Term{float x;float m;};struct Line *Create(int Line,int Row){struct Line *Lhead=NULL,*p1=NULL,*p2=NULL; struct Row*Rhead=NULL,*ptr1,*ptr2=NULL;int i=1,j=1;float X;while(i<=Line){while(j<=Row+1){scanf("%f",&X);if(X!=0||j==Row+1){ptr1=(struct Row*)malloc(sizeof(Row));if(ptr1==NULL){printf("内存分配错误!\n");exit(1);}ptr1->x=X;ptr1->R=j;if(ptr2==NULL){ptr2=ptr1;Rhead=ptr1;}else{ptr2->link=ptr1;ptr2=ptr1;}}j++;}if(ptr2!=NULL){ptr2->link=NULL;ptr2=NULL;}if(Rhead!=NULL){p1=(struct Line*)malloc(sizeof(Line));if(p1==NULL){printf("内存分配错误!\n");exit(1);}p1->L=i;p1->head=Rhead;if(p2==NULL){Lhead=p1;p2=p1;}else{p2->next=p1;p2=p1;}}i++;Rhead=NULL;j=1;}if(p2!=NULL)p2->next=NULL;return Lhead;}struct Line *Change(struct Line*Lhead,int n){ struct Line*p1,*p2,*p3,*p;struct Row*ptr;int i=1,k,j;float max,t;if(Lhead==NULL){printf("链表为空!\n");exit(1);}p2=Lhead;while(i<=n){max=0;k=0;t=0;ptr=p2->head;while(ptr!=NULL){if(ptr->R!=n+1){t+=fabs(ptr->x);if(max<fabs(ptr->x)){max=fabs(ptr->x);k=ptr->R;}}ptr=ptr->link;}t=t-max;if(max<=t){printf("系数矩阵A不具有严格对角优势,该程序不能用Gauss-Jacobi迭代法解该方程组!\n");return NULL;}if(p2->L==k)p2=p2->next;else if(p2->L>k){printf("系数矩阵A不具有严格对角优势,该程序不能用Gauss-Jacobi迭代法解该方程组!\n");exit(0);}else{p3=Lhead;while(p3->L!=k)p3=p3->next;ptr=p3->head;p3->head=p2->head;p2->head=ptr;}i++;}return Lhead;}void Deal(struct Line *Lhead,float e,int N,int n){struct Term*ptr;struct Line*p1;struct Row*current;float m=0,a,b,c=0;int k=0;if(Lhead==NULL){printf("链表为空\n");exit(1);}ptr=(Term*)malloc(n*sizeof(Term));for(int i=0;i<n;i++){(ptr+i)->x=0;(ptr+i)->m=0;}printf("迭代过程的数据变化表如下:\n");printf(" K");for(int i=1;i<=n;i++)printf(" X%d",i);printf("\n %d",k);for(int i=0;i<n;i++)printf(" %.5f",ptr[i].x);printf("\n");do{m=0;p1=Lhead;while(p1!=NULL){current=p1->head;while(current!=NULL){if(current->link==NULL)b=current->x;else if(current->R==p1->L)a=current->x;else c+=(current->x)*ptr[(current->R)-1].x;current=current->link;}ptr[(p1->L)-1].m=(b-c)/a-ptr[(p1->L)-1].x;if(m<fabs(ptr[(p1->L)-1].m))m=fabs(ptr[(p1->L)-1].m);ptr[(p1->L)-1].x=(b-c)/a;c=0;p1=p1->next;}k++;printf(" %d",k);for(int i=0;i<n;i++)printf(" %0.5f",ptr[i].x);printf("\n");}while(m>=e&&k<=N);if(k>N){printf("用迭代法解线性方程组失败!\n");exit(1);}printf(" 用Gauss-Seidel迭代法解的方程的近似解为:\n");for(int i=0;i<n;i++)printf(" X%d=%0.5f\n",i+1,ptr[i].x);}int main(){int n,N;float e;struct Line *head;printf("输入线性方程组的维数n、最大容许迭代次数N、容许误差e:\n");printf("n=");scanf("%d",&n);printf("N=");scanf("%d",&N);printf("e=");scanf("%f",&e);printf("输入线性方程组的系数矩阵A及常数项Bi:\n");for(int i=1;i<=n+1;i++){if(i!=n+1)printf(" X%d",i);else printf(" B\n");}head=Create(n,n);printf("\n");head=Change(head,n);Deal(head,e,N,n);return 0;}代码运行如下:。
线性方程组求解.cpp
#include <stdio.h>#include <math.h>#include <stdlib.h>#define MAX 20 //定义最大的方程组中方程个数double a[MAX+1][MAX+2] ; //方程组系数存放的增广矩阵存放数组double b[MAX+1][MAX+2] ;int n ; //方程的实际个数int xxx = 0; //是否初始化void init()//输入线性方程组{xxx= 1;printf("\n\t请输入方程组的方程个数: ");scanf ("%d",&n);if( n > MAX )//输入的数超过了定义的最大方程个数,退出{printf("sorry,can not deal !\n\n");printf("最大能处理的方程组为%d阶方程组\n\n,MAX");exit(0);}printf("\n请依次输入方程组的方程的系数(顺序从上到下,从左至右):\n"); for(int i = 1 ; i < n+1 ; i++ )//n行n+1列的增广矩阵for(int j = 1 ; j < n+2 ; j++ )scanf ("%lf",&a[i][j]);for(int i = 1 ; i < n+1 ; i++ ) //备份for(int j = 1 ; j < n+2 ; j++ )b[i][j]=a[i][j];}void reset()//将数组a还原成初始状态{for(int i = 1 ; i < n+1 ; i++ )for(int j = 1 ; j < n+2 ; j++ )a[i][j]=b[i][j];}void display()//输出增光矩阵{for(int i = 1 ; i < n+1 ; i++ ){for(int j = 1 ; j < n+2 ; j++ )printf("%.3f ",a[i][j]);printf("\n");}}void print()//输出线性方程组{int count=0;//记录某一行中系数为0的个数for(int i = 1 ; i < n+1 ; i++ )for(int j = 1 ; j < n+2 ; j++ ){if( a[i][j] == 0 && j != n+1)count ++ ;else{if( j == 1 || count == j-1)//系数为第一项或者该项之前的所有项的系数都是0printf ("%.3f X%d ",a[i][j],j);//小数后面保留三位elseif( j == n+1 ){printf(" = %.3f\n",a[i][n+1]);count =0;}elsea[i][j]>0 ? printf (" + %.3f X%d ",fabs(a[i][j]),j): printf (" - %.3f X%d ",fabs(a[i][j]),j);}}}void selectMainEle(int k)//选取第k列的主元{double mainEle = fabs(a[k][k]) ,temp=0;int j = k ;//用变量j记住主元初始位置for(int i = k+1 ; i < n+1 ; i++ )//选出绝对值最大的数if( mainEle < fabs(a[i][k])){mainEle = fabs(a[i][k]) ;j = i; //j记录主元(列中的最大数)的行数}if( k != j ) //初始值不是最大值,k,j换行for(int i = 1 ; i < n+2 ; i++ ){temp = a[k][i] ;a[k][i] = a[j][i] ;a[j][i] = temp ;}}void printit()//输出方程组的根{printf("\n\n求解的方程组的根为:\n");for(int i=1;i<n+1;i++){if(i%4==0) printf("\n");//每一行输出三个解 printf("X%d=%.3f ",i,a[i][n+1]);}printf("\n");}void gause()//高斯列主消元法核心{printf("线性方程组为:\n");print();//输出输入的方程组for( int k=1 ; k < n ; k ++)//消元过程{selectMainEle(k);for(int i = k+1 ; i < n+1 ; i++ )a[i][k] /= a[k][k];for(int i = k+1 ; i < n+1 ; i++ )for(int j = k+1 ; j < n+2 ; j++ )a[i][j] -= a[i][k] * a[k][j] ;printf("\n消元过程如下:\n");for(int i=1;i<n+1;i++){for(int j=1;j<n+1;j++)if(j<k+1&&i>j)printf("%.4f ",0.0);elseprintf("%.4f ",a[i][j]);printf("\n");}}a[n][n+1] /= a[n][n] ;//回代过程for(int i=n-1 ; i>0 ; i--){double sum=0.0;for(int j=i+1 ;j<n+1 ;j++)sum += a[i][j] * a[j][n+1];a[i][n+1] = (a[i][n+1] - sum)/a[i][i];}printit();}void gauseyuedang()//高斯-约当列主元消去法,高斯列主元消去法的改进{printf("线性方程组为:\n");print();//输出输入的方程组double temp;for( int k=1 ; k < n+1 ; k++)//消元,只保留主元{selectMainEle(k);temp = a[k][k];//用temp记住主元的值for(int i=k ; i < n+2 ; i++)//将主元变为1a[k][i] /= temp;//开始消元,出去主元第k列元素全部消去变为零for(int i = 1 ; i < n+1 ; i++ )//行控制if( i != k ) //行变换不包括当前主元所在行for(int j = k+1 ; j < n+2 ; j++ )//列控制a[i][j]=a[i][j]-a[k][j]*a[i][k];printf("\n消元过程如下:\n");for(int i=1;i<n+1;i++){for(int j=1;j<n+1;j++)if(j<k+1&&i!=j)printf("%.4f ",0.0);elseprintf("%.4f ",a[i][j]);printf("\n");}}printit();//输出方程组的解}void LU()//LU分解法{double sum ;printf("线性方程组为:\n");print();//输出输入的方程组for(int i=2;i<n+1;i++)a[i][1] /= a[1][1];for(int r=2 ; r<n+1 ; r++){for(int i=r ; i<n+1 ; i++)//U变换{sum = 0;for(int k=1;k<r;k++)sum += a[r][k]*a[k][i];a[r][i] -= sum;}for(int i=r+1 ; i<n+1 ; i++)//L变换{sum = 0;for(int k=1 ; k<r ; k++)sum += a[i][k]*a[k][r];a[i][r] = (a[i][r] - sum)/a[r][r];}}printf("\n\nLU分解中的L为:\n");for(int i=1 ; i < n+1 ; i++){for(int j=1 ;j < n+1 ; j++)if(i < j) //上部为0printf("%.3f ",0.0);elsei==j ? printf("%.3f ",1.0): printf("%.3f ",a[i][j]); //主对角线为1 printf("\n");}printf("\n\nLU分解中的U为:\n");for(int i=1 ; i < n+1 ; i++){for(int j=1 ;j < n+1 ; j++)if(i > j) //上部为0printf("%.3f ",0.0);elseprintf("%.3f ",a[i][j]);printf("\n");}for(int i=2;i<n+1;i++)//第一次回带求解{sum=0;for(int k=1;k<i;k++)sum+=a[i][k]*a[k][n+1];a[i][n+1] -= sum;}printf("\n\n第一次求解的方程组(LY=b)的根为:\n");for(int i=1;i<n+1;i++){if(i%4==0) printf("\n");//每一行输出三个解printf("Y%d=%.3f ",i,a[i][n+1]);}a[n][n+1]/=a[n][n];//Xn的值for(int i=n-1;i>0;i--){sum=0;for(int k=i+1;k<n+1;k++)sum+=a[i][k]*a[k][n+1];a[i][n+1] = (a[i][n+1] - sum)/a[i][i];}printf("\n\n第二次求解的方程组(UX=y)的根,即原方程组的解为:\n"); for(int i=1;i<n+1;i++){if(i%4==0) printf("\n");//每一行输出三个解printf("X%d=%.3f ",i,a[i][n+1]);}printf("\n");}void Jacobi()//雅可比迭代法{printf("线性方程组为:\n");print();//输出输入的方程组int count=0;///迭代次数double latest[n+1],old[n+1],temp[n+1],sum,precision,max,temp2;for(int i=1;i<n+1;i++)if(a[i][i] == 0){printf("sorry,主对角线中有数据为0,不能用Jacobi迭代法处理!\n请返回重新选择");return ;}printf("\n输入求解精度值: ");scanf("%lf",&precision);for(int i=1 ; i < n+1 ; i++) //初始状态解为0{latest[i] = 0.0;//新值,下一次迭代结果old[i] = 0.0;//旧值,上一次的迭代结果}printf("Jacobi迭代法迭代过程如下:\n");do{ max =0;printf("\n\n第%d次迭代的结果: ",count++);for(int i=1 ; i<n+1 ; i++){if(i%4==0) printf("\n");//每一行输出三个解printf("X%d=%.4f ",i,old[i]);}for(int i = 1 ; i < n+1 ; i++)//迭代过程,完成新的一组解{sum =0.0;for(int j = 1 ; j < n+1 ; j++)if(j != i) sum = sum + a[i][j] * old[j];latest[i]=(a[i][n+1] - sum)/a[i][i];temp[i] = latest[i];//Y用来记录本次迭代的值temp2 = fabs(latest[i] - old[i]); //新值减旧值if(max < temp2) max = temp2 ;}printf("最大的偏差为:%.4f\n",max);for(int i=1 ; i<n+1 ; i++)old[i] = temp[i]; //将新值保留到old数组} while( max > precision && count <= 100);//前后两次解的偏差满足精度要求或者迭代次数超过100次printf("\n\n第%d次(最后的)求解的方程组的根为:\n",count);for(int i=1;i<n+1;i++){if(i%4==0) printf("\n");//每一行输出三个解printf("X%d=%.4f ",i,old[i]);}printf("\n");}void GS()//高斯-赛德尔迭代法{printf("线性方程组为:\n");print();//输出输入的方程组double precision,sum,X[n+1],max,temp,old;int count=0;///迭代次数for(int i=1;i<n+1;i++)if(a[i][i] == 0){printf("sorry,主对角线中有数据为0,不能用高斯赛德尔迭代法处理!\n请返回重新选择");return ;}printf("\n输入求解精度值: ");scanf("%lf",&precision);for(int i = 1 ; i < n+1 ; i++)// 解初始化为0X[i] = 0.0 ;printf("高斯赛德尔迭代法迭代过程如下:\n");do{printf("\n\n第%d次迭代的结果: ",count++);for(int i=1 ; i<n+1 ; i++){if(i%4==0) printf("\n");//每一行输出三个解printf("X%d=%.5f ",i,X[i]);}for(int i = 1 ; i < n+1 ; i++)//迭代过程,完成新的一组解{sum = 0.0;max = 0.0;old =X[i];for(int j = 1 ; j < n+1 ; j++)if(j != i) sum += a[i][j] * X[j] ;X[i] = (a[i][n+1] - sum) /a[i][i];temp = fabs(X[i]-old);if(max < temp) max = temp;}printf("最大的偏差为:%.5f\n",max);} while(max > precision && count <= 100);//前后两次解的偏差满足精度要求或者迭代次数超过100次printf("\n\n第%d次(最后的)求解的方程组的根为:\n",count);for(int i=1;i<n+1;i++){if(i%4==0) printf("\n");//每一行输出三个解printf("X%d=%.5f ",i,X[i]);}printf("\n");}int main(){int xz;while(1){printf("\t\t\t*****************************************\n");printf("\t\t\t**** \t 0.更改线性方程组 ****\n");printf("\t\t\t**** \t 1.高斯列主消元法 ****\n");printf("\t\t\t**** \t 2.高斯-约当列主消去法 ****\n");printf("\t\t\t**** \t 3.LU分解法 ****\n");printf("\t\t\t**** \t 4.雅各比迭代法 ****\n");printf("\t\t\t**** \t 5.高斯-赛德尔迭代法 ****\n");printf("\t\t\t**** \t 6.退出 ****\n");printf("\t\t\t*****************************************\n");printf("\t请根据相应的代号,从上述方法中选择其一: ");scanf("%d",&xz);switch(xz){case 0: init(); break;case 1: if(xxx){reset();gause();}else{printf("sorry,还没有输入线性方程组!\n");init();}break;//高斯列主消元法case 2: if(xxx){reset();gauseyuedang();}else{printf("sorry,还没有输入线性方程组!\n");init();}break;//高斯-约当列主元消去法case 3: if(xxx){reset();LU();}else{printf("sorry,还没有输入线性方程组!\n");init();}break;case 4:if(xxx){reset();Jacobi();}else{printf("sorry,还没有输入线性方程组!\n");init();}break;case 5: if(xxx){reset();GS();}else{printf("sorry,还没有输入线性方程组!\n");init();}break;case 6: exit(0);default:printf("\n\t错误输入o(︶︿︶)o 唉!\n\n");break;}system("pause");system("cls");}}。
c语言程序 线性方程求解 有解释
#include <stdio.h> //标准输入输出头文件#include <stdlib.h> //不是C标准库中的头文件包含了的C语言标准库函数的定义定义了五种类型、一些宏和通用工具函数#include <malloc.h> //包含内存分配函数的函数声明定义常量和表现由堆例程使用的类型#include <math.h> //数学函数库//下面代码为定义为双精度浮点数整形int GS(int,double**,double *,double); //求解函数声明double **TwoArrayAlloc(int,int); //创造二维数组函数声明void TwoArrayFree(double **); //析构二维数组函数声明//注:析构函数当对象脱离其作用域时(对象所在的函数已调用完毕)系统自动执行析构函数。
往往用来做“清理善后”的工作void main() //主函数{int i,j,n; //定义性变量double ep,**a,*b; //定义浮点型变量二维指针一维指针ep = 1e-4; //定义精确度之后用来判断printf("你要解几元线性方程组:\n"); //输出解方程的初步要求scanf("%d",&n); //输出函数输入整形数字//注:求解n元线性方程(即有n个未知数),需要有n个方程组,所以系数总数为n*n,每个方程各有一个常数,一共有n个常数//下面代码分别为系数和常数分配总内存a = TwoArrayAlloc(n,n); //为方程组分配系数所占内存:n*n*sizeof(double)b = (double *)calloc(n,sizeof(double)); //为方程组各个方程分配常数内存:n*sizeof(double)if(b == NULL) //判断内存分配情况{printf("内存分配失败\n"); //输出判断结果exit(1); //内存分配失败,退出程序}//下面代码将用户输入的系数和常数分别一一对应的写入上一步所分配的内存中for(i=0;i<n;i++) //输入n元方程组的系数{printf("请输入第%d行相应的系数:\n",i+1); //说明第几行的方程系数for(j=0;j<n;j++) //循环输入对应行的系数{printf("a[%d][%d]: ",i,j); //输入数在数组中的相对位置scanf("%lf",a[i]+j); //输入系数fflush(stdin); //清空缓存}printf("请输入第%d行相应的常数:\n",i+1); //说明第几行方程组的常数printf("b[%d]: ",i); //循环输入对应行的系数scanf("%lf",b+i); //满足上一个条件后数在数组中的对应位置fflush(stdin); //清空缓存}//注:向下循环如果一直满足j<n则一直向下运行下面步骤一直运行j+1的情况直到不能满足j<n//下面代码根据输入的系数和常数,在屏幕上打印出方程组的具体表达式printf("方程组:\n"); //显示方程组提示语for(i=0;i<n;i++) //打印方程组{for(j=0;j<n;j++) //输入对应行的系数{if(a[i][j]>0) //判断方程组的系数为正{if(j>0)printf(" + "); //从第二行开始如果系数为正输出+号if(a[i][j]!=1) //如果系数不等于1printf("%lfX%d",a[i][j],j+1); //输出系数与Xn的乘积else //否则printf("X%d",j+1); //输出Xn}if(a[i][j]<0) //判断系数小于0{if(j>0)printf(" - "); //如果系数为负输出-号if(a[i][j]!=-1) //如果系数不等于-1printf("%lfX%d",fabs(a[i][j]),j+1); //输出系数的绝对值与Xn的乘积else //否则printf("X%d",j+1); //输出Xn}//注:向下循环如果一直满足i<n 则一直向下运行下面步骤一直运行i+1的情况直到不能满足i<n注:x【n】意思是x包含了n个数据的数组}printf("= %lf\n",b[i]); //打印等号以及常数项}//下面代码判断是否可以用高斯消去法求解,具体逻辑请参考高斯消去法求解线性方程if(!GS(n,a,b,ep)) //判断是否可以用高斯消去法求解,{printf("不可以用高斯消去法求解\n"); //如果不能输出提示语exit(0); //不能用高斯消去法求解,退出程序}printf("该方程组的解为:\n"); //输出该方程组的解打印出结果for(i=0;i<n;i++) //输出结果printf("x%d = %.2f\n",i+1,b[i]); //输出结果TwoArrayFree(a); //释放系数所占内存free (b); //释放常数所占内存}//下面代码为高斯消去法的判断依据函数int GS(int n,double **a,double *b,double ep) //求解函数主体为双精度{int i,j,k,l; //定义整型变量double t; //定义浮点型变量for(k=1;k<=n;k++) //判断每个系数的大小{for(l=k;l<=n;l++) //判断每个系数的大小if(fabs(a[l-1][k-1])>ep) //如果每列系数大于epbreak; //跳出else if(l==n) //如果l=nreturn(0); //返回0if(l!=k) //如果1不等于k{for(j=k;j<=n;j++) //交换系数{t = a[k-1][j-1]; //把第k-1行的每个系数赋给ta[k-1][j-1]=a[l-1][j-1]; //把第l-1行的每个系数赋给k-1行a[l-1][j-1]=t; //把t赋给第1-l行的每个系数}t=b[k-1]; //把每1行的常数项赋给tb[k-1]=b[l-1]; //把l-1行的常数项赋给k-1行b[l-1]=t; //把t的值赋给l-1行的常数}t=1/a[k-1][k-1]; //将t置为Xn分之一用来消元for(j=k+1;j<=n;j++) //消元a[k-1][j-1]=t*a[k-1][j-1]; //将每行的系数乘以该行确定的t 保证Xn的系数为1b[k-1]*=t; //把t的值赋给k-1行的常数for(i=k+1;i<=n;i++) //变换系数{for(j=k+1;j<=n;j++) //变换系数a[i-1][j-1]-=a[i-1][k-1]*a[k-1][j-1]; //把k-1行的每个系数分别赋给j-1和i+1行b[i-1]-=a[i-1][k-1]*b[k-1]; //把k-1行的常数项分别赋给i-1行和b }}for(i=n-1;i>=1;i--) //进行消元for(j=i+1;j<=n;j++) //进行消元b[i-1]-=a[i-1][j-1]*b[j-1]; //把j-1行的常数项分别赋给i-1行和breturn(1); //返回1的步骤}//注:向下循环如果一直满足i>=1则一直向下运行下面步骤一直运行i-1的情况直到不能满足i>=1//下面代码为分配内存的函数double **TwoArrayAlloc(int r,int c) //二维函数创建函数主体{double *x,**y; //定义浮点型变量二维指针一维指针int n; //定义变量x=(double *)calloc(r*c,sizeof(double)); //用x指向r*c个大小为double的内存y=(double **)calloc(r,sizeof(double*)); //用y指向r个double*内存,if(!x||!y) //如果不满足x和y{printf("内存分配失败\n"); //输出判断结果exit(1); //内存分配失败,退出程序}for(n=0;n<=r-1;++n) //输入对应取值y[n]=&x[c*n]; //定义为x在c*n处的地址赋给yreturn (y); //返回y}//注:向下循环如果一直满足n<=r 则一直向下运行下面步骤一直运行n+1的情况直到不能满足n<=r//下面代码为释放内存的函数void TwoArrayFree(double **x) //析构函数{free(x[0]); //释放内存free(x); //释放内存。
线性方程组的数值算法C语言实现(附代码)
线性方程组AX=B 的数值计算方法实验一、 实验描述:随着科学技术的发展,线性代数作为高等数学的一个重要组成部分,在科学实践中得到广泛的应用。
本实验的通过C 语言的算法设计以及编程,来实现高斯消元法、三角分解法和解线性方程组的迭代法(雅可比迭代法和高斯-赛德尔迭代法),对指定方程组进行求解。
二、 实验原理:1、高斯消去法:运用高斯消去法解方程组,通常会用到初等变换,以此来得到与原系数矩阵等价的系数矩阵,达到消元的目的。
初等变换有三种:(a)、(交换变换)对调方程组两行;(b)、用非零常数乘以方程组的某一行;(c)、将方程组的某一行乘以一个非零常数,再加到另一行。
通常利用(c),即用一个方程乘以一个常数,再减去另一个方程来置换另一个方程。
在方程组的增广矩阵中用类似的变换,可以化简系数矩阵,求出其中一个解,然后利用回代法,就可以解出所有的解。
2、选主元:若在解方程组过程中,系数矩阵上的对角元素为零的话,会导致解出的结果不正确。
所以在解方程组过程中要避免此种情况的出现,这就需要选择行的判定条件。
经过行变换,使矩阵对角元素均不为零。
这个过程称为选主元。
选主元分平凡选主元和偏序选主元两种。
平凡选主元:如果()0p pp a ≠,不交换行;如果()0p pp a =,寻找第p 行下满足()0p pp a ≠的第一行,设行数为k ,然后交换第k 行和第p 行。
这样新主元就是非零主元。
偏序选主元:为了减小误差的传播,偏序选主元策略首先检查位于主对角线或主对角线下方第p 列的所有元素,确定行k ,它的元素绝对值最大。
然后如果k p >,则交换第k 行和第p 行。
通常用偏序选主元,可以减小计算误差。
3、三角分解法:由于求解上三角或下三角线性方程组很容易所以在解线性方程组时,可将系数矩阵分解为下三角矩阵和上三角矩阵。
其中下三角矩阵的主对角线为1,上三角矩阵的对角线元素非零。
有如下定理:如果非奇异矩阵A 可表示为下三角矩阵L 和上三角矩阵U 的乘积: A LU = (1) 则A 存在一个三角分解。
c语言线性函数分析
c语⾔线性函数分析C语⾔版的线性回归分析函数收藏前⼏天,清理出⼀些⼗年以前DOS下的程序及代码,看来⽬前也没什么⽤了,想打个包刻在光碟上,却发现有些代码现在可能还能起作⽤,其中就有计算⼀元回归和多元回归的代码,⼀看代码⽂件时间,居然是1993年的,于是稍作整理,存放在这,分析虽不⼗分完整,但⼀般应⽤是没问题的,最起码,可提供给那些刚学C的学⽣们参考。
先看看⼀元线性回归函数代码:// 求线性回归⽅程:Y = a + bx// dada[rows*2]数组:X, Y;rows:数据⾏数;a, b:返回回归系数// SquarePoor[4]:返回⽅差分析指标: 回归平⽅和,剩余平⽅和,回归平⽅差,剩余平⽅差// 返回值:0求解成功,-1错误int LinearRegression(double *data, int rows, double *a, double *b, double *S quarePoor){int m;double *p, Lxx = 0.0, Lxy = 0.0, xa = 0.0, ya = 0.0;if (data == 0 || a == 0 || b == 0 || rows < 1)return -1;for (p = data, m = 0; m < rows; m ++){xa += *p ++;ya += *p ++;}xa /= rows; // X平均值ya /= rows; // Y平均值for (p = data, m = 0; m < rows; m ++, p += 2){Lxx += ((*p - xa) * (*p - xa)); // Lxx = Sum((X - Xa)平⽅)Lxy += ((*p - xa) * (*(p + 1) - ya)); // Lxy = Sum((X - Xa)(Y - Ya)) }*b = Lxy / Lxx; // b = Lxy / Lxx*a = ya - *b * xa; // a = Ya - b*Xaif (SquarePoor == 0)return 0;// ⽅差分析SquarePoor[0] = SquarePoor[1] = 0.0;for (p = data, m = 0; m < rows; m ++, p ++){Lxy = *a + *b * *p ++;SquarePoor[0] += ((Lxy - ya) * (Lxy - ya)); // U(回归平⽅和)SquarePoor[1] += ((*p - Lxy) * (*p - Lxy)); // Q(剩余平⽅和)}SquarePoor[2] = SquarePoor[0]; // 回归⽅差SquarePoor[3] = SquarePoor[1] / (rows - 2); // 剩余⽅差return 0;}为了理解代码,把⼏个与代码有关的公式写在下⾯(回归理论和公式推导就免了,⽹上搜索到处是,下⾯的公式图⽚也是⽹上搜的,有些公式图形⽹上没找到或者不合适,可参见后⾯多元回归中的公式):1、回归⽅程式:2、回归系数:其中:3、回归平⽅和:4、剩余平⽅和:实例计算:double data1[12][2] = {// X Y{187.1, 25.4},{179.5, 22.8},{157.0, 20.6},{197.0, 21.8},{239.4, 32.4},{217.8, 24.4},{227.1, 29.3},{233.4, 27.9},{242.0, 27.8},{251.9, 34.2},{230.0, 29.2},{271.8, 30.0}};void Display(double *dat, double *Answer, double *SquarePoor, int rows, in t cols){double v, *p;int i, j;printf("回归⽅程式: Y = %.5lf", Answer[0]);for (i = 1; i < cols; i ++)printf(" + %.5lf*X%d", Answer[i], i);printf(" ");printf("回归显著性检验: ");printf("回归平⽅和:%12.4lf 回归⽅差:%12.4lf ", SquarePoor[0], SquarePoo r[2]);printf("剩余平⽅和:%12.4lf 剩余⽅差:%12.4lf ", SquarePoor[1], SquarePoo r[3]);printf("离差平⽅和:%12.4lf 标准误差:%12.4lf ", SquarePoor[0] + SquareP oor[1], sqrt(SquarePoor[3])); printf("F 检验:%12.4lf 相关系数:%12.4lf ", SquarePoor[2] /SquarePoor [3],sqrt(SquarePoor[0] / (SquarePoor[0] + SquarePoor[1])));printf("剩余分析: ");printf(" 观察值估计值剩余值剩余平⽅");for (i = 0, p = dat; i < rows; i ++, p ++){v = Answer[0];for (j = 1; j < cols; j ++, p ++)v += *p * Answer[j];printf("%12.2lf%12.2lf%12.2lf%12.2lf ", *p, v, *p - v, (*p - v) * (*p - v));}system("pause");}int main(){double Answer[2], SquarePoor[4];if (LinearRegression((double*)data1, 12, &Answer[0], &Answer[1], Square Poor) == 0)Display((double*)data1, Answer, SquarePoor, 12, 2);return 0;}运⾏结果:上⾯的函数和例⼦程序不仅计算了回归⽅程式,还计算了显著性检验指标,例如F检验指标,我们可以在统计F分布表上查到F0.01(1,10)=10.04(注:括号⾥的1,10分别为回归平⽅和和剩余平⽅和所拥有的⾃由度),⼩于计算的F检验值25.94,可以认为该回归例⼦⾼度显著。
c拿法计算公式
c拿法计算公式以C语言为工具,我们可以使用各种算法和数据结构来实现各种复杂的计算。
在本文中,我们将探讨一些常见的公式和它们在C语言中的实现方法。
一、线性方程的求解线性方程是最简单的数学方程之一,可以表示为Ax + By = C。
在C语言中,我们可以使用以下代码来求解线性方程:```c#include <stdio.h>int main() {// 定义方程的系数和常数int A = 2;int B = 3;int C = 10;// 求解x和y的值int x = (C - B) / A;int y = (C - A) / B;// 输出结果printf("x = %d, y = %d\n", x, y);return 0;}```二、二次方程的求解二次方程是形如Ax^2 + Bx + C = 0的方程,其中A、B和C为常数。
在C语言中,我们可以使用以下代码来求解二次方程:```c#include <stdio.h>#include <math.h>int main() {// 定义方程的系数double A = 1.0;double B = -3.0;double C = 2.0;// 求解方程的根double delta = B * B - 4 * A * C;double x1, x2;if (delta > 0) {x1 = (-B + sqrt(delta)) / (2 * A);x2 = (-B - sqrt(delta)) / (2 * A);printf("x1 = %.2f, x2 = %.2f\n", x1, x2);} else if (delta == 0) {x1 = -B / (2 * A);printf("x1 = x2 = %.2f\n", x1);} else {printf("方程无实数根\n");}return 0;}```三、三角函数的计算三角函数是数学中重要的函数之一,包括正弦、余弦和正切等。