Python 和 Fortran 语言中的托马斯算法

发布于 2024-12-25 02:24:50 字数 2348 浏览 0 评论 0原文

Python 代码:

import math
import numpy
n = input('Enter the dimension')
print 'Matrix size',n    
dd = [
     0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
    10,11,12,13,14,15,16,17,18,19,
    20,21,22,23,24,25,26,27,28,29,
    30,31,
    ]
k,l,m = input ("enter vectors")
aa=[]
bb=[]
cc=[]
for i in range(n+1):
    bb.append(l)
for i in range(n):
    aa.append(k)
    cc.append(m)
a = numpy.array(aa)
b = numpy.array(bb)
c = numpy.array(cc)
d = numpy.array(dd)
c[0] = c[0]/ b[0]
d[0] = d[0]/ b[0]
for i in range(1,n,1):
    c[i] = c[i]/(b[i] - a[i] * c[i-1])
for i in range(1,n,1):
     d[i] = (d[i] - a[i] * d[i-1])/(b[i] - a[i] * c[i-1])
d[-1] = (d[-1] - a[-1] * d[-2])/( b[-1] - a[-1] * c[-2])
x = numpy.zeros(n)
x[-1] = d[-1]
for i in range(-2, -n, -1):
   x[i] = d[i] - c[i] * x[i + 1]
print x

Fortran 代码:

integer,parameter::dp=selected_real_kind(15)
integer,intent(in)::n
real(dp),dimension(n),intent(in)::a,b,c,d
real(dp),dimension(n),intent(out)::x
integer::i
real(dp),dimension(n)::c_k,d_k
c_k(1)=c(1)/b(1)
d_k(1)=d(1)/b(1)
do i=2,n-1
c_k(i)=c(i)/(b(i)-c_k(i-1)*a(i))
end do
do i=2,n
d_k(i)=(d(i)-d_k(i-1)*a(i))/(b(i)-c_k(i-1)*a(i))
end do
x(n)=d_k(n)
do i=n-1,1,-1
x(i)=d_k(i)-c_k(i)*x(i+1)
end do
end subroutine thomas_algorithm

我分别有 Python 和 Fortran 中托马斯算法的这些代码。但是当Python给出x的结果时

[  0.   1.   1.   1.   2.   2.   2.   3.   3.   3.   4.   4.   4.   5.   5.
   5.   6.   6.   6.   7.   7.   7.   8.   8.   8.   9.   9.   9.  10.  10.
  10.]

,Fortran给出

1 4.996003610813204E-016
2 0.999999999999999
3 1.554312234475219E-015
4 2.00000000000000
5 2.664535259100376E-015
6 3.00000000000000
7 4.440892098500626E-015
8 3.99999999999999
9 6.217248937900877E-015
10 4.99999999999999
11 7.105427357601002E-015
12 5.99999999999999
13 8.881784197001252E-015
14 6.99999999999999
15 1.065814103640150E-014
16 7.99999999999999
17 1.243449787580175E-014
18 6.99999999999999
19 1.421085471520200E-014
20 5.99999999999998
21 1.509903313490213E-014
22 4.99999999999999
23 1.287858708565182E-014
24 3.99999999999999
25 1.021405182655144E-014
26 2.99999999999999
27 7.993605777301127E-015
28 1.99999999999999
29 4.884981308350689E-015
30 0.999999999999997
31 1.613292832658430E-015

这种差异的原因是什么?

注意:在Python中,我从键盘获取子对角线和主对角线条目。

Python code:

import math
import numpy
n = input('Enter the dimension')
print 'Matrix size',n    
dd = [
     0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
    10,11,12,13,14,15,16,17,18,19,
    20,21,22,23,24,25,26,27,28,29,
    30,31,
    ]
k,l,m = input ("enter vectors")
aa=[]
bb=[]
cc=[]
for i in range(n+1):
    bb.append(l)
for i in range(n):
    aa.append(k)
    cc.append(m)
a = numpy.array(aa)
b = numpy.array(bb)
c = numpy.array(cc)
d = numpy.array(dd)
c[0] = c[0]/ b[0]
d[0] = d[0]/ b[0]
for i in range(1,n,1):
    c[i] = c[i]/(b[i] - a[i] * c[i-1])
for i in range(1,n,1):
     d[i] = (d[i] - a[i] * d[i-1])/(b[i] - a[i] * c[i-1])
d[-1] = (d[-1] - a[-1] * d[-2])/( b[-1] - a[-1] * c[-2])
x = numpy.zeros(n)
x[-1] = d[-1]
for i in range(-2, -n, -1):
   x[i] = d[i] - c[i] * x[i + 1]
print x

Fortran code:

integer,parameter::dp=selected_real_kind(15)
integer,intent(in)::n
real(dp),dimension(n),intent(in)::a,b,c,d
real(dp),dimension(n),intent(out)::x
integer::i
real(dp),dimension(n)::c_k,d_k
c_k(1)=c(1)/b(1)
d_k(1)=d(1)/b(1)
do i=2,n-1
c_k(i)=c(i)/(b(i)-c_k(i-1)*a(i))
end do
do i=2,n
d_k(i)=(d(i)-d_k(i-1)*a(i))/(b(i)-c_k(i-1)*a(i))
end do
x(n)=d_k(n)
do i=n-1,1,-1
x(i)=d_k(i)-c_k(i)*x(i+1)
end do
end subroutine thomas_algorithm

I have these codes for the Thomas Algorithm in Python and Fortran respectively. But when Python gives the result

[  0.   1.   1.   1.   2.   2.   2.   3.   3.   3.   4.   4.   4.   5.   5.
   5.   6.   6.   6.   7.   7.   7.   8.   8.   8.   9.   9.   9.  10.  10.
  10.]

for x, Fortran gives

1 4.996003610813204E-016
2 0.999999999999999
3 1.554312234475219E-015
4 2.00000000000000
5 2.664535259100376E-015
6 3.00000000000000
7 4.440892098500626E-015
8 3.99999999999999
9 6.217248937900877E-015
10 4.99999999999999
11 7.105427357601002E-015
12 5.99999999999999
13 8.881784197001252E-015
14 6.99999999999999
15 1.065814103640150E-014
16 7.99999999999999
17 1.243449787580175E-014
18 6.99999999999999
19 1.421085471520200E-014
20 5.99999999999998
21 1.509903313490213E-014
22 4.99999999999999
23 1.287858708565182E-014
24 3.99999999999999
25 1.021405182655144E-014
26 2.99999999999999
27 7.993605777301127E-015
28 1.99999999999999
29 4.884981308350689E-015
30 0.999999999999997
31 1.613292832658430E-015

What is the reason of this difference?

Note : in Python I am taking sub and main diagonal entries from keyboard.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

野味少女 2025-01-01 02:24:50

在你的 Python 代码中,尝试将 from __future__ import div 放在顶部。我怀疑你目前正在进行整数除法。

In your Python code try putting from __future__ import division at the top. I suspect you are currently getting integer division.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文