| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1406 人关注过本帖
标题:雅克比迭代出现.exe停止工作
只看楼主 加入收藏
汪大象
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2016-3-14
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:7 
雅克比迭代出现.exe停止工作
#include<stdio.h>
#include<math.h>
#define N 6
void Jacobi(float a[][6], float b[], int n, float x0[], float delta, int maxn)//雅克比迭代法
{
    int k, i, j;
    float sum=0, err=0, x1[6]={0,0,0,0,0,0};
    for (k = 0; k < maxn; k++)
    {
        for (i = 0; i<n; i++)
        {
            for (j = 0; j<i; i++)
                sum += a[i][j] * x0[j];
            for (j = i + 1; j<n; j++)
                sum += a[i][j] * x0[j];

            x1[i] = (b[i] - sum) / a[i][i];
            err += (x1[i] - x0[i])*(x1[i] - x0[i]);
            sum = 0;
        }
        for(i=0;i<N;i++)
            x0[i]=x1[i];
        err = sqrt(err);
        if (err < delta)
            break;
    }
    if (k >= maxn-1)
        printf("此次迭代发散,结果作废");
    else
    {
        printf("经过%d次雅克比迭代得到以下解向量\n", k+1);
        for (i = 0; i<N; i++)
            printf("%3.4f", x0[i]);
    }
}


void GaussSeidel(float a[][6], float b[], int n, float x0[], float delta, int maxn)//高斯-赛德尔迭代
{
    int k, i, j;
    float sum=0, err=0, Temporary=0;
    for (k = 1; k <= maxn; k++)
    {
        for (i = 0; i<n; i++)
        {
            for (j = 0; j<i; i++)
            {
                sum += a[i][j] * x0[j];
            }
            for (j = i + 1; j<n; j++)
            {
                sum += a[i][j] * x0[j];
            }

            Temporary = (b[i] - sum) / a[i][i];
            err += (Temporary - x0[i])*(Temporary - x0[i]);

            x0[i] = Temporary;
            sum = 0;
        }
        err = sqrt(err);
        if (err < delta)
            break;
    }
    if (k == maxn)
        printf("此次迭代发散,结果作废");
    else
    {
        printf("经过%d次高斯-赛德尔迭代得到以下解向量\n", k);
        for (i = 0; i<N; i++)
            printf("%3.4f", x0[i]);
    }
}



void main()
{
    float A[N][N], x0[N]={0,0,0,0,0,0}, b[N], delta=0.0001;
    int i, j, k,maxn, n=6;

    FILE *fp=fopen("inA.txt","r"),*fq=fopen("inb.txt","r");

    if(!fp)
    {
        printf("file inA.txt can't open\n");
    }
    if(!fq)
    {
        printf("file inb.txt can't open\n");
    }
    while(!feof(fp))
    {
        for (i = 0; i < N; i++)
            for (j = 0; j < N; j++)
                fscanf(fp,"%f", &A[i][j]);
        printf("读入的A矩阵如下:\n");
        for (i = 0; i < N; i++)
        {
            for (j = 0; j < N; j++)
                printf("%8.1f", A[i][j]);
            printf("\n");
        }
        printf("\n\n");
    }

    while(!feof(fq))
    {
        for(i=0;i<N;i++)
            fscanf(fq,"%f", &b[i]);
        printf("读入的b系数矩阵如下:\n");
        for (i = 0; i < N; i++)
            printf("%8.1f", b[i]);
        printf("\n");
    }

    printf("请输入迭代最大次数\n");
    scanf("%d", &maxn);

    printf("请选择算法:\n1.雅克比迭代\n2.高斯赛德尔迭代\n");
    scanf("%d",&k);
    if(k==1)
        Jacobi(A, b, n, x0, delta, maxn);//调用雅克比迭代法
    else
        GaussSeidel(A, b, n, x0, delta, maxn);//调用高斯赛德尔迭代法

}
搜索更多相关主题的帖子: include 
2016-04-19 11:06
grmmylbs
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:54
帖 子:1409
专家分:5845
注 册:2016-2-14
收藏
得分:0 
把两个txt也附一下。
2016-04-19 11:54
诸葛欧阳
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:流年
等 级:贵宾
威 望:82
帖 子:2790
专家分:14619
注 册:2014-10-16
收藏
得分:0 
雅个比具体是什么来着?完全忘了

一片落叶掉进了回忆的流年。
2016-04-19 11:56
汪大象
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2016-3-14
收藏
得分:0 
回复 2楼 grmmylbs
inA,inb.zip (694 Bytes)
2016-04-19 12:10
汪大象
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2016-3-14
收藏
得分:0 
回复 2楼 grmmylbs
不能附TXT,就附的压缩文件了

我自己推断可能是红色部分粗问题了,但就是找不出;望大侠指点

void Jacobi(float a[][6], float b[], int n, float x0[], float delta, int maxn)//雅克比迭代法
{
    int k, i, j;
    float sum=0, err=0, x1[6]={0,0,0,0,0,0};
    for (k = 0; k < maxn; k++)
    {
        for (i = 0; i<n; i++)
        {
            for (j = 0; j<i; i++)
                sum += a[i][j] * x0[j];
            for (j = i + 1; j<n; j++)
                sum += a[i][j] * x0[j];

            x1[i] = (b[i] - sum) / a[i][i];
            err += (x1[i] - x0[i])*(x1[i] - x0[i]);
            sum = 0;
        }

        for(i=0;i<N;i++)
            x0[i]=x1[i];
        err = sqrt(err);
        if (err < delta)
            break;
    }
    if (k >= maxn-1)
        printf("此次迭代发散,结果作废");
    else
    {
        printf("经过%d次雅克比迭代得到以下解向量\n", k+1);
        for (i = 0; i<N; i++)
            printf("%3.4f", x0[i]);
    }
}
2016-04-19 12:12
汪大象
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2016-3-14
收藏
得分:0 
回复 3楼 诸葛欧阳
迭代求方程组近似解得
2016-04-19 12:28
grmmylbs
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:54
帖 子:1409
专家分:5845
注 册:2016-2-14
收藏
得分:20 
不清楚迭代次数应该输多少,不过第二个for循环,这里应该是j++
  for (j = 0; j<i; i++)
2016-04-19 13:17
汪大象
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2016-3-14
收藏
得分:0 
回复 7楼 grmmylbs
万分感谢啊,我调了半天啊,都要哭了,竟然犯这种错误,醉了
2016-04-19 13:49
快速回复:雅克比迭代出现.exe停止工作
数据加载中...
 
   



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

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