求解方程Ax=b的通用程序

在cpp所在的文件夹中创建一个txt文件,并且将条件这个输入:%矩阵行数9%矩阵列数9%矩阵元素31 -13 0 0 0 -10 0 0 0-13 35 -9 0 -11 0 0 0 00 -9 31 -10 0 0 0 0 00 0 -10 79 -30 0 0 0 -90 0 0 -30 57 -7 0 -5 00 0 0 0 -7 47 -30 0 00 0 0 0 0 -30 41 0 00 0 0 0 0 -5 0 0 27 -20 0 0 -9 0 0 0 -2 29 %对应的右侧的元素:-15 27 -23 0 -20 12 -7 7 10 #include#include#include#define R 50#define C 50using namespace std;float Mar[R][C];int InputToTxt(float a,float b);int sort(float a[],int n);void getGauss(float bk[],float num);float jidu(float a);int exchangeMar(int m,int curpos);int chude(int num,int curpos);float sum(float xx[],float yy[],int num);void solve(int curpos);float row,col;int main(void){FILE *stream;char msg[40]; float bb[R];stream=fopen("data.txt","r"); fseek(stream,0,SEEK_SET);fgets(msg,20,stream);printf("%s",msg);float a,b;fscanf(stream,"%f",&a);cout<<a<<endl;fseek(stream,2,1); fgets(msg,20,stream);printf("%s",msg);fscanf(stream,"%f",&b);cout<<b<<endl;row=a;col=b+1;fseek(stream,2,1); fgets(msg,20,stream); printf("%s",msg); for(int i=0;i<a;i++){for(int j=0;j<b;j++){fscanf(stream,"%f",&Mar[i][j]);cout<<Mar[i][j]<<" ";}cout<<endl;}fseek(stream,4,1);fgets(msg,40,stream);printf("%s",msg);for(int k=0;k<a;k++){ fscanf(stream,"%f",&bb[k]); cout<<bb[k]<<" ";};cout<<endl;//得到增广矩阵,并且将增广矩阵放到文件中去for(int ii=0;ii<a;ii++){Mar[ii][int(b)]=bb[ii];}fclose(stream);int curpos1=InputToTxt(a,b+1); //现在我要将里面的值进行交换 int curpos2=exchangeMar(0,curpos1); int curpos4=curpos2; //现在我要用第二行去消去第三行 for(int i5=1;i5<a-1;i5++){ curpos4=chude(i5,curpos4);} //现在要做的是解方程 solve(curpos4); return 0;}//将增广矩阵输入到文件中 int InputToTxt(float a,float b) {FILE *stream=fopen("data.txt","a+");char str[]="%增广矩阵:"; fprintf(stream,"%s",str); fprintf(stream,"\n");int curpos=ftell(stream);for(int i=0;i<a;i++){for(int j=0;j<b;j++){fprintf(stream,"%f",Mar[i][j]);fprintf(stream,"%c"," ");} fprintf(stream,"\n"); }fclose(stream);return curpos; } //从矩阵中获取一列的元素int sort(float a[],int n){float max=a[0];int k=0;for(int i=1;i<n;i++){ if(max<a[i]){max=a[i];k=i;}}//此时返回的是数组对应的元素的下标return k;}//这个函数是得到一个gauss变换的矩阵并且将这个矩阵在写文件上int exchangeMar(int m,int curpos){float G1[50][50];char ch; FILE *stream;stream=fopen("data.txt","r");fseek(stream,curpos,0);cout<<"增广矩阵"<<endl;cout<<"-----------------------------------------------------------"<<endl; for(int i=0;i<row;i++){for(int j=0;j<col;j++){ fscanf(stream,"%f",&G1[i][j]); fscanf(stream,"%c",&ch); cout<<G1[i][j]<<" ";}cout<<endl;}cout<<"-----------------------------------------------------------"<<endl;//我要第一列进行Gauss消去float ga=-G1[1][0]*1.0/G1[0][0]; for(int i1=0;i1<col;i1++){ if(G1[0][i1]!=0){ G1[1][i1]=G1[1][i1]+G1[0][i1]*ga;}}for(int i4=1;i4<row;i4++){if(G1[i4][0]!=0){ga=-G1[i4][0]*1.0/G1[0][0]; for(int j4=0;j4<col;j4++){ G1[i4][j4]=G1[i4][j4]+G1[0][j4]*ga;}}}cout<<"第一次初等行变换之后:"<<endl; cout<<"-------------------------------------------------------------"<<endl; for(int i2=0;i2<row;i2++){for(int j2=0;j2<col;j2++){ if(jidu(G1[i2][j2])<0.0001) { G1[i2][j2]=0; } cout<<G1[i2][j2]<<" ";}cout<<endl;}cout<<"--------------------------------------------------------------"<<endl;fclose(stream);//现在要将这个矩阵写入到文件中 stream=fopen("data.txt","a+");char msg[]="第一次初等行变换之后:";fprintf(stream,"%s",msg);fprintf(stream,"\n");int curpos1=ftell(stream);for(int i3=0;i3<row;i3++){for(int j3=0;j3<col;j3++){fprintf(stream,"%f",G1[i3][j3]);fprintf(stream,"%c"," ");}fprintf(stream,"\n");}fclose(stream);return curpos1;}float jidu(float a){if(a<0)return -a;elsereturn a;}int chude(int num,int curpos){//获取上一次的矩阵 float bk[50][50];char ch;FILE *stream=fopen("data.txt","r");fseek(stream,curpos,0);//获取第一次行变换之后的矩阵for(int i=0;i<row;i++){for(int j=0;j<col;j++){fscanf(stream,"%f",&bk[i][j]);fscanf(stream,"%c",&ch);}}fclose(stream);//用第二行去消去第三行float aa=-bk[num+1][num]*1.0/bk[num][num];for(int i1=0;i1<col;i1++){ if(bk[num][i1]!=0){ bk[num+1][i1]=bk[num+1][i1]+bk[num][i1]*aa;}} for(int i4=num+1;i4<row;i4++){if(bk[i4][num]!=0){aa=-bk[i4][num]*1.0/bk[num][num]; for(int j4=0;j4<col;j4++){ bk[i4][j4]=bk[i4][j4]+bk[num][j4]*aa;}}}cout<<"第"<<num+1<<"初等行变换之后的矩阵:"<<endl;cout<<"-----------------------------------------------"<<endl;for(int i2=0;i2<row;i2++){for(int j2=0;j2<col;j2++){if(jidu(bk[i2][j2])<0.0001){ bk[i2][j2]=0;}cout<<bk[i2][j2]<<" ";}cout<<endl;}cout<<"------------------------------------------------"<<endl;//现在要做的是将这个矩阵写到文件中去 stream=fopen("data.txt","a+"); char msg[]="然后再初等变换之后的矩阵:"; fprintf(stream,"%s",msg); fprintf(stream,"\n"); curpos=ftell(stream); for(int i3=0;i3<row;i3++) { for(int j3=0;j3<col;j3++) { fprintf(stream,"%f",bk[i3][j3]); fprintf(stream,"%c"," "); } fprintf(stream,"\n"); } fclose(stream); return curpos;}void solve(int curpos){//首先是从文件中获取到这个矩阵FILE *stream=fopen("data.txt","r");float xx[50];float bk[50][50];char ch;fseek(stream,curpos,0);for(int i=0;i<row;i++){for(int j=0;j<col;j++){fscanf(stream,"%f",&bk[i][j]);fscanf(stream,"%c",&ch);}}cout<<"方程组Ax=b的解:"<<endl; cout<<"--------------------------------------------"<=0;i1--){ xx[i1]=(bk[i1][9]-sum(xx,bk[i1],i1))/bk[i1][i1];}for(int i2=0;i2<row;i2++){cout<<"X"<<i2+1<<"= "<<xx[i2]<<endl;} }float sum(float xx[],float yy[],int num){float summ=0.0;for(int i=1;i<row-num;i++){summ+=yy[num+i]*xx[num+i];}return summ;}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: SOR(逐次超松弛)方法是一种用于n阶线性方程ax=b的迭代方法。其通用程序如下: 1. 初始化迭代参数:令初始向量x^(0) = (0, 0, ..., 0)^(T),迭代次数k = 0,设定松弛因子ω。 2. 对于每个迭代步骤k: a. 对于每个未知数x_i (i = 1, 2, ..., n): i. 计算下一迭代步骤中的更新:x_i^(k+1) = (1 - ω) * x_i^(k) + (ω/a_ii) * (b_i - Σ(a_ij * x_j^(k))),其中 j ≠ i。 b. 增加迭代次数:k = k + 1。 3. 继续迭代直到满足停止准则,如: a. 达到指定的最大迭代次数。 b. x^(k+1) - x^(k) 的范数小于指定的收敛容限ε。 4. 输出最终向量x^(k+1)。 其中,a 是系数矩阵,x 是未知数向量,b 是常数向量,ω 是松弛因子(一般来说,取 0 < ω < 2 是比较合理的选择)。 SOR方法逐步更新每个未知数的值,并将上一步的更新结果用于当前步骤的计算,从而达到逐次迭代的目的。松弛因子ω的选择影响了更新的速度和收敛性。一般来说,合适的松弛因子能够加快收敛速度,但选择不当可能导致方法发散。 在实际应用中,通常需要通过试验和调整来选择适合的松弛因子和收敛容限,以获得满意的。 ### 回答2: SOR(Successive Over-Relaxation)方法是一种迭代方法,用于决n阶线性方程ax=b。通常情况下,我们将线性方程组表示为矩阵形式Ax=b,其中A是一个n×n的矩阵,x和b是n维向量。 SOR方法的通用程序如下: 1. 输入矩阵A、向量b、迭代初值x0、迭代次数N、松弛因子ω和收敛精度ε。 2. 初始化迭代计数器k=0。 3. 当k<N时,执行以下迭代步骤: a. 初始化新向量x_new。 b. 对于每个未知数x(i),计算新x_new(i): i. 初始化和变量sum1=0,sum2=0。 ii. 对于每个已知数x(j),计算: sum1 += A(i,j) * x(j),当j<i时。 sum2 += A(i,j) * x_new(j),当j>i时。 iii. 计算新x_new(i) = (1-ω) * x(i) + (ω/A(i,i)) * (b(i) - sum1 - sum2)。 c. 根据新与上一次的差异判断是否达到收敛条件: i. 如果 ||x_new - x|| < ε,则停止迭代。 ii. 否则,更新迭代计数器k=k+1,将新x_new赋值给x。 4. 输出向量x。 这个通用程序可以用于决任意阶数的线性方程组,只需输入相应的系数矩阵A、常数向量b、初始向量x0、迭代次数N、松弛因子ω和收敛精度ε即可。SOR方法的优点是收敛速度相对较快,特别适用于对角元素较大的矩阵。 ### 回答3: SOR(Successive Over-Relaxation)方法是一种用于n阶线性方程ax=b的迭代方法。下面是一个通用程序的实现过程。 首先,为了使用SOR方法线性方程组,需要计算矩阵A的松弛因子ω。通常情况下,选择一个合适的松弛因子可以加速迭代的收敛速度。一般而言,松弛因子的取值范围在(0, 2)之间。 然后,需要定义初始向量x0和迭代步数N。初始向量可以选择一个任意的近似,通常为一个全零向量。迭代步数表示算法中进行迭代的次数,一般需要根据实际情况进行选择。 接下来,开始迭代过程。在每一步迭代中,通过以下公式来更新向量x的各个分量: x(i+1) = (1-ω)x(i) + ω/T(i) * (b(i) - Σ(a(i, j) * x(j))) 其中,i表示迭代的步数,j表示矩阵A中的列数。T(i)表示矩阵A中第i行的主对角元素。 在迭代过程中,需要循环进行N次迭代,直到满足停止准则。停止准则可以选择迭代步数达到N次,或者某一迭代步数的x向量的误差小于给定的误差界。误差可以通过计算两个相邻迭代步数x向量的欧氏距离来确定。 最后,当满足停止准则后,迭代结束,x向量即为线性方程组的近似。 总结起来,SOR方法n阶线性方程ax=b的通用程序包括计算松弛因子、定义迭代步数和初始向量、进行迭代更新向量、设置停止准则。通过多次迭代过程,得到线性方程组的近似
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值