高斯列主元消去法
import numpy
as np
size
= int(input())
a
= []
b
= []
for i
in range(size
):
a
.append
(list())
for j
in range(size
):
a
[i
].append
(int(input()))
b
.append
(int(input()))
for k
in range(size
):
c
= list(zip(a
, b
))
c
.sort
(key
=lambda x
: x
[0], reverse
=True)
a
, b
= zip(*c
)
a
= list(a
)
b
= list(b
)
for i
in range(k
+ 1, size
):
tmp
= a
[i
][k
]
for j
in range(size
):
a
[i
][j
] = a
[i
][j
] - tmp
/a
[k
][k
]*a
[k
][j
]
b
[i
] = b
[i
] - tmp
/a
[k
][k
]*b
[k
]
a
= np
.array
(a
)
b
= np
.array
(b
)
for k
in range(size
- 1, -1, -1):
tmp
= b
[k
]
b
[k
] = 0
b
[k
] = (tmp
- sum(a
[k
]*b
))/a
[k
][k
]
print(b
)
雅可比迭代法
import numpy
as np
size
= int(input())
a
= []
b
= []
for i
in range(size
):
a
.append
(list())
for j
in range(size
):
a
[i
].append
(float(input()))
b
.append
(float(input()))
times
= 0
a
= np
.array
(a
)
b
= np
.array
(b
)
D
= np
.eye
(size
)*a
U
= np
.triu
(a
) - D
L
= (np
.triu
(a
.T
) - D
).T
x
= np
.zeros
(size
)
while True:
times
+= 1
tmp
= x
x
= (np
.eye
(size
) - np
.linalg
.inv
(D
)@a
)@x
+ np
.linalg
.inv
(D
)@b
if max(abs(tmp
- x
)) < 0.001:
break
print("{}\n".format(x
))
print(x
)
print(times
)
高斯赛德尔迭代法
import numpy
as np
size
= int(input())
a
= []
b
= []
for i
in range(size
):
a
.append
(list())
for j
in range(size
):
a
[i
].append
(float(input()))
b
.append
(float(input()))
times
= 0
a
= np
.array
(a
)
b
= np
.array
(b
)
D
= np
.eye
(size
)*a
U
= np
.triu
(a
) - D
L
= (np
.triu
(a
.T
) - D
).T
x
= np
.zeros
(size
)
while True:
times
+= 1
tmp
= x
x
= -np
.linalg
.inv
(D
+ L
)@U@x
+ np
.linalg
.inv
(D
+ L
)@b
if max(abs(tmp
- x
)) < 0.001:
break
print("{}\n".format(x
))
print(x
)
print(times
)
超松驰迭代法
import numpy
as np
A
= np
.array
([[10, -2, -1], [-2, 10, -1], [-1, -2, 5]])
b
= np
.array
([[3], [15], [10]])
omega_list
= [1 + 0.005 * i
for i
in range(100)]
length
= len(A
)
count
= []
tmp
= 0
x_new
= 0
for omega
in omega_list
:
times
= 0
x_0
= np
.zeros
((length
, 1))
while True:
x_hold
= x_0
.copy
()
x_new
= x_0
.copy
()
for i
in range(length
):
x_new
[i
][0] = x_0
[i
][0] + omega
* (b
[i
][0] - sum([A
[i
][j
] * x_new
[j
][0] for j
in range(i
)]) - sum(
[A
[i
][j
] * x_0
[j
][0] for j
in range(i
, length
)])) / A
[i
][i
]
tmp
= x_0
x_0
= x_new
.copy
()
times
+= 1
if max(abs(tmp
- x_new
)) < 0.001:
break
count
.append
(times
)
print(x_new
)
print(count
)
print()
最后说一句,python真香。-_-
转载请注明原文地址:https://blackberry.8miu.com/read-40506.html