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中使用了Thomas算法的代码。但是当Python给出结果时
[ 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给出
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中,我从键盘中获取子和主对角线条目。
答案 0 :(得分:3)
在Python代码中,尝试将from __future__ import division
放在顶部。我怀疑你正在进行整数除法。