标题:对称正定矩阵的cholesky分解法程序,版主老大们来救命啊...怎么没有人来帮忙 ...
只看楼主
李若斌
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:219
专家分:184
注 册:2009-9-30
结帖率:90.48%
已结贴  问题点数:30 回复次数:3 
对称正定矩阵的cholesky分解法程序,版主老大们来救命啊...怎么没有人来帮忙看下啊。。。
这个是一个cholesky分解法的程序,书上的说明:
a矩阵是对称正定的系数矩阵,根据a=b*bT(b的转置矩阵)的分解方法求b矩阵的元素。且b矩阵是下三角矩阵,
#include <stdio.h>
#include <math.h>
#define m 3
void main()
{
    float a[m][m],b[m][m],c[m][m],i,j,k,sum;
    printf("enter a[m][m]:");
    for(i=0;i<m;i++)
    {                                     //**输入 4  -1  1
        for(j=0;j<m;j++)                  //**     -1  2  -2  
        {                                 //**      1  -2  3
            scanf("%f",&a[i][j]);         
        }
    }
    printf("a[m][m]:");  
    for(i=0;i<m;i++)   
    {
        for(j=0;j<m;j++)
        {
            printf("%3.2f ",a[i][j]);
        }
        printf("\n");
    }                      //**程序执行到了这里就不再执行下去了,大家帮忙找下下面的错误,
    for(i=0;i<m;i++)
    {
        for(j=0;j<m;j++)
        {
            if(j<=i) b[i][j]=1;
            else b[i][j]=0;
        }
    }
      for(i=0;i<m;i++)
    {
        for(j=0;j<m;j++)
        {
            c[i][j]=0;
        }
    }
    b[0][0]=sqrt(a[0][0]);
    for(i=1,j=0;i<m;i++)
     {
         b[i][j]=a[i][j]/b[0][0];
     }
    for(i=1;i<m;i++)
    {
        for(j=1;j<=i;j++)
        {
            sum=0;
            if(j==i)
            {
                for(k=0;k<i;k++)
                {
                    sum=b[i][k]*b[i][k]+sum;
                }
                b[i][j]=sqrt((a[i][j]-sum));
            }
            else if(j<i)
            {
                for(k=0;k<j;k++)
                {
                    sum=b[i][k]*b[j][k]+sum;
                }
                b[i][j]=(a[i][j]-sum)/b[j][j];
            }
        }
    }
    for(i=0;i<m;i++)
    {
        for(j=0;j<=i;k++)
        {
            c[j][i]=b[i][j];
        }
    }
    printf("b[m][m]:");
    for(i=0;i<m;i++)
    {
        for(j=0;j<m;j++)
        {
            printf("%6.3f ",b[i][j]);
        }
        printf("\n");
    }
    printf("c[m][m]:");
    for(i=0;i<m;i++)
    {
        for(j=0;j<m;j++)
        {
            printf("%6.3f ",c[i][j]);
        }
        printf("\n");
    }
 getch();
}

[ 本帖最后由 李若斌 于 2009-12-23 16:21 编辑 ]
搜索更多相关主题的帖子: 矩阵 cholesky 老大 版主 分解 
2009-12-23 12:40
李若斌
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:219
专家分:184
注 册:2009-9-30
得分:0 
我自己顶一下,一种在线等待,大家有什么问题请问下,不大明白的话可以去百度下那个分解方法,其实我自己也不是很清楚那个分解法的,我也没学过计算物理,这个是我女朋友的课程设计要求用C写,我就叫她讲解了一下方法,然后根据理解写出来的程序,大家千万帮个忙找下,不胜感激,这个不算作业贴的吧。我自己都做出来了,就是有点错误,希望能得到各位高手的指点下我,本人自学,也找不到人帮忙。大家千万别嫌麻烦。。。小弟在这边多谢各位了。。。。
2009-12-23 16:24
lijm1989
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:珠海
等 级:贵宾
威 望:12
帖 子:675
专家分:2844
注 册:2009-10-14
得分:30 
首先。。i和j和k是用于下标的。。作index改为int类型合适点。。好习惯。。

然后到LZ不能执行的地方不是你说的那里,是在下面黑体那里,LZ看了应该很明白了吧。。跳不出循环啊。。

for(i=0;i<m;i++)
{
for(j=0;j<=i;k++)
{
c[j][i]=b[i][j];
}
}
现在去看看那个算法哈···
2009-12-23 17:11
李若斌
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:219
专家分:184
注 册:2009-9-30
得分:0 
感谢感谢..因为这个仓促的很..结果只是大致的想到了一些问题..谢谢....回去运行下...
2009-12-23 17:18



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-294129-1-1.html




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

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