繁体   English   中英

Python函数通过反向替换来解决Ax = b

[英]Python function to solve Ax = b by back substitution

好的,对于我的数值方法课,我有以下问题:

编写一个Python函数,通过反向替换求解Ax = b,其中A是一个上三角非奇异矩阵。 用于此的MATLAB代码在第190页,如果您愿意,可以将其用作伪代码指南。 该函数应作为输入A和b并返回x。 你的函数不需要检查A是非奇异的。 也就是说,假设只有非奇异的A将被传递给你的函数。

它引用的MATLAB代码是:

x(n) = c(u)/U(n,n) 
for i = n-1 : -1 : 1
  x(i) = c(i);
  for j = i+1 : n 
    x(i) = x(i) - U(i,j)*x(j);
    end
  x(i) = x(i)/U(i,i);
end

我使用MATLAB代码片段编写的Python代码是一个上三角形测试矩阵(不确定它是非奇异的!如何测试奇点?):

from scipy import mat
c=[3,2,1]
U=([[6,5,1],[0,1,7],[0,0,2]])
a=0
x=[]
while a<3:
    x.append(1)
    a=a+1

n=3
i=n-1
x[n-1]=c[n-1]/U[n-1][n-1]
while i>1: 
    x[i]=c[i]
    j=i+1
    while j<n-1:
        x[i]=x[i]-U[i][j]*x[j];
    x[i]=x[i]/U[i][i]
    i=i-1
print mat(x)

我得到的答案是x [[1 1 0]]。 我不确定我是否正确这样做。 我认为这是错误的,无法弄清楚接下来该做什么。 有线索吗?

j=i+1
while j<n-1:
    x[i]=x[i]-U[i][j]*x[j];

是无限的...永远不会被执行

你的索引是满的:

for i in range(n-2,-1,-1):
....
    for j in range(i+1,n):

注意,范围是半开放的,不像matlab

我看到的一个问题是你的输入由整数组成,这意味着Python将对它们进行整数除法,当你想要的是浮点除法时,它会将3/4变为0 你可以通过添加告诉python默认进行浮点除法

from __future__ import division

在代码的顶部。 从使用scipy,我假设你在这里使用Python 2.x.

你问如何测试上三角矩阵的奇点?

请不要计算行列式!

只需看看对角线元素。 哪些是零? 有零吗?

有效数值奇点怎么样? 将最小绝对值与绝对值中的最大值进行比较。 如果该比率小于eps的数量级,则实际上是单数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM