鱼C论坛

 找回密码
 立即注册
查看: 1204|回复: 10

[已解决]求助大神!做矩阵PALU分解时,遇见了不懂的事情!

[复制链接]
发表于 2018-1-23 12:11:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
def exc_row(B,Q,j):
    n = B.shape[0]
    A = B.copy()
    P = Q.copy()
    for i in range(j,n):
        if A[i,j] >= A[j,j]:
            maxIndex = i   
    tempA = A[maxIndex,:].copy()
    A[maxIndex,:] = A[j,:]
    A[j,:] = tempA
    tempP = P[maxIndex,:].copy()
    P[maxIndex,:] = P[j,:]
    P[j,:] = tempP
    return A,P
   
def palu(A):
    n = A.shape[0]
    U = A.copy()
    L = eye(n)
    P = eye(n)
    for j in range(n-1):
        [U,P] = exc_row(U,P,j)
        for i in range(j+1,n):
            mult = U[i,j]/U[j,j]
            U[i,j] = mult
            print(mult)
            print(U[i,j])

            for k in range(j+1,n):
                U[i,k] = U[i,k] - mult*U[j,k]

    return P,L,U

就是在红色那一段,最后U[i,j]居然等于0,我print之后明明mult都可以显示数值,但是一赋值给U[i,j]就等于0了。

有没有大神能帮忙解决一下这个问题啊
最佳答案
2018-1-23 13:48:13
wuxianke 发表于 2018-1-23 13:29
已在七楼附上完整代码。

测试了一下,因为你计算的mult都是小数,而你初始化A的时候都是用的整数,所以其被取整,变成了0
请初始化的时候修改A中的某一个值,比如
A = array([[2.0,1,5],[4,4,-4],[1,3,1]])
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-1-23 12:22:47 | 显示全部楼层

回帖奖励 +1 鱼币

你的代码是全的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-23 12:24:06 | 显示全部楼层
我又试了下,直接用某个矩阵B,mult = B[2,1]/B[1,1],B[2,1] = mult,B[2,1]还是返回0啊。
这是什么道理啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-23 12:56:21 | 显示全部楼层
请给出你的完整代码
如果你使用了诸如numpy之类的第三方库,你要在前面使用import导入,不然根本不知道你的shape, eye这样的东西哪里来的
其次,你只给给出了2个函数定义,具体运行时你传入的参数又是什么样的,矩阵A是什么样的,起码要有个测试用的样例
还有,代码请用代码格式发
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-23 13:20:59 | 显示全部楼层
BngThea 发表于 2018-1-23 12:22
你的代码是全的?

没有,是部分的,稍等一下,我传全部的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-23 13:22:07 | 显示全部楼层
DarkmasterSugar 发表于 2018-1-23 12:56
请给出你的完整代码
如果你使用了诸如numpy之类的第三方库,你要在前面使用import导入,不然根本不知道你 ...

恩恩,好的谢谢提醒。稍等
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-23 13:28:31 | 显示全部楼层
  1. from numpy import dot,array,eye,where,zeros

  2. def exc_row(B,Q,j):
  3.     n = B.shape[0]
  4.     A = B.copy()
  5.     P = Q.copy()
  6.     for i in range(j,n):
  7.         if A[i,j] >= A[j,j]:
  8.             maxIndex = i   
  9.     tempA = A[maxIndex,:].copy()
  10.     A[maxIndex,:] = A[j,:]
  11.     A[j,:] = tempA
  12.     tempP = P[maxIndex,:].copy()
  13.     P[maxIndex,:] = P[j,:]
  14.     P[j,:] = tempP
  15.     return A,P
  16.    
  17. def palu(A):
  18.     n = A.shape[0]
  19.     U = A.copy()
  20.     L = eye(n)
  21.     P = eye(n)
  22.     for j in range(n-1):
  23.         [U,P] = exc_row(U,P,j)
  24.         for i in range(j+1,n):
  25.             mult = U[i,j]/U[j,j]
  26.             U[i,j] = mult
  27.             print(mult)
  28.             print(U[i,j])
  29.             for k in range(j+1,n):
  30.                 U[i,k] = U[i,k] - mult*U[j,k]
  31.     return P,L,U    #这里的L还没有写,还在测试刚刚提出的问题
  32.         
  33. def backsolve(U,b):
  34.     n = U.shape[0]
  35.     x = zeros((n,1))
  36.     for i in range(n-1,-1,-1):
  37.         if i != n-1:
  38.             for k in range(i+1,n-1):
  39.                 b[i] = b[i] - x[i]*U[i,k]
  40.         x[i] = b[i]/U[i,i]
  41.         
  42. def l2u(L):
  43.     n = L.shape[0]
  44.     Lu = eye(n)
  45.     for j in range(n):
  46.         for i in range(j,n):
  47.             Lu[n-1-i,n-1-j] = L[i,j]
  48.     return Lu

  49. def one_reverse(b):
  50.     n = b.shape[0]
  51.     b_rev = zeros((n,1))
  52.     for i in range(n):
  53.         b_rev[i,0] = b[n-1-i,0]
  54.     return b_rev   

  55. def palusolve(A,b):
  56.     [P,L,U] = palu(A)
  57.     Lu = l2u(L)   
  58.     c = backsolve(Lu,one_reverse(dot(P,b)))
  59.     x = backsolve(U,one_reverse(c))
  60.     return x
复制代码


测试的矩阵是:A = array([[2,1,5],[4,4,-4],[1,3,1]]),测试的函数是[P,L,U] = palu(A)
输出的U是:array([[ 4,  4, -4],[ 0,  2,  2],[ 0,  0,  8]]);
就是那几个0的地方,我是进行了U[i,j] = mult操作的,而mult是不等零的。不知道是哪里的问题,所以向各位请教了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-23 13:29:27 | 显示全部楼层
BngThea 发表于 2018-1-23 12:22
你的代码是全的?

已在七楼附上完整代码。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-23 13:30:36 | 显示全部楼层
DarkmasterSugar 发表于 2018-1-23 12:56
请给出你的完整代码
如果你使用了诸如numpy之类的第三方库,你要在前面使用import导入,不然根本不知道你 ...

已在七楼附上完整代码。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-23 13:48:13 | 显示全部楼层    本楼为最佳答案   
wuxianke 发表于 2018-1-23 13:29
已在七楼附上完整代码。

测试了一下,因为你计算的mult都是小数,而你初始化A的时候都是用的整数,所以其被取整,变成了0
请初始化的时候修改A中的某一个值,比如
A = array([[2.0,1,5],[4,4,-4],[1,3,1]])
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-23 13:54:07 | 显示全部楼层
BngThea 发表于 2018-1-23 13:48
测试了一下,因为你计算的mult都是小数,而你初始化A的时候都是用的整数,所以其被取整,变成了0
请初始 ...

啊,原来如此,谢谢谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-11 04:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表