| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1873 人关注过本帖, 1 人收藏
标题:松弛迭代法C程序
只看楼主 加入收藏
冰越
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2016-3-19
结帖率:0
收藏(1)
已结贴  问题点数:20 回复次数:4 
松弛迭代法C程序
跪求各位大神 编写一个关于线性方程组的松弛迭代法C程序
2016-03-21 15:02
alice_usnet
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:18
帖 子:370
专家分:2020
注 册:2016-3-7
收藏
得分:20 
/*
超松弛迭代求解线性方程组
*/
#include<stdio.h>
#include<math.h>
#define MAX_N 20  /*方程最大维数*/
#define MAXREPT 100
#define EPSILON 0.00001  /*求解精度*/
int main()
{
  int n,i,j,k;
  double err,w;
  double a[MAX_N][MAX_N],b[MAX_N][MAX_N],c[MAX_N],g[MAX_N],x[MAX_N],nx[MAX_N];
  printf("input n value(dim ofAX=C):");  /*输入方程的维数*/
  while(scanf("%d",&n)==1&&n>0&&n<=MAX_N){  /*以0结束输入*/
    printf("now input the matrix a(i),i=0,...,%d:\n",n-1);
    for(i=0;i<n;i++)  /*输入AX=C的A矩阵*/
      for(j=0;j<n;j++)
        scanf("%lf",&a[i][j]);
    printf("now input the matrix c(i),i=0,..,%d:\n",n-1);
    for(i=0;i<n;i++)
      scanf("%lf",&c[i]);
    printf("now input the w value:");
    while(scanf("%lf",&w)!=1||w<1||w>2)
      printf("w must between 1 and 2,please enter again.\n");
    for(i=0;i<n;i++)  /*改造x_{k+1}=bx_{k}+g迭代矩阵*/
      for(j=0;j<n;j++){
        b[i][j]=-a[i][j]/a[i][i];
    g[i]=c[i]/a[i][i];
      }
    for(i=0;i<MAXREPT;i++){
      for(j=0;j<n;j++)
        nx[j]=g[j];
      for(j=0;j<n;j++){
        for(k=0;k<j;k++)
      nx[j]+=b[j][k]*nx[k];  /*迭代*/
        for(k=j+1;k<n;k++)
      nx[j]+=b[j][k]*x[k];
    nx[j]=(1-w)*x[j]+w*nx[j];
      }
      err=0;
      for(j=0;j<n;j++)
        if(err<fabs(nx[j]-x[j]))
      err=fabs(nx[j]-x[j]);  /*误差计算*/
      for(j=0;j<n;j++)
        x[j]=nx[j];
    }
      if(err<EPSILON){
        printf("solve problem:x_i=\n");
        for(i=0;i<n;i++)
          printf("%lf ",x[i]);
        printf("\n");
      }
   
    continue;
    printf("after %d repeat,no result...\n",MAXREPT);
  }
  return 0;
}
   
图片附件: 游客没有浏览图片的权限,请 登录注册


未佩好剑,转身便已是江湖
2016-03-21 16:36
冰越
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2016-3-19
收藏
得分:0 
回复 2楼 alice_usnet
非常感谢!
2016-03-22 16:09
冰越
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2016-3-19
收藏
得分:0 
/*
超松弛迭代求解线性方程组
*/
#include<stdio.h>
#include<math.h>
#define MAX_N 20  /*方程最大维数*/
#define MAXREPT 100
#define EPSILON 0.00001  /*求解精度*/
int main()
{
  int n,i,j,k;
  double err,w;
  double a[MAX_N][MAX_N],b[MAX_N][MAX_N],c[MAX_N],g[MAX_N],x[MAX_N],nx[MAX_N];
  printf("input n value(dim ofAX=C):");  /*输入方程的维数*/
  while(scanf("%d",&n)==1&&n>0&&n<=MAX_N){  /*以0结束输入*/
    printf("now input the matrix a(i),i=0,...,%d:\n",n-1);
    for(i=0;i<n;i++)  /*输入AX=C的A矩阵*/
      for(j=0;j<n;j++)
        scanf("%lf",&a[i][j]);
    printf("now input the matrix c(i),i=0,..,%d:\n",n-1);
    for(i=0;i<n;i++)
      scanf("%lf",&c[i]);
    printf("now input the w value:");
    while(scanf("%lf",&w)!=1||w<1||w>2)
      printf("w must between 1 and 2,please enter again.\n");
    for(i=0;i<n;i++)  /*改造x_{k+1}=bx_{k}+g迭代矩阵*/
      for(j=0;j<n;j++){
        b[i][j]=-a[i][j]/a[i][i];
    g[i]=c[i]/a[i][i];
      }
    for(i=0;i<MAXREPT;i++){
      for(j=0;j<n;j++)
        nx[j]=g[j];
      for(j=0;j<n;j++){
        for(k=0;k<j;k++)
      nx[j]+=b[j][k]*nx[k];  /*迭代*/
        for(k=j+1;k<n;k++)
      nx[j]+=b[j][k]*x[k];
    nx[j]=(1-w)*x[j]+w*nx[j];
      }
      err=0;
      for(j=0;j<n;j++)
        if(err<fabs(nx[j]-x[j]))
      err=fabs(nx[j]-x[j]);  /*误差计算*/
      for(j=0;j<n;j++)
        x[j]=nx[j];
    }
      if(err<EPSILON){
        printf("solve problem:x_i=\n");
        for(i=0;i<n;i++)
          printf("%lf ",x[i]);
        printf("\n");
      }
   
    continue;
    printf("after %d repeat,no result...\n",MAXREPT);
  }
  return 0;
}
   
输入松弛因子后就停止了   下面的程序无法实现怎么办?
2016-03-22 20:18
alice_usnet
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:18
帖 子:370
专家分:2020
注 册:2016-3-7
收藏
得分:0 
回复 4楼 冰越
不会停止呀,看二楼截图

未佩好剑,转身便已是江湖
2016-03-23 12:25
快速回复:松弛迭代法C程序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025367 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved