计算方法0

高斯列主元消去法

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)

# 示例
# 1 2 3 14
# 2 5 2 18
# 3 1 5 20
# 1 2 3

雅可比迭代法

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)

# 示例
# 10 -2 -1 3
# -2 10 -1 15
# -1 -2 5 10
# 1 2 3

高斯赛德尔迭代法

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)

# 示例
# 10 -2 -1 3
# -2 10 -1 15
# -1 -2 5 10
# 1 2 3

超松驰迭代法

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真香。-_-

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值